- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569304 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176014
- 相册
- 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解法
% ^" T7 p$ q7 e( M一、 从规划问题引入$ V; ^9 T0 a+ J
+ O |) ^% W" W 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
# V6 k7 n" q3 n% o" M5 l1 o. k l# f. k. ^) Q+ e! X
二、 软件分析与选择
1 O. S! ]. D# \: d$ G4 }' D
& O7 Q6 G5 |3 v2 k6 r3 E5 ` Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。' k# A6 ?$ N0 v# K
! U' k7 U6 }5 P) o3 C
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
7 i/ C4 g$ e, }+ f( I; H 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 3 m- T# m6 O6 u) [* j- I
https://www.zhihu.com/question/49319704/answer/165923451
6 F5 q1 z" A; k% n( \4 J, @: _, Q- r/ I# R L- _2 B
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 0 x$ K, L& }8 J; ?: p
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
& p+ R; a9 N7 X7 R$ c0 [ 而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。* b* c4 H! t- `* I2 T$ v: J3 A
+ _* ]: U) ~4 W# Y8 U6 z 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。1 h* W" x9 c! \; \
: [; \! G8 d& e' a# _; a5 ]5 B* i+ i! k三、 如何上手Lingo! x$ V5 x- s) i" Z4 A
4 J: n+ L& H( n( J% C 有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 * b9 Q7 Q+ N4 A8 c7 g( Y
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。6 C4 e1 K e/ I
$ S A' j4 D( U8 I$ h2 }! D四、 Lingo的基本语法规则
/ p9 C8 N! j9 H. g$ H5 w/ D* ^8 p
7 ]. h! k+ ` E1 L- }1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; [+ Z, M, ~! A7 ?8 O4 I# a* P% u
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 7 w" N5 c! \; b+ E! k4 K9 [$ d
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 1 `, R2 L: T i* J) b8 ^
4、可以给语句加上标号;
& E- {. Z% f( f" @2 J+ X/ d! u5 @5 U5、注释以“!”开头以“;”结束;
" l I. L- G3 m0 y6、默认所有的决策变量为非负数; & {* c5 o2 x( H4 o; _. j2 [
7、Lingo模型以“MODEL”开头以“END”结束。
1 o7 A+ t6 x$ c- g# e: Y' `5 g2 W8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 1 a1 {3 i" ]& H* @9 w) Z, |
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 7 M/ P" x9 v$ B% l+ }% O6 n
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
, c2 ^0 S: m6 u T* Q8 V2 t
, ~$ ]: f8 Z! q9 n/ J" m五、 谈一谈例子# C, x, a% Z0 ^
- E" O8 ^2 E! `$ U% J
那么Lingo用起来到底有多简单呢,我们来看一个例子。5 g0 }; t* y" J
0 v5 \9 S, ~- S Q* c& V
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
: G, J( J3 k6 ~
: [$ u* z/ O5 D& E6 k, J 每个书桌 每个餐桌 每个椅子 现有资源总数" W& f9 Z$ i3 D% o j) g( Q: r2 L
木料 8个单位 6个单位 1个单位 48个单位% k2 m9 l O. x1 Y; z5 k1 M7 W
漆工 4个单位 2个单位 1.5个单位 20个单位+ I4 _8 z; P+ K
木工 2个单位 1.5个单位 0.5个单位 8个单位! R ]) w) ?; A- ?; `3 g
成品单价 60个单位 30个单位 20个单位
: C9 P& ^0 _, a* }; _) X 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?" [' e4 j( [" |2 ^
. d, O" F1 Y. d# b8 O
解:代码0 R5 R5 _( E h) X( u9 p
D p& s$ ]# Wmax = 60 * desks + 30 * tables + 20 * chairs;& C I% b* Y5 f$ ]2 Z- O
8 * desks + 6 * tables + chairs <= 48;
) \7 p/ l+ m+ o( L* u8 D 4 * desks + 2 * tables + 1.5 * chairs <= 20;1 L: ]- R! W; B+ @1 s$ C7 a
2 * desks + 1.5 * tables + .5 * chairs <= 8;
# G3 Y- s$ S4 \' Z, c, ^tables <= 5;
9 x6 q9 N. s5 C5 c9 p! f1/ L4 t0 u; o- V% P
24 i3 u5 q( N- `# S4 K% A* n
3/ ?6 [7 o3 |$ G/ Q
4
% n/ O' O, _9 K. D# O$ I) Q% S5
& T4 E2 w- P( [& {# f5 j可以得到结果:
0 J3 ~! B Z7 b! K0 K* M
+ o/ w; Q. {+ i" X9 | 这里的 Total solver iteration 表示一共迭代2次得到最优解。
% t( ^; { q8 ?% i* F8 R& b7 C Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
1 Y( N3 P' `+ i1 [ t. _ 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
% z6 Q$ @8 F& s& P8 e
! L8 E$ l9 o- p* e" ]' s3 ^例2:给定一个直角三角形,求包含该三角形的最小正方形。; T- U& j& q0 o( o' P* Z6 b: |
4 ` y! }$ O8 g& J0 [( Y" P我们可以作出如下正方形: # }/ O) n! D8 V# N& I5 q. v2 C4 z
) W; Z' n; _, q& m
- j2 G9 E0 x% r7 b- |! H CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx9 a$ D: O6 d$ e/ I! V0 Z: d4 M& @
转化为了规划问题那么正方形面积最小的时候即为最优解。 . @" }0 b2 R+ B$ Q
代码:7 H2 u \1 H" x" U$ s: f( ?
! d- j; j3 C0 Z2 |model:; W. h, n$ |0 i+ c8 p* p
sets:
/ F F( C: N7 Y4 W% G3 I2 P, y: k object/1..3/:f;
: {0 z! B. }' S q; ~; O+ Wendsets
" q( O( j; N$ d7 m$ Jdata:
+ P# C: C5 D# D8 w7 v, H a, b = 3, 4;
1 _* H8 v0 [( Eenddata
. _# e. g) c) K: r! v f(1) = a * @sin(x);& I7 }1 m M6 f6 ?7 v+ X
f(2) = b * @cos(x);" J) F! o2 `6 p2 Z8 T: i5 M1 v
f(3) = a * @cos(x) + b * @sin(x);
3 U# i$ o- y1 _) t6 R/ ~( Q min = @smax(f(1), f(2), f(3));# K' M9 v8 L0 @9 f, \+ I K0 k
@bnd(0, x, 1.57);( V2 ~1 @) t! C0 s0 b# F8 q+ B
end. R* Z3 t6 O8 O! w2 G
1+ ?7 ~: L/ i0 s9 L
2$ u; o# C' |( u! k$ w
3+ P: y) h: z% j1 A% T1 Q3 w( G
4
, _3 T: B, C8 m8 W& _! _/ ~5
# z. W0 ?5 R4 z6 q" ~60 w! m9 j" ]6 ?6 M
7
# T9 H; _( a& X9 {8: H: c" `; \- S# a/ r7 U5 B
9) c3 L1 `, n8 w, a0 V
104 l* O& A* ^2 z
11
E0 e" X) T, ]5 L0 Q& v" _5 C12
8 {6 T/ ^9 \, ]* T9 Y ^135 o- ?' i7 i1 L+ L0 m
得到结果:
; m2 R$ M. ~# a8 P
% u2 u7 D* q7 v: Z
9 u ?: S; ]2 Y; ~: c 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。/ n2 n8 {$ n1 [) Q( S
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
3 P$ K+ H$ y: Z' b% g
. m# N/ c4 E8 I9 ~% d9 N: ?5 j4 j例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
4 I) Y) {# ?: H∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
, i# f, q0 ?8 Q2 w! s∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj/ D4 m+ I" n& C0 h) j
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。- L5 E) f6 W; D% H
% U2 d5 C2 D. h! X3 q O; D$ }7 X
代码:
! J+ X7 J7 M' W9 G3 q/ c. z4 o# c2 I' s" Z) l( _# g
!旅行商问题;! x, Z9 G2 L2 m3 D: Y; ~4 K1 ^
model:4 a) ~3 R( x& Y" N
sets:; _. N1 \' Q3 r; b0 r
city / 1.. 5/: u;, B2 J' ]) V3 `/ P' n
link(city, city):
8 w- @6 |) Z. b" j' q) _* v dist, x; !距离矩阵;1 }5 {- b5 m8 h1 ?+ V
endsets
5 K* p) v& X5 H- Z+ X' E n = @size(city);
& S4 T/ i$ \5 o1 u% k. \data: !距离矩阵,它并不需要是对称的;
7 ]$ A5 _+ L, _' F" k1 C dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
4 y! T/ X/ _; n0 Z @enddata6 m% g9 Q8 Q, |$ ]0 K0 d/ U6 q6 r
min = @sum(link:dist * x);
" Q8 u2 r, A( l7 N. _ @FOR(city(K):8 U/ q( w' w7 Q; M
@sum(city(I)|I #ne# K: x(I, K)) = 1;+ B5 \( M, y. [6 ]3 k; [* a: H4 _
!进入城市K;
! \" i, O2 N4 x H8 O% l @sum(city(J)|J #ne# K: x(K, J)) = 1;! a( [' v4 x& X) N+ Q! Y' e
);
8 N3 z6 ^% q9 g" z @for(city(I)|I #gt# 1:
0 M2 y) @; ~* F( {1 r @for(city( J)| J#gt#1 #and# I #ne# J:
# \- Z* P3 b9 O" ?( }5 v$ b9 s" m" a u(I) - u(J) + n * x(I,J) <= n - 1);
2 M6 z% L" D2 h: { );
0 l, n& {4 [4 l@for(city(I)|I #gt# 1: u(I) <= n - 2);
0 _* o0 [4 \- O@for(link: @bin(x));* E2 w. z9 G$ M7 H9 k' Q
end/ ?3 s$ R; U0 H. c0 T7 J6 }% ]
1. M3 d3 ?9 m' e; R1 ?9 K$ ?' U7 X
2
. Z7 L3 _9 o: _3
' K+ Z8 ^( C+ b4 G0 S4
' `$ n) H- @5 n) e51 a% o& R- }5 L9 x
6
8 Q( b) @8 h' ^! C7
! K2 z, A" d' p& p84 n) w9 z: }0 N0 C0 i) Y5 c
9
^' g: i3 [- V1 x+ q10: s% h; w1 z. l' b. y
11
' P# R, Q( Y! j9 X* [, C12
; X: M7 v/ |3 h' m1 D% P* Y# ~135 M: R! W7 Q4 [( V8 n+ Q& E
14
6 B, O; r# {/ [15' p( I6 F* J" S- b
16$ R7 K. u }3 |# @+ p6 @
17
/ d) t( p w) l) o, H18, m) d6 @+ c7 }' W6 F7 D
19
, {; L, k4 l& R- b, r20
* x. j( H" I4 s" _6 G/ F7 ]212 e1 d% f2 v( g3 B' t5 B+ E+ b
229 r! z P4 J. t4 l3 i
23
5 i4 E: F8 a( `9 q( g! N8 S# m3 n24
- [4 M+ F, u6 \; i可以得到结果:
$ c( w! F) E. f3 b# F# d3 g& q7 s$ T" k8 O. J' \* l& ?. y
--------------------- 5 Q0 G$ j9 P2 w; h1 ^
1 @$ L. x0 m- s1 m0 \) J" w+ u& x8 P, M
4 M: n2 R' V+ m5 s
# [! `& o% g+ l; m, r1 D8 w; q0 K2 N$ u: y" M
|
zan
|