文件分配存储问题 数学建模.docx
《文件分配存储问题 数学建模.docx》由会员分享,可在线阅读,更多相关《文件分配存储问题 数学建模.docx(19页珍藏版)》请在冰豆网上搜索。
文件分配存储问题数学建模
题目:
文件分配存储问题
摘要
本文对于文件分配存储的问题,将文件保存的问题转化为最优规划的数学模型,并利用LINGO软件对所建立的模型进行求解,解决了在使用最少软盘存储所有的文件的难题。
模型一中的规划问题的三要素具体到本文中是:
决策变量为“某文件是否存在某张软盘上”;目标函数取“软盘的存储属性
(取值1或0,表示软盘上是否存了文件)的编号之和”;约束条件包括“文件与软盘的唯一对应关系”和“软盘容量大小的限制——同一软盘内文件的大小总和不超过软盘容量的限制”。
首先将文件从1到16进行编号,并假定有十六张软盘(也对其进行1~16编号),每个文件可以任意选择每个软盘。
列出目标函数
,在约束条件下,用LINGO软件求解。
软盘编号
占用容量(kb)
分配方案
第1张软盘
1411
46,62,137,372,388,406
第2张软盘
1463
55,87,108,164,253,364,432
第3张软盘
1426
114,461,851
求解可得最少需要3张软盘,这是最优解其中一组解(由于LINGO软件的局限,模型一只得到这一组结果)。
接下来分别用两种方法对模型进行检验:
首先采用原始数据对模型进行检验;接下来再改变软盘的限制容量,对模型的正确性和普遍性进行评估。
模型通过检验,数据证明模型一具有很高的正确性和很好的普遍性。
由于LINGO软件只能得出一组最优解结果,而实际存在多种满足最少耗用软盘数量的分配方案。
因此,建立模型二用逆序法求出满足题中条件是,最小耗用软盘的数仍为3,进一步检验了模型一的准确性。
关键词0-1规划文件存储目标函数约束条件模型检验逆序法
1.问题提出
1.1问题背景
软盘(FloppyDisk)是个人计算机(PC)中最早使用的可移介质。
软盘的读写是通过软盘驱动器完成的。
软盘驱动器设计能接收可移动式软盘,目前常用的就是容量为1.44MB的3.5英寸软盘。
一个1.44M的软盘,它有80个磁道,每个磁道有18个扇区,每个扇区存储512个字节,两面都可以存储数据,容量计算为计算它的容量:
80×18×2×512≈1474KB≈1.44M。
文件的大小用字节表示,但在存储的时候却是以簇为分配单元,即一个簇中不能包含两个文件的内容,也就是说无论一个文件有多小,哪怕它只有一个字节,一旦它占用了一个簇,那么别的文件就不能再写入这个簇了,也就是说这个簇中其它还未用上的空间就被浪费了,这样一般文件占用的存储空间都会比实际大小要大。
1.2问题重述
现需将一些最重要的文件备份到软盘上。
每个空白软盘的容量是1.44MB,需要备份的16个文件的大小分别为:
46KB,55KB,62KB,87KB,108KB,114KB,137KB,164KB,253KB,364KB,372KB,388KB,406KB,432KB,461KB,851KB。
假定无法使用压缩软件,但软盘数量足够多。
现请建立模型,在使用最少软盘的同时将所有的文件都储存进去。
2.问题分析
在本文中,需要解决的问题是如何合理设计文件分配存储方案,使得所用软盘数量最少。
显然,该问题属于优化类问题,可将分配的软盘数量通过0-1变量转化为目标函数,将软盘容量限制转化为约束条件,从而用数学的语言将原问题转化为线性规划问题,从而得出最少好用的软盘数量。
在实际求解过程中,考虑到LINGO软件只能给出一组最优解,而实际存在多种满足最少耗用软盘数量的分配方案。
因此,可再用其它方法求出满足最小耗用软盘数的另外的解。
为在分析结果时更简便,先给文件编号,如下表:
文件名
1
2
3
4
5
6
7
8
对应文件(kb)
46
55
62
87
108
114
137
164
文件名
9
10
11
12
13
14
15
16
对应文件(kb)
253
364
372
388
406
432
461
851
表1:
文件编号表
3.模型的假设与符号说明
3.1模型假设
(1)任何文件不可分割,是一个整体;
(2)任意两个或两个以上文件都可以存放在一张软盘中;
(3)文件之间没有重叠,都需要完整保存,且文件存储相互不影响;
(4)软盘都是合格的,且所标大小为净存储容量,本体为1.44MB;
(5)每个文件的大小和储存后的大小都不超过软盘的容量;
(6)文件的大小和占用的软盘空间大小都相同,即不考虑系统文件所占软盘的空间;
(7)软盘在存储前已经进行了格式化操作;
(8)所有软盘性能完好。
3.2符号说明
符号
含义
文件个数
分配文件所需的软盘的数目
软盘的空间大小
第几个文件的大小
文件储存标记变量
软盘储存标记变量
目标函数
正无穷大
4.模型一的建立与求解
4.1建立基于0-1变量的线性规划模型
4.1.1约束条件分析
1)若第
个文件放在第
个软盘中记为
,其余不储存文件
的软盘记为
,可得约束条件:
(1)
2)由于软盘空间大小固定,可知加入软盘文件的大小不能超过软盘空间大小,即得约束条件:
(2)
3)由假设可知任何文件都是一个整体,不可分割;若分割的话会与实际操作相违背,造成文件寻找困难且不能保证文件的整体性。
故每个文件必须且只能分配在一个软盘中,得约束条件:
(3)
4)若有文件放在软盘j中时,该软盘则被占用,表示为:
(4)
4.1.2目标函数的确立
本模型的目标为:
使得所用软盘数最少,于是有目标函数:
(5)
可得模型一:
(6)
4.2模型一的求解
4.2.1约束条件处理与转换
为了便于使用LINGO软件进行求解,对约束条件(4):
进行转化,已设
为0-1变量,引入正无穷大
则上式转化为:
(7)
并增加约束条件
,可用LINGO软件求解。
4.2.2模型一的求解
对于模型一,用LINGO软件求解(具体程序见相关附件一),可得结果,如下表:
文件编号
软
盘
号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
1
1
1
1
1
1
2
1
1
1
1
1
1
1
3
4
5
6
7
8
9
10
11
12
13
14
15
1
1
1
16
表2:
求解结果(1表示有存储关系)
得到最少耗用3张软盘,LINGO给出的最优解为:
软盘编号
占用容量(kb)
分配方案
第1张软盘
1411
46,62,137,372,388,406
第2张软盘
1463
55,87,108,164,253,364,432
第3张软盘
1426
114,461,851
表3:
模型一结果
4.3模型检验
4.3.1用原始数据检验
对于原始数据进行理论分析:
总的文件大小和为:
4300kb
需要的软盘数量为:
4300/(1.44*1024)=2.92;即至少需要3张软盘
求解模型一:
“需要软盘数量”:
3张
“每张软盘的占用空间”:
1411kb<1474kb
1463kb<1474kb
1426kb<1474kb
所以,结论完全正确,符合检验,模型合理。
4.3.2改变软盘容量大小进行检测
在模型中改变每个软盘的限制容量,使其分别为1000kb、1200kb、1800kb、2200kb,分别进行检验,统计数据如表4:
容量kb
所需软盘数
每张软盘中所有文件大小之和是否超过容量
理论范围
模型所得
1000
>=5
5
否
1200
>=4
4
否
1800
>=3
3
否
2200
>=2
2
否
表4:
不同容量软盘模型检验结果
由表4的数据,可以得出以下结论:
模型一在这几次试验中求得的结果是完全正确的,上述所求的的结果是最优解的一种情况。
进一步模型通过检验。
5.模型二的建立与求解
5.1模型二的建立
假设软盘的空间就是1.44MB。
从第一个软盘开始,每一个文件或者被放入,或者不被放入,只有两种选择。
如上述,我们考虑逆序的方法,即把最大的文件放入第一个软盘中,若软盘不满,再放入余下最大的,若软盘不满,以此类推,若软盘已满,则放入下一个软盘……在上述讨论的基础上,我们可以知道所需的软盘总数目可能是
个,也有可能是4个,也有可能是更多。
现采用逆序的方案来进行求解:
首先在第一个软盘中选取16个文件中最大的文件:
851KB,再选取剩下的15个文件中最大的文件:
461KB,此时软盘剩余的空间为165.56KB,故只能在剩余的文件中选取文件大小137KB的文件了,共计1449KB,第一个软盘剩余空间为25.56KB;用同样的方法可以得第二个软盘中放入的文件大小为432KB,406KB,88KB,164KB,62KB的文件,共计1452KB;在第三个软盘中放入372KB,364KB,253KB,114KB,108KB,87KB,55KB,46KB,共计1399KB。
使用软盘数最少为3个。
上述建立了逆序法的模型求解题中所给文件分配问题,还可以运用C语言求得结果(程序见附录三)。
5.2模型二的求解
采用逆序法运用C语言编程算出的最佳组合如下表所示:
软盘编号
剩余空间(KB)
所装文件(KB)
第1张软盘
25
851、461、137
第2张软盘
22
432、406、388、164、62
第3张软盘
75
372、364、253、114、108、87、55、46
可知,逆序法求出的软盘数同样为:
3。
进一步模型二与模型一互相验证模型的正确性。
6.模型评价
6.1模型优缺点分析
6.1.1模型优点
(1)模型一建立的基于0-1变量的线性规划模型,直观明了,把实际问题程序化,方便使用计算机直接操作;模型二采用逆序法进行求解,使得程序简洁,编程量大大减少。
(2)本文运用多种方法建立数学模型,使用了各种可靠的科学的建模方法对题中所给问题进行求解,可以互相进行对比,互补优缺点。
6.1.2模型缺点
(1)模型一效率偏低,迭代次数过多。
(2)逆序法这一思想方法还确实足够的理论依据,带有一定的主观性。
6.2模型推广
本文采用的是0-1规划法,可综合考虑各种因素,能得到准确的解,且可解一般性问题。
对于数据量较大时,可以很好的利用软件求解。
虽然本题解决的是一个特定的问题,但是该法可以推广到类似的问题中。
可以把其中的权看成费用或者时间的消耗等,进而得出最优解。
0-1变量可以数量化地描述诸如开与关、取与弃、有与无等现象所放映的离散变量间的逻辑关系、顺序关系以及互斥的约束条件,因此0-1规划非常适合描述和解决如线路设计、工厂选址、生产计划安排、旅游购物、背包问题、人员安排、代码选取、可靠性等人们所关心的各种问题。
实际上,凡是有界变量的整体规划都可以转化为0-1规划来处理。
7.参考文献
【1】姜启源,谢金星,叶俊.数学建模.第三版.北京:
高等教育出版社,2003年.
【2】谢金星,薛毅,优化建模与LINGO/LINDO软件,北京:
清华大学出版社,2004年.
【3】谭浩强.C语言程序设计.北京:
清华大学出版社,2005年.
【4】刘任任.算法设计与分析.武汉:
武汉理工大学出版社,2003年.
8.附录
附录1:
LINGO软件解模型一程序
model:
sets:
wenjian/1..16/:
c;
ruanpan/1..16/:
d,y,k;
links(wenjian,ruanpan):
x;
endsets
data:
c=46556287108114137164253364372388406432461851;
d=12345678910111213141516;
enddata
min=@sum(ruanpan(j):
y(j));
@for(ruanpan(j):
@bin(y(j)));
@for(links:
@bin(x));
@for(ruanpan(j):
@sum(wenjian(i):
x(i,j)*c(i))<=1474);
@for(ruanpan(j):
k(j)=(@sum(wenjian(i):
x(i,j)*c(i))));
y
(1)>=y
(2);
y
(2)>=y(3);
y(3)>=y(4);
y(4)>=y(5);
y(5)>=y(6);
y(6)>=y(7);
y(7)>=y(8);
y(8)>=y(9);
y(9)>=y(10);
y(10)>=y(11);
y(11)>=y(12);
y(12)>=y(13);
y(13)>=y(14);
y(14)>=y(5);
y(15)>=y(16);
@for(ruanpan(j):
@sum(wenjian(i):
x(i,j))>-(1-y(j))*10000);
@for(ruanpan(j):
@sum(wenjian(i):
x(i,j))<=y(j)*10000);
@for(wenjian(i):
@sum(ruanpan(j):
x(i,j))=1);
LINGO程序求解部分结果:
Globaloptimalsolutionfound.
Objectivevalue:
3.000000
Objectivebound:
3.000000
Infeasibilities:
0.000000
Extendedsolversteps:
0
Totalsolveriterations:
1882
VariableValueReducedCost
Y
(1)1.0000001.000000
Y
(2)1.0000001.000000
Y(15)1.0000001.000000
K
(1)1411.0000.000000
K
(2)1463.0000.000000
K(15)1426.0000.000000
X(1,1)1.0000000.000000
X(2,2)1.0000000.000000
X(3,1)1.0000000.000000
X(4,2)1.0000000.000000
X(5,2)1.0000000.000000
X(6,15)1.0000000.000000
X(7,1)1.0000000.000000
X(8,2)1.0000000.000000
X(9,2)1.0000000.000000
X(10,2)1.0000000.000000
X(11,1)1.0000000.000000
X(12,1)1.0000000.000000
X(13,1)1.0000000.000000
X(14,2)1.0000000.000000
X(15,15)1.0000000.000000
X(16,15)1.0000000.000000
附录2:
改变软盘容量时LINGO软件运行结果
容量为1000kb时:
Globaloptimalsolutionfound.
Objectivevalue:
5.000000
Objectivebound:
5.000000
Infeasibilities:
0.000000
Extendedsolversteps:
3
Totalsolveriterations:
3208
容量为1200kb时:
Globaloptimalsolutionfound.
Objectivevalue:
4.000000
Objectivebound:
4.000000
Infeasibilities:
0.000000
Extendedsolversteps:
0
Totalsolveriterations:
2128
容量为1800kb时:
Globaloptimalsolutionfound.
Objectivevalue:
3.000000
Objectivebound:
3.000000
Infeasibilities:
0.000000
Extendedsolversteps:
0
Totalsolveriterations:
756
容量为2200kb时:
Globaloptimalsolutionfound.
Objectivevalue:
2.000000
Objectivebound:
2.000000
Infeasibilities:
0.000000
Extendedsolversteps:
3
Totalsolveriterations:
1176
附录3:
逆序法c语言程序
#include
ConstintMaxSize=1474;
constMax=16;
structnode
{
doubleSize;
charFlagUsed;
charFlagOutput;
};
structnodea[11];
doublecount=0;
intnum=0;
voidreadin()
{
inti;
printf("请输入文件大小,中间用空格将其隔开:
\n");
for(i=0;i{
scanf("%lf",&a[i].Size);
a[i].FlagUsed='F';
a[i].FlagOutput='F';
}
}
voidsort()
{
inti,j;
structnodetemp;
for(i=0;ifor(j=i+1;j{
if(a[i].Size{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
voidoutput()
{
inti;
intsum=0;
intn;
num++;
printf("the%ddiskhasfowllowingfiles:
\n",num);
for(i=0;i{
if('F'==a[i].FlagOutput&&'T'==a[i].FlagUsed)
{
printf("%.0lf\n",a[i].Size);
a[i].FlagOutput='T';
sum+=a[i].Size;
}
}
printf("该软盘所装总量为%d\n",sum);
}
voidfun()
{
intn=0;
while(n{
inti=0;
while(i{
if(('F'==a[i].FlagUsed)&&(count+a[i].Size{
n++;
count+=a[i].Size;
a[i].FlagUsed='T';
}
i++;
}
if(n>=Max||i>=Max||count>=MaxSize)
{
count=0;
output();
}
}
}
intmain(void)
{
readin();
sort();
fun();
printf("所需软盘数为%d\n",num);
return0;
}
程序运行结果截图: