- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564666 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174623
- 相册
- 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解法% i* {% |/ i7 v9 _& H( M
一、 从规划问题引入
1 B3 U+ e/ K) T" l
9 t! D# W. b2 K$ B" y" f 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?# L. V0 J4 t/ P% u
+ T4 y5 o" r, j3 _2 K3 l: j6 G+ |
二、 软件分析与选择
+ _+ C3 C4 n3 `: Z. \8 T
4 l3 V4 ^* r9 b! T# Q Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
8 z; ?2 @! P- n$ k. n( K* `6 g. D" W5 N" m3 j" K
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 5 c; b4 V% U- @* R
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 - M c- e& N5 k5 Q" _
https://www.zhihu.com/question/49319704/answer/165923451$ h4 y) N2 v- `$ Q/ H' c
! f" r1 [& I/ g: o- x; z0 p2 {
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 / X" V2 i p; p
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 6 F! y. v$ A9 y' ]9 t
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
; L: _9 S7 G3 Y) y* L' t( K3 ^+ V8 e7 `+ s% h" j. ~0 G. Y* t
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
& W6 i2 M' Y/ d9 \+ D
! g- O* O, ^" u c2 ]三、 如何上手Lingo
! e% @8 \9 ^: t, I. n$ ~- L& }* S2 t# G. I
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
" \' E( X+ l7 m; R8 \" n# s “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
, q; B* n- J f0 T( Y2 n
' N- M. E. f7 V% i* V) i四、 Lingo的基本语法规则
9 e5 z; l( V4 q/ Q" G0 t7 C, V' B# u8 t K
1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; ; F `# ^6 E- m& I2 E
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 4 K% z1 N- d( F
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
! |# ~2 U- F3 G, G: ?* R# h" o4、可以给语句加上标号; % O' @* A8 a7 W' e% X+ }2 h
5、注释以“!”开头以“;”结束; 5 O! G5 y' |# M0 P; ~3 @
6、默认所有的决策变量为非负数;
+ ]8 M. y0 d# V) ^9 Y3 W' z7、Lingo模型以“MODEL”开头以“END”结束。 % B/ \ E8 N, t' { G
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
# g2 w) x- U5 m9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 , {, U/ K$ d* ]9 r9 \+ h a- {8 d
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
9 C5 w% U$ p) n$ i8 e2 L9 V8 y: k& E& y
五、 谈一谈例子( }8 j0 Y' ^7 @/ J* w& m* U
0 T8 i, W4 ? b5 T 那么Lingo用起来到底有多简单呢,我们来看一个例子。
3 W, O8 Y+ P$ z& C% [3 i1 A$ V$ _2 ~
' u& q' z7 R/ ` y' ^/ S例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
& Z) H; A2 z. n% z1 I# n2 B; [. s! i; K
/ f# a ~4 y- }$ k5 g 每个书桌 每个餐桌 每个椅子 现有资源总数/ R3 Z% a6 \/ T9 i1 f) e( V3 C) F
木料 8个单位 6个单位 1个单位 48个单位$ s) {5 L+ s) n
漆工 4个单位 2个单位 1.5个单位 20个单位
! u' e+ v' O5 c; g$ P木工 2个单位 1.5个单位 0.5个单位 8个单位8 Z; O9 X. F- p2 }) i/ P+ B' H$ y
成品单价 60个单位 30个单位 20个单位
" n, y- @7 k2 O* j 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
: {/ P! Q x+ L8 O0 Q* G% ^, ~& T2 C4 D
解:代码6 S/ b6 K& b$ s0 ]
3 A8 d, n7 `6 g' }5 H5 [+ I6 Bmax = 60 * desks + 30 * tables + 20 * chairs;+ e# d+ J! Q5 y7 Z
8 * desks + 6 * tables + chairs <= 48;
, S9 @& H7 F1 F 4 * desks + 2 * tables + 1.5 * chairs <= 20;
" O( b2 R% i; r$ q6 r 2 * desks + 1.5 * tables + .5 * chairs <= 8;
7 J) m& \/ |, Ktables <= 5;, e9 h# Q& B0 k3 v, {
1% ] I0 t3 K! C8 @# d; v( r
25 `' c% k z z) x, q+ Y
38 u9 f, V5 @$ K0 [# p
40 _! E4 l. u; r6 F
5# y) B* B0 c* L, G/ }. D4 I
可以得到结果: 1 \$ Q+ }' \/ H8 }: w0 l) m3 ]9 n
3 n. C$ h' X: q6 T
这里的 Total solver iteration 表示一共迭代2次得到最优解。
" w, f/ ?( `5 M' b9 N" n Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 - r& ~6 L. V8 ]% g0 M+ J
可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。2 u, F* n8 Y7 K
* p/ H- n, S7 T4 m4 X: C) ^# L$ H
例2:给定一个直角三角形,求包含该三角形的最小正方形。, ?5 A# \( m8 Q6 l0 K! W( H6 _
. q+ A9 y! d* m# D3 N我们可以作出如下正方形: 2 |' f" @; ?5 P' O
9 ~+ b# ?! m# d# W$ U$ r$ W7 u. M! Y: X6 C# F0 {& P
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx" D$ J- D7 Z( I" y3 a$ \9 Q
转化为了规划问题那么正方形面积最小的时候即为最优解。 - j# o+ ~. n5 E1 E. v* ~
代码:
4 x& r0 i3 w: R) a& H1 c3 ]6 X: [# Q# O, D
model:2 c+ g$ {( q; a* B$ V" z
sets:' Y4 N2 v5 j! s7 x" y$ Y! a
object/1..3/:f;, k5 j3 I$ o$ ]$ ~6 m; d
endsets
. S L z3 i4 }( w; Z& edata:
/ c4 G9 q$ a3 ]: a a, b = 3, 4;
0 t- Y3 [0 I' S8 y3 y+ j( {; zenddata
. q6 a# w2 }4 ^! Z. W f(1) = a * @sin(x);' z5 A) e3 `8 _! z. E# |
f(2) = b * @cos(x);( Y1 D' o8 q# I9 m# _% j/ @) p
f(3) = a * @cos(x) + b * @sin(x);
2 j( f& p- ?$ w min = @smax(f(1), f(2), f(3));! {9 P9 ?8 v% w5 S: H
@bnd(0, x, 1.57);# g! Q9 I" d4 |/ M. b. @1 g3 b' B
end1 Z3 |" r" d, U i& U0 W
1' @1 C, c9 K5 z, f/ ?) C' z
2. Z( i+ I, ?/ n# E5 ^8 ^. o: ^ \
31 W1 v7 y0 H4 Q* V9 @6 ~
4
' W/ s; C( f" E2 E" d6 k( X5/ Y; k( s, j6 c( @5 j& b+ d/ X; U" v ^/ P
6
}7 R, \# O# C0 f( z8 K74 B3 F% Z+ r, ]& u; p" I( R
8* {( j8 p9 M7 I1 j Q! Q
9
6 f; G. ]# `# Z3 }10' G. k4 j1 f- ]5 l1 u# s
11
1 g3 l' X8 p2 n U5 r/ O12! C2 @" {& N; ?/ ~5 @2 }& v) T8 p
13, D1 C" Y) R0 g$ D) i* u
得到结果:
% L3 T+ e% s3 A' k6 h5 c
* h: y& R$ K4 e& y( K2 {# P% p; {9 v( a5 _5 Z8 L
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。2 t$ N, m2 k2 E; p7 q- f5 Y
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
8 Z6 G6 a$ o2 L0 Q8 U! w! G7 @" H" s1 {; L3 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
% c2 a, J& h' v* r# q$ k∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj" A3 B! M5 m& \. K" q U/ h6 r) l
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj& I3 k' @% V: P" D! N/ C
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。! C0 ]% i* R) }7 V$ X! w* S
! q# v, Z. d Z/ G1 S- L( Z$ d代码:
1 w* }6 U: Z, a9 E+ H
: n5 `/ S/ o- t!旅行商问题;" e; [/ E0 u/ q( w( I
model:
! w' t4 R5 W: p5 H* Esets:# Y9 f" u1 v# b }& K
city / 1.. 5/: u;0 l4 m+ O0 V2 O2 W% ]
link(city, city):! R# {! S, w8 u. A n. O% x# X& B' O
dist, x; !距离矩阵;
: Q/ a# R w5 j4 F+ P$ ?) Xendsets6 _3 L1 R4 H8 |2 ]& ~" a
n = @size(city);
# d) R0 E) n& B) a7 |data: !距离矩阵,它并不需要是对称的;* Q, e- v5 W7 k/ i( Q* O
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
) h e# B' V" h; p, M5 o6 Lenddata+ M( J) {) x3 c* q9 S
min = @sum(link:dist * x);
+ G1 o& _+ h& A @FOR(city(K):7 M" t+ K$ i+ W) P) b& @
@sum(city(I)|I #ne# K: x(I, K)) = 1;
* z& b8 d6 H4 ^ c !进入城市K;
$ Q8 g/ o: N* W' f+ F) m @sum(city(J)|J #ne# K: x(K, J)) = 1;' E S* R& n2 U) j' X0 h
);
# c- Z5 n x% w6 q$ J9 p @for(city(I)|I #gt# 1:
/ Y8 l0 C6 h! T$ B: D7 _) x# X @for(city( J)| J#gt#1 #and# I #ne# J:
) F/ j) b0 r# e ? u(I) - u(J) + n * x(I,J) <= n - 1);
0 j8 V1 p# C% i0 n. O8 i4 [ );
4 d7 V3 s8 {2 ?- U& l1 m- d@for(city(I)|I #gt# 1: u(I) <= n - 2);; }5 ^* {. {; z
@for(link: @bin(x));; `: Q8 P8 j: B. z) B4 j
end
7 \$ N0 I, t! ^0 t17 ~! J5 T# i* T) q: A# t( A% b- B# V+ k# T
2
% j+ g4 M3 p. ~/ {# A3
* K8 s D- j0 h5 Q4
4 _( x2 ]; R' O2 ~& a2 G5
; e* D% v! Q! {$ k% w. o3 j+ A60 [6 l. O& u; N; _& \! ~+ p
7
* t' U7 O! _; E9 j, e* z- y4 Z% @8
& ]" C( M% [+ S93 f. A) n% ]4 y: c" m
10
% H: d& G2 V w& b11
. V# E8 n3 I9 R! B; @12
: G9 O6 u2 v; ~' f' _6 J6 T13
" r `3 Z: h" s" u8 ]14
2 r: A. _7 H g# @2 \# L15
9 ~1 i/ p/ x0 w! w& p: K& q5 _16
K& g2 ]; x7 i9 e" V2 Q17/ \& ?6 r' y0 i: j# o
18
" ~1 b. S, Q$ S- u- X+ C: x19
3 f' J/ i2 v4 h+ | ]: ?, g4 P" S I H20
$ A9 t# @2 T+ q# c X+ v; s21
]# i! c# _$ d) P8 U/ o22
1 I: m& {% Z, R3 X! F7 H) K23
1 P+ U8 [* G; |( o: R24; x$ J7 |- `0 r* p
可以得到结果: + W0 S- F/ L7 ]; k5 o
) s" z" S' @6 L3 P3 S( @
--------------------- , G, d0 }: T4 @" U
5 Z# S/ |. b* x# p
0 F" W3 D8 a( e* Z
% y& A& h' ?6 i% h
0 @) Q5 C6 {8 q( D9 L$ M# a, N3 A- n2 K8 ]7 ]
|
zan
|