数学建模运筹学.docx

上传人:b****6 文档编号:4449899 上传时间:2022-12-01 格式:DOCX 页数:22 大小:135.03KB
下载 相关 举报
数学建模运筹学.docx_第1页
第1页 / 共22页
数学建模运筹学.docx_第2页
第2页 / 共22页
数学建模运筹学.docx_第3页
第3页 / 共22页
数学建模运筹学.docx_第4页
第4页 / 共22页
数学建模运筹学.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数学建模运筹学.docx

《数学建模运筹学.docx》由会员分享,可在线阅读,更多相关《数学建模运筹学.docx(22页珍藏版)》请在冰豆网上搜索。

数学建模运筹学.docx

数学建模运筹学

最优化建模和计算

1、Lindo和Lingo基本程序

生产100套钢架,长2.9、2.1、1.5米各1根/套,原料长7.4米,如何下料?

下料的所有方案

 

1

2

3

4

5

6

7

8

2.9

2

1

1

1

0

0

0

0

2.1

0

2

1

0

3

2

1

0

1.5

1

0

1

3

0

2

3

4

料头

0.1

0.3

0.9

0

1.1

0.2

0.8

1.4

给出下料问题的计算程序:

Lindo程序:

!

min0.1x1+0.3x2+0.9x3+0x4+1.1x5+0.2x6+0.8x7+1.4x8

min1x1+1x2+1x3+1x4+1x5+1x6+1x7+1x8

subjectto

2x1+1x2+1x3+1x4+0x5+0x6+0x7+0x8>100

0x1+2x2+1x3+0x4+3x5+2x6+1x7+0x8>100

1x1+0x2+1x3+3x4+0x5+2x6+3x7+4x8>100

end

ginx1

ginx2

ginx3

ginx4

ginx5

ginx6

ginx7

ginx8

Lingo程序:

model:

sets:

E/1..8/:

c,x;

F/1..3/:

b;

link(F,E):

a;

endsets

min=@sum(E(j):

c(j)*x(j));

@for(F(i):

@sum(E(j):

a(i,j)*x(j))>100);

@for(E(j):

x(j)>0);

@for(E(j):

@gin(x));

data:

!

c=0.1,0.3,0.9,0,1.1,0.2,0.8,1.4;

c=1,1,1,1,1,1,1,1;

a=2,1,1,1,0,0,0,0,

0,2,1,0,3,2,1,0,

1,0,1,3,0,2,3,4;

enddata

end

2、建模和编程练习

1五年期投资计划:

五年内有4个投资项目,情况是:

(1)1至4年,每年年初投资,次年末回收本利115%;

(2)第3年初投资,第5年末回收本利125%(最大投资额不超过4万元);

(3)第2年初投资,第5年末回收本利140%(最大投资额不超过3万元);

(4)每年年初投资,年末回收本利106%。

给你10万,给出投资计划。

请分析投资规律。

项目

1

2

3

4

5

5年末

1

x11

x21

x31

x41

 

 1.15x41

2

 

 

x32<4

 

 

 1.25x32

3

 

x23<3

 

 

 

 1.40x23

4

x14

x24

x34

x44

x54

 1.06x54

 

 10

 1.06x14

 1.15x11+

1.06x24

 1.15x21+

1.06x34

 1.15x31+

1.06x44

 

max4x1+10x2+3x3-2x4

subjectto

2x1+3x2<16

3x1+4x2<24

2x2-x3-x4=0

x3<5

end

ginx1

ginx2

ginx3

ginx4

2某钻井队从10个可供选择的井位中确定5个钻井探油,使总费用最小。

10个井位S1到S10相应的钻探费为:

4,6,7,3,4,5,7,3,5,6。

且满足:

(1)或选择S1和S7,或选择S8;

(2)选择了S3或S4,就不能选择S5;或反过来也一样;

(3)在S5、S6、S7、S8中最多只能选两个。

 

model:

data:

N=10;

!

N>=10;

enddata

sets:

