数学建模运筹学.docx
《数学建模运筹学.docx》由会员分享,可在线阅读,更多相关《数学建模运筹学.docx(22页珍藏版)》请在冰豆网上搜索。
数学建模运筹学
最优化建模和计算
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(imodel:
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
[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!
]