热度 1 ||
Lingo精选题目及答案
答题要求:将Lingo程序复制到Word文档中,并且附上最终结果。
1、简单线性规划求解
(目标函数)
s.t.(约束条件)
2、整数规划求解
3、0-1规划求解
Max
4、非线性规划求解
s.t.
5、集合综合应用
产生一个集合,(
),
求y前6个数的和S1,后6个数的和S2,第2~8个数中的最小值S3,最大值S4。
6、综合题
要求列出具体的目标函数和约束条件,然后附上Lingo程序和最终结果。
6.1 指派问题
有四个工人,要指派他们分别完成4项工作,每人做各项工作所消耗的时间如下表:
工人 | ||||
甲 | 15 | 18 | 21 | 24 |
乙 | 19 | 23 | 22 | 18 |
丙 | 26 | 17 | 16 | 19 |
丁 | 19 | 21 | 23 | 17 |
问指派哪个人去完成哪项工作,可使总的消耗时间为最小?
6.2 分配问题
某两个煤厂A1,A2每月进煤数量分别为60t和100t,联合供应3个居民区B1,B2,B3。3个居民区每月对煤的需求量依次分别为50t,70t,40t,煤厂A1离3个居民区B1,B2,B3的距离依次分别为10km,5km,6km,煤厂A2离3个居民区B1,B2,B3的距离分别为4km,8km,12km。问如何分配供煤量使得运输量(即t·km)达到最小?
1、
model:
max=4*x1+3*x2;
2*x1+x2<10;
x1+x2<8;
x2<7;
end
2、
model:
max=40*x1+90*x2;
9*x1+7*x2<56;
7*x1+20*x2<70;
@gin(x1);@gin(x2);
end
3、
model:
max=x1^2+0.4*x2+0.8*x3+1.5*x4;
3*x1+2*x2+6*x3+10*x4<10;
@bin(x1); @bin(x2);
@bin(x3); @bin(x4);
end
4、
model:
max=@abs(x1)+2*@abs(x2)+3*@abs(x3)+4*@abs(x4);
x1-x2-x3+x4=0;
x1-x2+x3-3*x4=1;
x1-x2-2*x3+3*x4=-1/2;
end
5、
model:
sets:
jihe/1..10/:y;
ss/1..4/:S;
endsets
!由于y和s中部分有负数,所以要先去掉这个约束;
@for(jihe:@free(y));
@for(ss(i):@free(S));
!产生元素;
@for(jihe(x):y(x)=x^2-5*x-50);
S(1)=@sum(jihe(i)|i#le#6:y(i));
S(2)=@sum(jihe(i)|i#ge#5:y(i));
S(3)=@min(jihe(i)|i#ge#2 #and# i#le#8:y(i));
S(4)=@max(jihe(i)|i#ge#2 #and# i#le#8:y(i));
end
6.1、
设:第i个工人做第j项工作用时,标志变量
定义如下:
s.t.
每份工作都有一人做
每人都只做一项工作
model:
sets:
work/A B C D/;
worker/jia yi bing ding/;
time(worker,work):t,f;
endsets
!目标函数可以用[obj]标志出,也可以省略;
[obj] min=@sum(time(i,j):t(i,j)*f(i,j));
data:
!可以直接复制表格,但是在最后要有分号;
t=
15 | 18 | 21 | 24 |
19 | 23 | 22 | 18 |
26 | 17 | 16 | 19 |
19 | 21 | 23 | 17 |
; enddata
!每份工作都有一人做;
@for(work(j):@sum(time(i,j):f(i,j))=1);
!每人都只做一项工作;
@for(worker(i):@sum(time(i,j):f(i,j))=1);
!让f取0-1值,此条件可以省略;
!@for(time(i,j):@bin(f(i,j)));
end
6.2
设:煤厂进煤量,居民区需求量为
,煤厂
距居民区
的距离为
,煤厂
供给居民区
的煤量为
那么可以列出如下优化方程式
s.t
model:
sets:
supply/1,2/:s;
demand/1,2,3/:d;
link(supply,demand):road,sd;
endsets
data:
road=10 5 6
4 8 12;
d=50 70 40;
s=60 100;
enddata
[obj] min=@sum(link(i,j):road(i,j)*sd(i,j));
@for(demand(i):@sum(supply(j):sd(j,i))=d(i));
@for(supply(i):@sum(demand(j):sd(i,j))<s(i));
end
1.线性规划模型。某战略轰炸机群奉命摧毁敌人军事目标。已知该目标有四个要害部位,只要摧毁其中之一即可达到目的。为完成此项任务的汽油消耗量限制为48000升、重型炸弹48枚、轻型炸弹32枚。飞机携带重型炸弹时每升汽油可飞行2千米,带轻型炸弹时每升汽油可飞行3千米。又知每架飞机每次只能装载一枚炸弹,每出发轰炸一次除来回路程汽油消耗(空载时每升汽油可飞行4千米)外,起飞和降落每次各消耗100升。
表1 相关数据
要害部位 | 离机场距离 (千米) | 摧毁可能性 | |
每枚重型弹 | 每枚轻型弹 | ||
1 2 3 4 | 450 480 540 600 | 0.10 0.20 0.15 0.25 | 0.08 0.16 0.12 0.20 |
为了使摧毁敌方军事目标的可能性最大,应如何确定飞机轰炸的方案。
2、资源配置模型。某工厂有原料钢管:每根19米,用户需求4米50根,6米20根,8米15根。 如何下料钢管剩余总余量最小? 由于采用不同切割模式太多,会增加生产和管理成本,规定切割模式不能超过3种。
表1 不同切割的模式
模式 | 4米钢管根数 | 6米钢管根数 | 8米钢管根数 | 余料(米) |
1 | 4 | 0 | 0 | 3 |
2 | 3 | 1 | 0 | 1 |
3 | 2 | 0 | 1 | 3 |
4 | 1 | 2 | 0 | 3 |
5 | 1 | 1 | 1 | 1 |
6 | 0 | 3 | 0 | 1 |
7 | 0 | 0 | 2 | 3 |
3、图论模型(动态规划)。求出下图所示的最小费用和最大流量,以及在最小费用下的最大流量。其中(x,y)中x表示容量,y表示费用。
图1 网络图
题目解答
1.线性规划模型。
解:设用了x枚重型炸弹,用了y枚轻型炸弹,攻击的是第i个部位,再设一标志变量f定义如下:
目标函数为:
,
model:
sets:
pd/1..4/:Ph,Pl,d,f;
endsets
data:
d=450,480,540,600;
Ph=0.1,0.2,0.15,0.25;
Pl=0.08,0.16,0.12,0.2;
enddata
max=@sum(pd(i):(x*Ph(i)+y*Pl(i))*f(i));
@for(pd(i):x*(d(i)/2+d(i)/4+200)+y*(d(i)/3+d(i)/4)+200<48000);
x<48;y<32;
@for(pd(i):@bin(f(i)));
@sum(pd(i):f(i))=1;
!验证用油量;
!l=x*(d(4)/2+d(4)/4+200)+y*(d(4)/3+d(4)/4)+200;
end
2、资源配置模型。某工厂有原料钢管:每根19米,用户需求4米50根,6米20根,8米15根。 如何下料钢管剩余总余量最小? 由于采用不同切割模式太多,会增加生产和管理成本,规定切割模式不能超过3种。
表1 不同切割的模式
模式 | 4米钢管根数 | 6米钢管根数 | 8米钢管根数 | 余料(米) |
1 | 4 | 0 | 0 | 3 |
2 | 3 | 1 | 0 | 1 |
3 | 2 | 0 | 1 | 3 |
4 | 1 | 2 | 0 | 3 |
5 | 1 | 1 | 1 | 1 |
6 | 0 | 3 | 0 | 1 |
7 | 0 | 0 | 2 | 3 |
设:模式的供应量为
,对于第i种模式,切割的4米钢管根数,6米钢管根数,8米钢管根数,分别为
,余料为
,每种钢管的需求量分别为
,再设一标志变量f定义如下:
目标函数:
i=1,2,…,7
model:
sets:
mode/1..7/:m,s,f;
demand/1..3/:d;
md(mode,demand):t;
endsets
data:
s=3 1 3 3 1 1 3;
d=50 20 15;
t=
4 | 0 | 0 |
3 | 1 | 0 |
2 | 0 | 1 |
1 | 2 | 0 |
1 | 1 | 1 |
0 | 3 | 0 |
0 | 0 | 2 |
;
enddata
[obj] min=@sum(mode(i):f(i)*s(i)*m(i));
@for(demand(j):@sum(mode(i):f(i)*m(i)*t(i,j))=d(j));
@for(mode(i):@bin(f(i)));
@sum(mode(i):f(i))<3;
end
3、图论模型(动态规划)。求出下图所示的最小费用和最大流量,以及在最小费用下的最大流量和最大流量下的最小费用。其中(x,y)中x表示容量,y表示费用。
图1 网络图
1)求最小费用,解法一:稀疏矩阵0-1规划法
假设图中有n个原点,现需要求从定点1到n的最短路。设决策变量为,当
,说明弧(i,j)位于定点1至定点n的路上;否则
,其数学规划表达式为
约束条件,源点只有一条路指出去,终点只有一条路指进来,其余各点指进去的和指出去的相等,表达式如下,
model:
sets:
node/1..6/;
road(node,node)/1 2,1 3,2 4,2 5,
3 4,3 5,4 6,5 6/:w,f;
endsets
data:
w=2 1 5 3 4 3 0 0;
enddata
n=@size(node);
[obj] min=@sum(road(i,j):w(i,j)*f(i,j));
@for(node(i)|i#ne#1 #and# i#ne#n:
@sum(road(i,j):f(i,j))=@sum(road(j,i):f(j,i)));
@sum(road(i,j)|i#eq#1:f(i,j))=1;
!下面这个条件可以省略,这个条件包含在上面的条件了,
因为如果满足上面所以的条件指向终点的路只有且只有一条;
@sum(road(j,i)|i#eq#n:f(j,i))=1;
end
解法二:求源点到任意点的最小费用,动态规划法。
求1®6的最小费用,只要求1®4 + 4®6和1®5 + 5®6中的最小费用,以同样的方法向上推,求1®4的最小费用只要求出1®2 + 2®4 和1®3 + 3®4中的最小费用即可。可以归纳出如下的表达式:
,
model:
sets:
node/1..6/:L;
road(node,node)/1 2,1 3,2 4,2 5,3 4,3 5,4 6,5 6/:c;
endsets
data:
c=2 1 5 3 4 3 0 0;
enddata
L(1)=0;
!求一点到任意点的最小费用;
@for(node(i)|i#gt#1:L(i)=@min(road(j,i)|j#ne#i:(L(j)+c(j,i))));
end
解法三:邻接矩阵法。
如果,则称
与
邻接,具有n个顶点的图的邻接矩阵是一个n×n阶矩阵
,其分量为
n个顶点的赋权图的赋权矩阵是一个n×n阶矩阵,其分量为
只需将动态规划的条件该一下即可
,
,
model:
sets:
node/1..6/:L;
road(node,node):a,w;
endsets
data:
a=0 1 1 0 0 0
0 0 0 1 1 0
0 0 0 1 1 0
0 0 0 0 0 1
0 0 0 0 0 1
0 0 0 0 0 0;
w=9 2 1 9 9 9
9 9 9 5 3 9
9 9 9 4 3 9
9 9 9 9 9 0
9 9 9 9 9 0
9 9 9 9 9 9;
enddata
L(1)=0;
!求一点到任意点的最小费用;
@for(node(i)|i#gt#1:L(i)=@min(road(j,i)|
j#ne#i #and# a(j,i)#ne#0:(L(j)+w(j,i))));
end
2)求最大流量:
max
同样也可以用三种方法解,这里只给出邻接矩阵的解法,因为邻接矩阵最容易扩展到多个点,且邻接矩阵用其他的软件非常容易得到。
model:
sets:
node/1..6/;
road(node,node):w,a,f;
endsets
data:
a=0 1 1 0 0 0
0 0 0 1 1 0
0 0 0 1 1 0
0 0 0 0 0 1
0 0 0 0 0 1
0 0 0 0 0 0;
w=0 1 4 0 0 0
0 0 0 6 4 0
0 0 0 5 3 0
0 0 0 0 0 7
0 0 0 0 0 3
0 0 0 0 0 0;
enddata
max=vf;
@sum(road(i,j)|i#eq#1:f(i,j))=vf;
!用下面的表达也可以;
!@sum(node(i):f(1,i))=vf;
@for(node(i)|i#gt#1 #and# i#ne#@size(node):
@sum(node(j):f(i,j)*a(i,j))=@sum(node(j):f(j,i)*a(j,i)));
@for(road(i,j):f(i,j)<w(i,j));
!用下面的表达也可以;
!@for(road:@bnd(0,f,w));
end
3)最大流量下的最小费用
用上面的方法得到的最大流量的走法只是其中的一种,而不是所有的走法,所以需要找出最优解,其中最小费用或者最短路径是最常见的两类。
这里求最大流量下的最小费用,先要求出最大流量,然后流量就是已知条件,再求出最小费用就可以了。最大流量用前面的方法已经求出来了,约束条件和上面的一样,这里用表示现流量,
表示最大流量,即容量。
目标函数,
约束条件,源点流出去的流量是最大流量,终点流进的也是最大流量,其余各点指进去的和指出去的相等,表达式如下,
对应的流量要小于容量
这里可以由上一问求出=5,
model:
sets:
node/1..6/;
road(node,node)/1 2,1 3,2 4,2 5,
3 4,3 5,4 6,5 6/:w,x,f;
endsets
data:
w=2 1 5 3 4 3 0 0;
x=3 4 6 4 5 3 7 3;
enddata
n=@size(node);
[obj] min=@sum(road(i,j):w(i,j)*f(i,j));
@for(node(i)|i#ne#1 #and# i#ne#n:
@sum(road(i,j):f(i,j))=@sum(road(j,i):f(j,i)));
@sum(road(i,j)|i#eq#1:f(i,j))=5;
@sum(road(j,i)|i#eq#n:f(j,i))=5;
@for(road(i,j):f(i,j)<x(i,j));
end

Powered by Discuz! X2.5 © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 ) 论坛法律顾问:王兆丰
GMT+8, 2025-11-15 22:46 , Processed in 0.219094 second(s), 30 queries .