- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565754 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174949
- 相册
- 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解法
- L/ B; ` d0 M1 f1 A$ h: b一、 从规划问题引入
0 l0 ^& j2 t3 m5 D
6 Q, q+ u1 u. l# K% M- e 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?5 e; A& f: G7 P/ [- p" `7 B# I# r ^
) w- \- U* s* h3 i' v
二、 软件分析与选择
7 K8 E/ X7 Z' I2 @( |1 W/ [5 P4 X( T
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
- ]. [1 f" e7 [$ Y, L' K C4 F. S2 E: `9 V0 r5 z
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 ( M5 K. f" f1 ~/ H% @0 S v
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
- }; E* d$ ~/ T) l# \8 l! khttps://www.zhihu.com/question/49319704/answer/1659234518 m4 Z* h/ U3 Y
, `# E8 }( I$ z 用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
% [! ~. _6 [1 [$ ?- d; g+ h 然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 1 l# Q) H. U% k7 B D* o$ z
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
1 P/ S* W: o& }, f$ v& F0 L7 @5 {2 ]4 f+ e1 r
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
" {) u8 R$ _3 j8 g% r$ E( A% L! ?' H5 `' c' Q9 e) v
三、 如何上手Lingo
2 ]% n3 E- `! K. m) L
& |* l- V; }. O2 f, N) i* A0 [! [ 有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
! T9 M9 G' }; k& d) r. L) s) _ “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。$ {+ B; c; Y1 k7 p# ?/ p
& Y/ g' n2 T4 X: `5 {四、 Lingo的基本语法规则' e9 ~+ [% A% p7 g: c% }
0 ~4 ? D: V# [ K5 J
1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
! N4 C8 w; n# y+ @6 q6 M2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; : [& {5 W! k5 f% s" v
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
( v( G; h* s1 x2 w! w/ z8 y) m4、可以给语句加上标号; 6 r( F( B$ g1 h, E
5、注释以“!”开头以“;”结束; ) }3 M2 `" d2 ?. h; k
6、默认所有的决策变量为非负数; 2 q3 I$ X, z- t, E
7、Lingo模型以“MODEL”开头以“END”结束。
3 a2 {$ q5 C: T3 L8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 7 R6 {5 W0 A& j8 v
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 , R+ \ q" `3 Y
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。1 X5 N" T! A6 T- z. P3 c
! @% p1 \7 l( M* D五、 谈一谈例子
8 ~8 \/ u: ^1 U5 J. ]: l5 } P: O y
0 E' \, u2 V/ }) w0 A 那么Lingo用起来到底有多简单呢,我们来看一个例子。 C, ~( \1 d+ q' N/ U
3 |) N6 P1 @( @/ ~0 S例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:0 `; n- H1 |" [/ f; [
( H, i2 \1 `+ F5 a2 _( d 每个书桌 每个餐桌 每个椅子 现有资源总数
9 o) {: _! ^' i* y; h) T木料 8个单位 6个单位 1个单位 48个单位
1 g: R5 b1 f+ e8 o9 I: y9 K漆工 4个单位 2个单位 1.5个单位 20个单位
# Z; r9 K/ W8 c' M r: G6 S1 [( ]木工 2个单位 1.5个单位 0.5个单位 8个单位
/ Z- L3 o6 I0 W( Z6 q) {6 l7 M成品单价 60个单位 30个单位 20个单位
$ k) q1 K4 O: ^: } 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?3 M9 F& G% h5 u0 X, o
4 A8 b7 S) h7 m
解:代码- `) a& Z+ ] G9 q$ w( G. k
/ Z1 R/ q. o- C/ w- G6 Z& x
max = 60 * desks + 30 * tables + 20 * chairs;& A# X4 c7 E! k% n( A6 l- C
8 * desks + 6 * tables + chairs <= 48;7 `5 z% `% ?" j# n% L( U# W( [
4 * desks + 2 * tables + 1.5 * chairs <= 20;
3 O9 v( a& J8 x 2 * desks + 1.5 * tables + .5 * chairs <= 8;+ p$ W& k1 ~0 e+ h) V5 l5 H
tables <= 5; F; Y5 ]$ B o$ w* b
1
# s: i! {/ b0 P, e$ v7 T2 }2' `7 U- X9 m" f$ P0 l) S9 Y s
3
' U0 w0 }. M P* W4
( |7 G3 r7 d; k7 ?* C55 ]( M( a: Y2 `9 ]) N- @5 z' N
可以得到结果:
p3 b) P! Y9 x9 m8 y- |- i4 \
" C" s- F5 E' J6 z. w% t3 y 这里的 Total solver iteration 表示一共迭代2次得到最优解。
5 ]4 q5 K. ?5 C7 P2 [: J Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
; _+ Q% x% O. E0 A 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
& ^2 M4 I. n3 e6 I/ X! N# y; b' r' `2 ^+ Q
例2:给定一个直角三角形,求包含该三角形的最小正方形。
4 e$ ~ R/ G l2 u$ S& S
# g; l/ m& \; Y我们可以作出如下正方形: " c: x: C+ ]8 M' _2 K: ~
% X$ m6 C! {9 S$ f4 X+ }6 i, s# z2 n a3 Y R4 i5 ^
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx. u" `( e5 Z2 g
转化为了规划问题那么正方形面积最小的时候即为最优解。
$ g, I/ K8 H7 j; l 代码:
: r: |+ S2 J4 z6 ?" r
- e7 Y% ]5 [7 L5 N2 Hmodel:: Y& w. x+ A7 F) N1 T' | B; a8 {
sets:
+ `. r9 c# Z) ?' D object/1..3/:f;
- P3 r: M9 B1 u6 M. V& g8 U% Eendsets7 X8 z: V3 G' ?& M
data:3 ~0 ]$ z3 G( Z7 a7 e
a, b = 3, 4;
( A7 z1 A+ k5 oenddata
4 e% l! P; } f* I f(1) = a * @sin(x);& K3 j5 ]. w. ]
f(2) = b * @cos(x);
) v" V$ ?+ H) Y' B f(3) = a * @cos(x) + b * @sin(x);
8 N, v6 S B' b! A# C3 c min = @smax(f(1), f(2), f(3));8 k, \% V# K8 c7 r+ G) L4 `: W1 y v
@bnd(0, x, 1.57);
8 {0 [3 `+ L( O' o- L- M7 vend% L N4 _/ R, B E9 T3 V
1
0 i1 T* w# A) q8 e2
; x5 z/ q! S# j6 i+ O3
& v) l; K b9 `, X( R# I4
. I( ?! `( q5 i+ R+ U5
* z; }! w! {8 Y ~9 E4 `65 \0 T( t6 ]/ C3 c
7
+ X' @" ~0 R8 O' H2 |8
) M% ]7 j) [, ?9
2 p0 x. g( ^5 }: ~; y+ l10
' [' h6 Q: c0 q: N. n6 H# U8 s114 J, {0 i2 T* P6 s4 Z; S
123 c+ O7 x% T9 t) j
13
) x+ Q+ O' W( Q& d! n. p 得到结果: " T; s- {9 z( o5 a3 L) M* |
/ }- h7 ^2 u ^( v3 z3 Q7 S
' x2 V% R0 {3 v8 W: K6 p, n 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
, s' P G2 ]" z4 O7 l 那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
: o8 w( r8 T& s! ^8 X% [- q
~4 Z+ P0 H; q' C5 L$ \例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 / \; O% s5 V/ b# h6 V# K
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
C6 _3 g {# x6 V- E∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
3 Y$ ~ c- ~: ]- W, w) e q由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。2 ^$ _/ j0 R4 u' f( g
% {2 d+ N/ e9 j6 O) \6 ^* ]
代码:- }8 D5 w- C$ g1 }" X
5 ]. T q" A, c: x/ ^!旅行商问题;
9 v6 M2 u3 a3 i4 ^6 tmodel:
0 h/ M5 ^5 Q2 s/ I: v6 ]; xsets:) k: q: w5 x( c. Z" r& F, B" S
city / 1.. 5/: u;
& p! x0 K' j1 [( `4 i1 M, g9 G link(city, city):* ~4 y6 K, d: x: `
dist, x; !距离矩阵;3 P6 i6 e& W, c- S# @
endsets
2 M. r! p) X: ^+ x) f/ B; H n = @size(city);
" s: R K6 ~( L: e2 Z2 `9 T4 Cdata: !距离矩阵,它并不需要是对称的;
* j* X* X; u f dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
$ X3 F8 {; e" i) K8 tenddata
. P8 K$ y9 e" X# A min = @sum(link:dist * x);2 A% o; S# F1 ~0 m- f- {) b- F d
@FOR(city(K):
1 ]; I8 s( E9 ? @sum(city(I)|I #ne# K: x(I, K)) = 1;% K( q/ B7 j: K: r7 U6 v$ e: v" n
!进入城市K;9 [4 m) V* h- I* x- A2 ]
@sum(city(J)|J #ne# K: x(K, J)) = 1;
\2 R$ T' j0 N7 B" w+ f8 s6 H );: e5 Z% Z" q: Y9 N `
@for(city(I)|I #gt# 1:
; ]3 \% Z: K: b! n @for(city( J)| J#gt#1 #and# I #ne# J:% j/ X; b7 m |2 q# P
u(I) - u(J) + n * x(I,J) <= n - 1);
* D% _# o' d( ^5 A7 v% v+ |4 i0 X );
/ |$ P# u5 f" M( }@for(city(I)|I #gt# 1: u(I) <= n - 2);: {. F. B! j1 s
@for(link: @bin(x));* \& d" T" Q- P
end) C! _( R0 L% O' ?' [" H) B
1
4 M2 T. G @, Y( M( Z% c2! r4 A: }+ W5 C# v* f
3
J: ^% E4 Z1 z6 |1 t6 i; n9 q4
+ m: L- E& s- k. }, l% m1 Z [5# Y- z% i4 @% I7 L7 F4 i' w# s6 z
6
. q7 v8 n& ?6 @' k78 d6 R6 |6 a' I' u5 y
8% e1 y$ }6 ]6 ?: m' t# f1 M! O7 n
95 s* @+ Z. U5 [7 o# n5 W4 c
10. `5 J# I1 v3 g9 {
11
# N0 e7 \1 u# M7 b! g8 e' D% C4 w- ]6 Z/ J12
/ f' v1 g6 V0 o7 A- Q6 m& P138 h3 \/ d4 S0 q! n8 S
14) s8 M4 w7 |& A8 f$ u1 d$ l2 b
15) e3 B( b) p) X
166 [& ?2 o9 q6 v! h; U9 ?
172 i/ h% K, _: C0 o# R
18( a# R0 {7 `; F' F' ~% E
19
3 a) H* F3 I: B" {20
4 f3 Y" d8 m2 s' q; |$ s2 ?21
; }! ^! I; N+ N1 V% ]) p22
5 `/ D/ i% E/ G% U, p% J23
`) Q! a9 w% }8 f24: S4 ?5 F4 @' |$ j
可以得到结果: # O6 T7 E& k$ h( w( p$ w% u) ~
/ N' E. Y4 r4 e! `; f' u1 H
---------------------
: S9 h# c. j3 D' J8 G2 D) k& I; F" J* M$ C- o' c
: ~! M* f" d- L' F& F- T
& D; S6 `: v0 b3 v& [1 |2 A
4 i- a1 i- R0 T5 G0 B H
4 d% }2 W; V' H, l) T |
zan
|