A/1..N/:

c,x;

endsets

min=@sum(A(i):

c(i)*x(i));

@sum(A(i):

x(i))=5;

x

(1)=x(7);

x

(1)+x(8)>=1;

x(3)+x(5)<=1;

x(4)+x(5)<=1;

x(5)+x(6)+x(7)+x(8)<=2;

@for(A:

@bin(x));

data:

c=4673457356;

enddata

end

3分配问题(指派问题,AssignmentProblem)

这是个给n个人分配n项工作以获得某个最高总效果的问题。

第i个人完成第j项工作需要平均时间

要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。

该问题可表示如下:

现在7个将被分配去做7项工作,他们的工作时间如下表:

j1j2j3j4j5j6j7

w16267425

w24953858

w35219743

w47673927

w52395726

w655228114

w7923124510;

问如何分配工作,使得完成所有工作时所花费的时间总和最少?

model:

!

3个工人,3个工作的分配问题;

sets:

workers/w1..w3/;

jobs/j1..j3/;

links(workers,jobs):

cost,volume;

endsets

min=@sum(links:

cost*volume);

@for(workers(I):

@sum(jobs(J):

volume(I,J))=1);

@for(jobs(J):

@sum(workers(I):

volume(I,J))=1);

@for(links:

@bin(volume));

data:

cost=626

495

521;

enddata

end

 

model:

!

7个工人,7个工作的分配问题;

sets:

workers/w1..w7/;

jobs/j1..j7/;

links(workers,jobs):

cost,volume;

endsets

min=@sum(links:

cost*volume);

@for(workers(I):

@sum(jobs(J):

volume(I,J))=1);

@for(jobs(J):

@sum(workers(I):

volume(I,J))=1);

data:

cost=6267425

4953858

5219743

7673927

2395726

55228114

923124510;

enddata

end

4(加工问题)有m台机床,n种零件在机床加工,工时为a1,a2,…,an。

问如何分配使各机床的总加工任务尽可能均衡。

,工时为

为例进行计算。

model:

sets:

parts/1..6/:

a;

machines/1..4/;

links(machines,parts):

x;

endsets

min=x1;

@for(machines(I):

@sum(parts(J):

a(J)*x(I,J))<=x1);

@for(parts(J):

@sum(machines(I):

x(I,J))=1);

@for(links:

@bin(x));

data:

a=6104783;

enddata

end

5有4名同学到一家公司参加三个阶段的面试:

公司要求每个同学都必须首先找公司秘书初试,然后到部门主管处复试,最后到经理处参加面试,并且不允许插队(即在任何一个阶段4名同学的顺序是一样的)。

由于4名同学的专业背景不同,所以每人在三个阶段的面试时间也不同,如下表所示(单位:

分钟):

 

秘书初试

主管复试

经理面试

同学甲

13

15

20

同学乙

10

20

18

同学丙

20

16

10

同学丁

8

10

15

 

 

 

 

 

 

这4名同学约定他们全部面试完以后一起离开公司。

假定现在时间是早晨8:

00,问他们最早何时能离开公司?

(建立规划模型求解)

本问题是一个排列排序问题。

对于阶段数不小于3的问题没有有效算法,也就是说对于学生数稍多一点儿(比如20)的情况是无法精确求解的。

为此人们找到了很多近似算法。

这里我们建立的规划模型可以实现该问题的精确求解,但你会看到它的变量和约束是学生数的平方。

因此,当学生数稍多一点儿规划模型的规模将很大,求解会花费很长时间。

 

!

三阶段面试模型;

model:

sets:

students;!

学生集三阶段面试模型;

phases;!

阶段集;

sp(students,phases):

t,x;!

t面试时所花费时间,x面试前所花费时间;

ss(students,students)|&1#LT#&2:

y;

endsets

data:

students=s1..s4;

phases=p1..p3;

t=

131520

102018

201610

81015;

enddata

ns=@size(students);!

学生数;

np=@size(phases);!

阶段数;

 

!

