哪些数学建模题目可以化归为lingo来解决,它们有哪些特点?这是即将参加数模竞赛的我们关心的问题.这份总结是书本知识和对真题分析的结果。
一 、 下料问题
此类问题包括一个标准材料长约束;各种分割方法的数量约束等;目标是最有分配。
例一 每根长19m,A B C D 分法各为 4m 5m 6m 8m,数量为50 10 20 15根。要求不同下料方式不超过3种。求最优下料。
解: 设标准长L=19m,分割长为 ,标准数量为 , 为第i种切割方法所切割钢管数量。第i种下料方法得到部件j的数目为 。
min
s.t.
编写代码:
MODEL:
SETS:
SUBLEN/1..4/:L,D;
CUTMETHOD/1,2,3/:X;
LINKS(CUTMETHOD,SUBLEN):N;
ENDSETS
DATA:
L= 4 5 6 8;
D= 50 10 20 15;
ENDDATA
MIN=@SUM(CUTMETHOD:X);
@FOR(SUBLEN(J):@SUM(CUTMETHOD(I):N(I,J)*X(I))>=D(J));
@FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))>15);
@FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))<19);
@FOR(CUTMETHOD:@GIN(X));
@FOR(LINKS:@GIN(N));
END
结果
Local optimal solution found at iteration: 3010
Objective value: 28.00000
N( 1, 1) 3.000000 0.000000
N( 1, 2) 0.000000 0.000000
N( 1, 3) 1.000000 0.000000
N( 1, 4) 0.000000 0.000000
N( 2, 1) 2.000000 0.000000
N( 2, 2) 1.000000 0.000000
N( 2, 3) 1.000000 0.000000
N( 2, 4) 0.000000 0.000000
N( 3, 1) 0.000000 0.000000
N( 3, 2) 0.000000 0.000000
N( 3, 3) 0.000000 0.000000
N( 3, 4) 2.000000 0.000000
该问题小结:此类问题可以直接化归为lingo解。
练习: p67 11 题
解:标准长L=5500mm,分割长为 ,标准数量为 , 为第i种切割方法所切割钢管数量。第i种下料方法得到部件j的数目为 。
本题下料方法可以穷尽,但不手工穷尽。设共有m种下料方法
min
s.t.
得到m值的问题是背包问题,同时得到 的情况。
若采取例题中采用的方法,编写程序:
MODEL:
SETS:
SUBLEN/1..4/:L,D;
CUTMETHOD/1..11/:X;
LINKS(CUTMETHOD,SUBLEN):N;
ENDSETS
DATA:
L= 2640 1651 1770 1440;
D= 80 350 420 200;
ENDDATA
MIN=@SUM(CUTMETHOD:X);
@FOR(SUBLEN(J):@SUM(CUTMETHOD(I):N(I,J)*X(I))>=D(J));
@FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))>4060);
@FOR(CUTMETHOD(I):@SUM(SUBLEN(J):L(J)*N(I,J))<5500);
@FOR(CUTMETHOD:@GIN(X));
@FOR(LINKS:@GIN(N));
END
运算35小时后得到可行解:
Variable Value Reduced Cost
N( 1, 1) 2.000000 0.000000
N( 1, 2) 0.000000 0.000000
N( 1, 3) 0.000000 0.000000
N( 1, 4) 0.000000 0.000000
N( 2, 1) 0.000000 0.000000
N( 2, 2) 0.000000 0.000000
N( 2, 3) 1.000000 0.000000
N( 2, 4) 2.000000 0.000000
N( 3, 1) 0.000000 0.000000
N( 3, 2) 0.000000 0.000000
N( 3, 3) 3.000000 0.000000
N( 3, 4) 0.000000 0.000000
N( 4, 1) 0.000000 0.000000
N( 4, 2) 2.000000 0.000000
N( 4, 3) 1.000000 0.000000
N( 4, 4) 0.000000 0.000000
N( 5, 1) 0.000000 0.000000
N( 5, 2) 2.000000 0.000000
N( 5, 3) 1.000000 0.000000
N( 5, 4) 0.000000 0.000000
N( 6, 1) 0.000000 0.000000
N( 6, 2) 1.000000 0.000000
N( 6, 3) 2.000000 0.000000
N( 6, 4) 0.000000 0.000000
N( 7, 1) 0.000000 0.000000
N( 7, 2) 2.000000 0.000000
N( 7, 3) 1.000000 0.000000
N( 7, 4) 0.000000 0.000000
N( 8, 1) 0.000000 0.000000
N( 8, 2) 2.000000 0.000000
N( 8, 3) 1.000000 0.000000
N( 8, 4) 0.000000 0.000000
N( 9, 1) 0.000000 0.000000
N( 9, 2) 1.000000 0.000000
N( 9, 3) 1.000000 0.000000
N( 9, 4) 1.000000 0.000000
N( 10, 1) 0.000000 0.000000
N( 10, 2) 0.000000 0.000000
N( 10, 3) 2.000000 0.000000
N( 10, 4) 1.000000 0.000000
N( 11, 1) 2.000000 0.000000
N( 11, 2) 0.000000 0.000000
N( 11, 3) 0.000000 0.000000
N( 11, 4) 0.000000 0.000000
Row Slack or Surplus Dual Price
1 364.0000 -1.000000
这个显然是不行的。在解决本类题目的时候,需要预先将所有可能出现的情况都穷举出来,然后在这个基础之上做线性规划。当然,我们也有不用穷举的方法:
其实本题在求有多少种划钢材的方式是一个典型的找零钱问题,它的schema程序为:
(define (first-denomination kinds-of-iron)
(cond ((= kinds-of-iron 1)1440)
((= kinds-of-iron 2)1651)
((= kinds-of-iron 3)1770)
((= kinds-of-iron 4)2640)
))
(define (cc amount kinds-of-iron)
(cond((< amount 1440)1)
((or(< amount 0)(= kinds-of-iron 0))0)
(else (+ (cc amount(- kinds-of-iron 1))
(cc(- amount(first-denomination kinds-of-iron))
kinds-of-iron)))))
(define(count-type amount)
(cc amount 4))
结果为14.但是现在我还写不出来所有具体的情况,只能算出有多少情况(这对于非线性优化是有用的)。解决题目,还是穷举的方法:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
A | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 2 | 1 | 0 | 3 | 2 | 1 | 0 |
C | 0 | 0 | 1 | 0 | 3 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
D | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 2 | 0 | 1 | 2 | 3 |
带入lingo,解决题目
MODEL:
SETS:
irons/1,2..14/:x;
ENDSETS
@FOR(IRONS:@GIN(X));
MIN=X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14;
2*X1+X2+X3+X4>=2640;
X2+X6+2*X8+X9+3*X11+2*X12+X13>=1651;
X3+3*X5+2*X6+2*X7+X8+X9+X10>=1770;
X4+X7+X9+2*X10+X12+2*X13>=1440;
END
结果为:
Global optimal solution found at iteration: 2
Objective value: 2940.333
Variable Value Reduced Cost
X1 1320.000 0.000000
X2 0.000000 0.1666667
X3 0.000000 0.1666667
X4 0.000000 0.1666667
X5 590.0000 0.000000
X6 0.000000 0.000000
X7 0.000000 0.000000
X8 0.000000 0.000000
X9 0.000000 0.000000
X10 0.000000 0.000000
X11 310.3333 0.000000
X12 0.000000 0.000000
X13 720.0000 0.000000
X14 0.000000 1.000000
二 、 配料问题
该问题是一个整形规划,所以具有独特的特点。
例二 书本例1.7.3 p53
解略.问题的关键就在于整形规划的特点。但是在大数据量不可手工穷尽的时候怎样解决,这是就要考虑的问题。怎样将数据链接过来?是通过数据库还是其他东西。
三 、指派问题&装箱问题
此类问题有一个显著的特点就是都为0-1规划,比如一个人只能做一件工作;同时一个工作只能由一个人来完成。
例三 分配给甲乙丙丁戊去完成A B C D E五项工作,每人完成一项,每项工作一人完成。五人完成认为所需时间如表,做出任务分配时间最少优化。
| A | B | C | D | E |
甲 | 8 | 6 | 10 | 9 | 12 |
乙 | 9 | 12 | 7 | 11 | 9 |
丙 | 7 | 4 | 3 | 5 | 8 |
丁 | 9 | 5 | 8 | 11 | 8 |
戊 | 4 | 6 | 7 | 5 | 11 |
解:MODEL:
SETS:
WORKERS/W1..W5/;
JOBS/J1..J5/;
LINKS(WORKERS,JOBS):D,X;
ENDSETS
DATA:
D=
8 | 6 | 10 | 9 | 12 |
9 | 12 | 7 | 11 | 9 |
7 | 4 | 3 | 5 | 8 |
9 | 5 | 8 | 11 | 8 |
4 | 6 | 7 | 5 | 11 |
;
ENDDATA
MIN=@SUM(LINKS:D*X);
@FOR(WORKERS(I):@SUM(JOBS(J):X(I,J))=1);
@FOR(JOBS(J):@SUM(WORKERS(I):X(I,J))=1);
@FOR(LINKS:@BIN(X));
END
结果
Global optimal solution found at iteration: 0
Objective value: 30.00000
Variable Value Reduced Cost
X( W1, J1) 1.000000 8.000000
X( W1, J2) 0.000000 6.000000
X( W1, J3) 0.000000 10.00000
X( W1, J4) 0.000000 9.000000
X( W1, J5) 0.000000 12.00000
X( W2, J1) 0.000000 9.000000
X( W2, J2) 0.000000 12.00000
X( W2, J3) 0.000000 7.000000
X( W2, J4) 0.000000 11.00000
X( W2, J5) 1.000000 9.000000
X( W3, J1) 0.000000 7.000000
X( W3, J2) 0.000000 4.000000
X( W3, J3) 1.000000 3.000000
X( W3, J4) 0.000000 5.000000
X( W3, J5) 0.000000 8.000000
X( W4, J1) 0.000000 9.000000
X( W4, J2) 1.000000 5.000000
X( W4, J3) 0.000000 8.000000
X( W4, J4) 0.000000 11.00000
X( W4, J5) 0.000000 8.000000
X( W5, J1) 0.000000 4.000000
X( W5, J2) 0.000000 6.000000
X( W5, J3) 0.000000 7.000000
X( W5, J4) 1.000000 5.000000
X( W5, J5) 0.000000 11.00000
首先可以看到,这里直接用excel作为了输入。当然也可以输入回到excel中去。
用lingo解决装箱子问题的时候有个技巧,不过不是很有用。
四 、最短路径
例五 如图求各点到T的最短路
5 |
6 |
7 |
7 |
4 |
9 |
6 |
8 |
6 |
5 |
8 |
3 |
3 |
6 |
C1 |
B1 |
C2 |
B2 |
A1 |
A2 |
A3 |
T |
S |
6 |
线性规划的方法解决最短路径问题真是有想法。在计算机算法中有许多为了简化计算而设计的算法,大都比较复杂;然而如果面对的问题是数学,那么重点就不一样了:数学的重点是解决问题,算法的效率是其次的(除非题目本身就是效率题),线性规划几乎就是穷举所有的情况,所以线性规划很大程度上具有通用性。
编写代码求解:
MODEL:
SETS: ! CITIES表示由1~9组成的集合,是一个基本集合;
CITIES /1..9/: L; !属性L(i)表示城市i到城市1的最优行驶路线的路长;
ROADS(CITIES, CITIES)/ ! ROADS表示网络中的弧,是由CITIES派生的集合;
9,6 9,7 9,8 !由于并非所有城市间都有道路直接连接,所以将弧具体列出;
6,4 6,5 7,4 7,5 8,4 8,5
4,2 4,3 5,2 5,3
2,1 3,1/: D; !属性D( i, j) 是城市i到j的直接距离(已知);
ENDSETS
DATA:
D = ! D赋值的顺序对应于ROADS中的弧的顺序;
6 3 3
6 5 8 6 7 4
6 7 8 9
5 6;
ENDDATA
L(1) = 0; !边界条件;
@FOR( CITIES( i)| i #GT# 1: !集合循环语句, #GT#表示逻辑关系"大于";
L( i) = @MIN( ROADS( i, j): D( i, j) + L( j)) !这就是动态规划基本方程;
);
END
结果为:
Variable Value
L( 1) 0.000000
L( 2) 5.000000
L( 3) 6.000000
L( 4) 11.00000
L( 5) 13.00000
L( 6) 17.00000
L( 7) 19.00000
L( 8) 17.00000
L( 9) 20.00000
可以看到,最有结果为20.当然了,这道题目比较简单,我们还需要更多的算法来验算这一个结果。