文件分配存储问题 数学建模.docx

上传人:b****7 文档编号:9513893 上传时间:2023-02-05 格式:DOCX 页数:19 大小:92.29KB
下载 相关 举报
文件分配存储问题 数学建模.docx_第1页
第1页 / 共19页
文件分配存储问题 数学建模.docx_第2页
第2页 / 共19页
文件分配存储问题 数学建模.docx_第3页
第3页 / 共19页
文件分配存储问题 数学建模.docx_第4页
第4页 / 共19页
文件分配存储问题 数学建模.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

文件分配存储问题 数学建模.docx

《文件分配存储问题 数学建模.docx》由会员分享,可在线阅读,更多相关《文件分配存储问题 数学建模.docx(19页珍藏版)》请在冰豆网上搜索。

文件分配存储问题 数学建模.docx

文件分配存储问题数学建模

题目:

文件分配存储问题

摘要

本文对于文件分配存储的问题,将文件保存的问题转化为最优规划的数学模型,并利用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;i

for(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;

}

程序运行结果截图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1