在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563315 点 威望 12 点 阅读权限 255 积分 174217 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
2-7、规划问题的Lingo解法
) _0 _# K: t) ?( E# g6 _+ k8 N' s 一、 从规划问题引入
- F8 w: \9 n. v4 X % G! T3 k& Q2 f. r. ?( h" n) M
在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
9 e4 J, g" T0 r % \& I1 m; o3 R; d. w# M) S
二、 软件分析与选择. F1 [7 N& ~ l' e- C5 p* r
# f. b7 P5 r+ ?# u5 G
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。# W3 a# o' P6 Y! b. O, K. B
+ T3 [* h+ q0 Q, \8 u# F/ g D
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
9 T; o0 M, D/ u& p 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
8 A% F. T! x$ @3 c( h6 n https://www.zhihu.com/question/49319704/answer/1659234513 U6 r! h3 O. I: K# H$ K) Z
( A! G! }( r' P1 p4 t# F3 N! n
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
* a; t2 w% r- r( C$ W 然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 0 M, |0 ^1 f8 N8 W2 P. C
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。) M. P9 P& L, Y9 h; F
" @! w3 |# e6 V; O% W 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。- w! q( e9 O* a7 Q T" N
5 t: j0 h! j2 ~* X9 s3 _( ` 三、 如何上手Lingo
" `6 P: I2 h- }5 z5 e& V 4 m; N3 E& u# U6 x0 ^7 x
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 & r) w! @, r* n5 ], {9 G
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。" l& Z3 j% s6 F, ~
" o& W, o- z9 U* B" o5 K: Q# s 四、 Lingo的基本语法规则
0 s- B1 ~. N" S1 z5 D: ]
- l3 S4 r r9 j1 H3 u, |8 @ 1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; 3 m7 N/ k) k }: n5 W& T
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 3 o' O7 a- @/ } Q
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 6 O! {* `* k2 N" ^: K0 y z0 j
4、可以给语句加上标号; " `+ Y3 ]5 Z( r: G2 @* u6 Y; w& {
5、注释以“!”开头以“;”结束;
( [% K2 j% {: J+ g6 Z2 R 6、默认所有的决策变量为非负数; : @4 j* f& a7 a; |/ T
7、Lingo模型以“MODEL”开头以“END”结束。 + W0 E' ~) ]8 ?1 T$ S! b
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 ; l: W( n9 x; D9 e
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 , g! ]4 g5 d4 N
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。0 [% u8 u8 J' d
, W- d5 i0 P5 g0 Z" i. ^
五、 谈一谈例子# ~. {% L/ @0 R2 c
; ]3 t/ ~; |$ R9 d. L 那么Lingo用起来到底有多简单呢,我们来看一个例子。
6 e, x! j9 E0 |- e7 M7 n9 t
6 U, q+ D$ X+ h 例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:% I0 y0 C7 v9 ^5 C' D
$ S) c% G# V& e6 \ 每个书桌 每个餐桌 每个椅子 现有资源总数
' j2 s" T* _" k4 n, ~) q1 R) J 木料 8个单位 6个单位 1个单位 48个单位" ?8 N" \' O8 K F) f
漆工 4个单位 2个单位 1.5个单位 20个单位
: O; _' [$ E2 `9 {$ \7 g 木工 2个单位 1.5个单位 0.5个单位 8个单位
|) p0 b% K$ Q" `2 o) s 成品单价 60个单位 30个单位 20个单位
6 C9 W1 w/ F" p. G1 l8 m' ` 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
% t( s% L, K+ k9 s7 U) V$ w5 R ( V4 f; m; Z( ?2 y, H
解:代码
5 r% I$ [; N' ^7 U0 u# r* |9 k9 \ ; t2 s. Q; i# J' `$ ]" ^! c
max = 60 * desks + 30 * tables + 20 * chairs;: F. E# _" q4 c! ^1 h: ?0 V
8 * desks + 6 * tables + chairs <= 48;
2 H7 m) b4 y8 \4 k6 u& A 4 * desks + 2 * tables + 1.5 * chairs <= 20;
7 x: p# V9 {$ w( R' } 2 * desks + 1.5 * tables + .5 * chairs <= 8;
+ q+ z1 Q r, X* \( V tables <= 5;$ P3 p. ]! J: k* J& Q( v
13 E9 o4 T" h( z: j% j
26 ~- ?. ?. b6 {) C- {9 J
3/ n" _- W+ B8 J$ [
4
2 Z D" u+ \" N/ j: E8 ]8 b 55 K' ]! s+ J* c% J2 n* I" a' o
可以得到结果: ! k3 K& O" z! p9 |$ m7 C: O
+ ~, S6 {, \. W! f: H, v7 J' j
这里的 Total solver iteration 表示一共迭代2次得到最优解。
" o, {, N0 I2 L3 w. {# A Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
, g# |* R1 L7 [6 ] 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。9 z G8 Z g" {5 ]9 o( m: G- n
/ v6 T% {* G' c! [% H 例2:给定一个直角三角形,求包含该三角形的最小正方形。0 N6 B5 k7 m/ M3 _" i" m. Q" m, y9 B
' C% t! z; J7 i: P- y' w. c 我们可以作出如下正方形: 3 L2 [& n% x* D4 X- q
, ^% D. d# F5 |/ D- W% e 9 c! y, C7 ]" L
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx- x- y4 Q/ _7 l4 v/ i
转化为了规划问题那么正方形面积最小的时候即为最优解。
% o, `2 i$ c, r5 U% \ 代码:& p* f3 j8 }! o2 r
, z6 a, m0 `- X model:
$ b6 ^* n, X# S. F# `& T- ]* z. a sets:
* D+ {3 g, C( G( w object/1..3/:f;- r3 e7 D# x N! f' E/ G) K
endsets8 U' b) w( f, v2 h
data:0 }0 u& U0 e' G3 [, h
a, b = 3, 4;$ p1 L/ Y) D, _% L( o
enddata
* {! k' A/ t1 s- X a f(1) = a * @sin(x);, ?2 ~* _9 n& H1 r+ o0 |! g( L
f(2) = b * @cos(x);
: [" n) G+ F# Q- e7 w) n8 e f(3) = a * @cos(x) + b * @sin(x);
& J( ~$ p) a t# Q! y9 w4 _ min = @smax(f(1), f(2), f(3));
8 M/ y; ]& e' d2 | @bnd(0, x, 1.57);- B k0 M8 `* I/ V( x6 Q K
end
2 E; r M: v1 S: `: ~ 1/ n: Y O; A: W8 k L9 ~& ^2 Q" c
2
* A# p Q" O0 g" j5 V 30 J0 H! \9 v! ?" P& c8 w8 s
4
0 A5 K7 W3 Y8 m' B# j, [6 ] 5
6 M8 P- \& G- {% l" V2 w% T, R 6! I3 } t9 p; _
7
3 ^7 B K& `; |9 E& c# S# i 8+ Z4 j* ^, c. V1 |9 K% x; V
9! }+ u4 l3 ^% R5 u$ w% C* f
10& x q2 V0 {+ P5 o8 B6 @
11- l) I# q& X' j) P8 L- B
12/ h; V! i+ |$ | D3 ^: J2 V
13) `6 ~( `# G& R5 [; \+ t) t. y
得到结果:
. g, q# T/ \( A: L- ~2 v H3 J 0 ~5 f3 v3 D5 l1 S$ M$ k" s R4 c
" s3 }: O0 `3 @% ~+ n
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
8 R+ o) Y+ ~: d7 C4 @0 R6 \- w 那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
( H1 x f1 n. L7 y8 [ 2 W$ n7 e0 t R4 k+ @
例3: 现需在一台机器上加工 nn 个零件(如烧瓷器),这些零件可按任意先后顺序在机器上加工。我们希望加工完成所有零件的总时间尽可能少。由于加工工艺的要求,加工零件 jj 时机器必须处于相应状态 sjsj(如炉温)。设起始未加工任何零件时机器处于状态 s0s0 ,且当所有零件加工完成后需恢复到 s0s0 状态。已知从状态 sisi 调整到状态 sj(j≠i)sj(j≠i) 需要时间 cijcij 零件 jj 本身加工时间为 pjpj。为方便起见,引入一个虚零件 00,其加工时间为 00,要求状态为 s0s0,则 0,1,2,…,n0,1,2,…,n 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 ) g, T6 c2 x+ M0 V3 ]. \! T; P
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
$ u @- {- s0 [ ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
) ^- x v o! \* r+ Z ^ 由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。7 \- ?# x4 ?- M4 ^
' b7 Q) A0 E9 w 代码:7 O4 I3 Q) M7 a
( ?& a- y/ z% u5 c7 V/ O !旅行商问题;
4 m# _# Q) s) U model:+ K! V: ^/ d( t1 u8 x3 j
sets: S. U I3 u5 @2 J2 W# M7 X
city / 1.. 5/: u;1 s5 U+ L9 _6 a$ j: `( { L9 _( k
link(city, city):" d& T# D/ \; m
dist, x; !距离矩阵;# F) A" X9 n% M6 i& j
endsets1 @1 F% T5 c& E7 G! g- G
n = @size(city);
6 G$ ?4 X* Y% L7 c3 y3 V3 f data: !距离矩阵,它并不需要是对称的;& N' ]5 S" i) U. P W# z
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
/ o0 ]0 L3 Q3 e# ^ enddata
& o4 J) X' |# T8 Y& k; g min = @sum(link:dist * x);
) U& U! v6 T( O* S @FOR(city(K):
, D" v8 {' d( l: M( ] @sum(city(I)|I #ne# K: x(I, K)) = 1;. v u' }! E9 t* v8 J6 w' P$ X
!进入城市K;5 x; a, m# G L9 ~5 b
@sum(city(J)|J #ne# K: x(K, J)) = 1; K& ~( K- y9 A. K! _0 H4 g
);
* V& q" G9 [( }3 I3 U2 h0 ` @for(city(I)|I #gt# 1:# p! a& Q0 {1 C) U
@for(city( J)| J#gt#1 #and# I #ne# J:7 j# {+ _2 C3 G: i: e" m6 i. H( N
u(I) - u(J) + n * x(I,J) <= n - 1);4 u* z. p# \% D
);4 x; p# A' P" ~
@for(city(I)|I #gt# 1: u(I) <= n - 2);' M; L8 }/ z# i+ v
@for(link: @bin(x));8 p4 C* u8 ^( [: X0 w: W" Z5 d
end
- n8 s) j; H( {: k 1
% ^4 a/ e+ R* ^4 @ 2
$ u) q4 e+ W0 h3 k" O6 ?, n 3
. S* i% s2 T3 N 4; ~1 A* f. `. W. _6 y
5* V8 A0 k# z$ h6 U
6/ Y0 @( S. {" }5 o1 M9 z% ~
7* v- W8 S6 X! p& B3 v9 M
8
- ], F, g: F% S" w3 L 9! T' g- E5 j& M: I& l5 a& }3 X
10" M& z7 j/ B0 h( F: r2 b
11
4 ]# Z3 o7 E3 q. e; ~: @ 12- |5 A& i, F; {8 P
13/ c+ T5 s0 |, A# l. J8 D- g
14
3 E4 K9 o$ R0 w2 K& N 15# V) B2 n9 B+ N+ O# Z
166 B( t7 _, O- j8 x
173 x. ^/ L5 G6 B w$ H# a" C1 w" ]
18+ a5 ^* A1 Z4 B' a- Y4 t! ]3 j' I
19
! P X+ \( W! R 200 Z2 ^* t' u9 X
21" _" O2 C* u% h4 f/ U( H8 f
22: l) m3 }2 F) M3 X" A( Q8 E' H
23. b6 b8 j8 A2 Q
24
' f8 N& b$ X$ f 可以得到结果:
% G3 N7 W5 s! z, }/ c 3 x" ^& C' }2 m
--------------------- , b# T @5 O7 j5 a! Z% F
' m# j& |' K8 Y+ S5 }/ h( e, X& `! G
# ]! h' X' E3 W: x$ f3 Y
1 \7 s! l6 ?& a1 I
) F" u) P! g W3 V! `* A$ s# Y ' Z/ {% Z+ w7 z) _
zan