单个学生面试时间先后次序的约束;

@for(sp(I,J)|J#LT#np:

x(I,J)+t(I,J)<=x(I,J+1)

);

!

学生间的面试先后次序保持不变的约束;

@for(ss(I,K):

@for(phases(J):

x(I,J)+t(I,J)-x(K,J)<=200*y(I,K);

x(K,J)+t(K,J)-x(I,J)<=200*(1-y(I,K));

);

!

目标函数;

min=TMAX;

@for(students(I):

x(I,3)+t(I,3)<=TMAX

);

!

把Y定义0-1变量;

@for(ss:

@bin(y));

end

6最短路问题给定N个点

组成集合

,由集合中任一点

到另一点

的距离用

表示,如果

没有弧联结,则规定

,又规定

,指定一个终点

,要求从

点出发到

的最短路线。

这里我们用动态规划方法来做。

用所在的点

表示状态,决策集合就是除

以外的点,选定一个点

以后,得到效益

并转入新状态

,当状态是

时,过程停止。

显然这是一个不定期多阶段决策过程。

定义

是由

点出发至终点

的最短路程,由最优化原理可得

这是一个函数方程,用LINGO可以方便的解决。

现在10个城市,路线连接如下:

9

31

 

65

6

98

77

75

55

49

11

10

 

!

最短路问题;

model:

data:

n=10;

enddata

sets:

cities/1..n/:

F;!

10个城市;

roads(cities,cities)/

1,21,3

2,42,52,6

3,43,53,6

4,74,8

5,75,85,9

6,86,9

7,10

8,10

9,10

/:

D,P;

endsets

data:

D=

65

369

7511

91

875

410

5

7

9;

enddata

F(n)=0;

@for(cities(i)|i#lt#n:

F(i)=@min(roads(i,j):

D(i,j)+F(j));

);

!

显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i-->j,否则就不是。

由此,我们就可方便的确定出最短路径;

@for(roads(i,j):

P(i,j)=@if(F(i)#eq#D(i,j)+F(j),1,0)

);

end

7旅行售货员问题(又称货郎担问题,TravelingSalesmanProblem)

有一个推销员,从城市1出发,要遍访城市2,3,…,n各一次,最后返回城市1。

已知从城市i到j的旅费为

,问他应按怎样的次序访问这些城市,使得总旅费最少?

在下述意义下,引入一些0-1整数变量:

其目标只是使

为最小。

这里有两个明显的必须满足的条件:

访问城市i后必须要有一个即将访问的确切城市;访问城市j前必须要有一个刚刚访问过的确切城市。

用下面的两组约束分别实现上面的两个条件。

到此我们得到了一个模型,它是一个指派问题的整数规划模型。

但以上两个条件对于TSP来说并不充分,仅仅是必要条件。

例如:

 

 

 

 

 

 

以上两个条件都满足,但它显然不是TSP的解,它存在两个子巡回。

下面介绍一种避免产生子巡回的方法。

把额外变量

附加到问题中。

得到约束条件

为了证明该约束条件有预期的效果,必须证明:

(1)任何含子巡回的路线都不满足该约束条件;

(2)全部巡回都满足该约束条件。

首先证明

(1),用反证法。

假设还存在子巡回,也就是说至少有两个子巡回。

那么至少存在一个子巡回中不含城市1。

把该子巡回记为

,则必有

把这k个式子相加,有

,矛盾!

故假设不正确,结论

(1)得证。

下面证明

(2),采用构造法。

对于任意的总巡回

,可取

访问城市i的顺序数,取值范围为

因此,

下面来证明总巡回满足该约束条件。

(ⅰ)总巡回上的边

(ⅱ)非总巡回上的边

从而结论

(2)得证。

这样我们把TSP转化成了一个混合整数线性规划问题。

!

旅行售货员问题;

model:

sets:

city/1..5/:

u;

link(city,city):

dist,!

距离矩阵;

x;

endsets

n=@size(city);

data:

!

距离矩阵,它并不需要是对称的;

dist=@qrand

(1);!

随机产生,这里可改为你要解决的问题的数据;

enddata

!

目标函数;

min=@sum(link:

dist*x);

 

@FOR(city(K):

!

进入城市K;

@sum(city(I)|I#ne#K:

x(I,K))=1;

 

!

离开城市K;

@sum(city(J)|J#ne#K:

x(K,J))=1;

);

 

!

保证不出现子圈;

@for(city(I)|I#gt#1:

@for(city(J)|J#gt#1#and#I#ne#J:

u(I)-u(J)+n*x(I,J)<=n-1);

);

!

限制u的范围以加速模型的求解,保证所加限制并不排除掉TSP问题的最优解;

@for(city(I)|I#gt#1:

u(I)<=n-2);

!

定义X为0\1变量;

@for(link:

@bin(x));

end

8(最大流问题)请计算以下网络的最大流。

 

C=(cij)

最大流问题数学模型

MaxZ=flow

0≤fij≤cij

∑f1j-∑fj1=flow

中间点i:

∑fij-∑fji=0

!

最大流问题;

model:

sets:

node/1..7/:

v;

link(node,node)/

1,21,31,4

2,32,52,6

3,53,6

4,34,6

5,7

6,7

/:

c,f;

endsets

data:

c=

453

245

83

412

7

9;

enddata

!

目标函数;

max=flow;

!

约束条件;

@for(node(i)|i#eq#1:

@sum(link(i,j):

f(i,j))-@sum(link(j,i):

f(j,i))=flow;

);

@for(node(i)|i#gt#1#and#i#lt#7:

@sum(link(i,j):

f(i,j))-@sum(link(j,i):

f(j,i))=0;

);

@for(link(i,j):

f(i,j)<=c(i,j));

end

9(最小费用流问题)请计算以下网络的流量为8的最小费用流(cij,wij)。

 

图1最小费用流问题的有向网络

C=(cij),W=(wij)

最大流问题数学模型

MinZ=∑wij*fij

0≤fij≤cij

∑f1j-∑fj1=8

中间点i:

∑fij-∑fji=0

!

最小费用流问题;

model:

sets:

node/1..7/:

v;

link(node,node)/

1,21,31,4

2,32,52,6

3,53,6

4,34,6

5,7

6,7

/:

c,w,f;

endsets

data:

c=

453

245

83

412

7

9;

w=

346

423

75

64

3

8;

input=?

;

enddata

!

目标函数;

max=@sum(link(i,j):

w(i,j)*f(i,j));

!

约束条件;

@for(node(i)|i#eq#1:

@sum(link(i,j):

f(i,j))-@sum(link(j,i):

f(j,i))=input;

);

@for(node(i)|i#gt#1#and#i#lt#7:

@sum(link(i,j):

f(i,j))-@sum(link(j,i):

f(j,i))=0;

);

@for(link(i,j):

f(i,j)<=c(i,j));

end

10(配对模型)某公司将8个职员安排到4个办公室,每室2人。

有些职员在一起合作好,有些则不然。

已知两两之间相容度,数字越小相容越好。

问如何组合?

1

2

3

4

5

6

7

8

1

9

3

4

2

1

5

6

2

1

7

3

5

2

1

3

4

4

2

9

2

4

1

5

5

2

5

8

7

6

6

2

3

7

4

8

MinZ=∑cij*xij(i

∑xjk=1(j=i∨k=i)(i=1,2,3,4,5,6,7,8)

xij=0∨1(i

model:

sets:

ren/1..8/;

links(ren,ren)|&2#gt#&1:

c,x;

endsets

data:

c=9342156

173521

44292

1552

876

23

4;

enddata

!

目标函数;

min=@sum(links:

c*x);

@for(links:

@bin(x));

@for(ren(i):

@sum(links(j,k)|j#eq#i#or#k#eq#i:

x(j,k))=1);

end

[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!

]

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

当前位置:首页 > 高中教育 > 英语

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

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