- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563415 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 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 b2 j% I* S, t- p! C& a9 ]
一、 从规划问题引入% S6 J3 a& l4 I) L8 u6 e
* G9 F1 p4 _0 v% s( J 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
$ B& \( O# v n1 i# O! A7 u( V& K' c0 G n( ]
二、 软件分析与选择
: m2 G+ X4 p9 H4 T
5 b" Z- X8 Z4 d5 \( ]0 q4 ]% I Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。$ r# h( |: Z3 `" R
7 n; b2 m" T8 L( p, x3 v1 h
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 9 w, q, t/ h& z% E& C, l, W& t
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 $ f# X% p; i+ [9 |& f( Y- D
https://www.zhihu.com/question/49319704/answer/165923451- Y6 S& ^0 O2 q
" |% I# d( H$ t1 k: D8 L# t4 }
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 * a; A) c2 x d7 ]* d
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 4 Z7 p( X2 R! m& [: [$ T8 y
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
+ s0 m% ?; A: i1 R( u
. K8 d& ^4 H1 N. e# X2 f 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。5 q, {+ |; L3 x" Z& G5 P% l/ j
; D2 }5 N+ e7 {. K) g$ D三、 如何上手Lingo5 e& b+ u2 [* K6 \
2 d1 d% C; h; P
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 ! L" @' t& ~# a$ A b( W6 @
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
' O. d! a: \/ {) Z9 M
- Y0 F" p! Y) [5 _1 i四、 Lingo的基本语法规则7 t% D8 Z. e B) q5 C
: }! y- L8 X( S, L( p. x7 q: N& ~4 O
1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
3 ^0 b4 Z4 i* O2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
' t" a7 a" K5 s* y2 W/ G3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
8 {2 K" a& l/ r4、可以给语句加上标号;
* _1 ~( O( {" b; S! O7 T5、注释以“!”开头以“;”结束; ; q( ~- l1 i4 G; o
6、默认所有的决策变量为非负数;
8 i+ ]8 S$ z& ^5 Z$ ]7 |7、Lingo模型以“MODEL”开头以“END”结束。 , P7 S* H: K6 p
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 3 N- e2 ~( h/ `3 N1 R) N% a
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 + |' y) W7 X: b- c: Z& t+ k ~ J* T
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
( n' H" }$ A8 x8 D" D
" p, x- M6 Z$ ^" G- h% S# p5 N* V/ o五、 谈一谈例子1 C4 V8 x- k; S/ Q! {, k
3 u2 ?3 w6 W- L& n 那么Lingo用起来到底有多简单呢,我们来看一个例子。- Y, X7 s4 ?1 ]$ c( R& w' g
* J" T9 W3 O8 w8 \ g% p+ J2 h
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
* K+ s( U/ I! `0 x, T& `5 M- ~1 ^4 o7 p' p+ o
每个书桌 每个餐桌 每个椅子 现有资源总数
4 W% a0 U; B, _+ k c- C5 a木料 8个单位 6个单位 1个单位 48个单位8 h- W! _2 }. W3 [: M
漆工 4个单位 2个单位 1.5个单位 20个单位
+ K2 b' p7 j& m" u9 S5 Q6 {木工 2个单位 1.5个单位 0.5个单位 8个单位
+ Y/ [# a4 [5 T' t* C+ v成品单价 60个单位 30个单位 20个单位 ! D7 l6 c- o1 _( ~, R4 i
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
, ^ A% h" I3 R0 l6 I+ i# \: p) ~8 d7 U( ^# b
解:代码
' ?6 T: a. d7 y7 k' j
6 F+ U- r" R5 V) Bmax = 60 * desks + 30 * tables + 20 * chairs;5 S; ]& A# z0 [, g9 ~$ w7 A& @
8 * desks + 6 * tables + chairs <= 48;7 U. t/ G$ ?5 f D5 {9 w6 U' B) H c
4 * desks + 2 * tables + 1.5 * chairs <= 20;
& ~# O+ c. R# [+ ~7 g 2 * desks + 1.5 * tables + .5 * chairs <= 8;
! X( n, v* `* \1 ]8 t) _; Otables <= 5;& J# ]% ]; j: O- ^7 f
1
5 z j' E' A) {6 q& x7 J, G# U3 e2! m. O, I! K1 m5 _% }# Z
3! [+ S1 f. s( z
4
% g. N x; n2 d, Y( V5% ]; \2 v) K; N7 }9 t1 s
可以得到结果: ( v" N1 {% G* X9 f
4 R9 }6 W* n5 w
这里的 Total solver iteration 表示一共迭代2次得到最优解。 ' }; z7 v/ j4 R2 c m
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 " |$ q- @! x4 P6 s6 R
可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。% p, K8 P$ J' J) D: O
7 p8 L' M7 j+ d4 m' D
例2:给定一个直角三角形,求包含该三角形的最小正方形。
$ F2 P1 w! v- p- W) G9 q
! {/ W2 e5 N/ z- [我们可以作出如下正方形: ' V8 R3 Z% S# u* S+ w
) z2 r5 T4 p1 |& j0 |2 I" k) X9 w
9 @/ a4 |) G( e CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx) _5 t* \+ t/ ~2 ]
转化为了规划问题那么正方形面积最小的时候即为最优解。 ! H+ H( f* R6 M7 \$ V; m1 o
代码:
0 M9 ~: ?6 g6 t5 U- Y
1 c$ ]/ ]& y2 n, P2 |3 X3 g" dmodel:
1 ~$ r8 t9 w# k- d4 [5 ^! Y0 t8 o( Isets:
0 v9 }5 }2 B5 k" h! s* N% `" @7 n object/1..3/:f;. G* l t( @' U
endsets$ @" a! T: C) z% L1 L1 p6 U0 Z* Z' j
data:. Z0 D0 Y" M9 U: v/ Z# `8 a a
a, b = 3, 4;
3 \* x4 } M6 _, Z7 ienddata
2 B e ]6 c8 i* \ f(1) = a * @sin(x);
4 H7 e7 j$ _* U1 R2 w* j f(2) = b * @cos(x);: h( i7 i% ~* j+ @+ @% E
f(3) = a * @cos(x) + b * @sin(x);5 ?9 ?' Y- {' ~7 V) n0 d; P
min = @smax(f(1), f(2), f(3));
3 @- X# g, [( U- Y+ X7 ^ @bnd(0, x, 1.57);3 p* z/ h; V1 `8 s3 T$ V
end
1 b+ g) V- E7 w( D8 V) k1 ]6 R1, p. L* o9 q. u2 Q8 |
20 I* \) e& e% @4 d* i. h4 ^! k
31 ]( I$ h2 ?) V6 x! d1 _
4& |2 N" w6 j' A/ E# a4 ]
5 l4 T1 h) c/ r& ?
6
# {% o: D, Q6 O w, f) F Q7
" m! f9 O. k) x. A8
( @4 H8 X) w) L% A. g9% m2 L6 X5 g5 W% |' L8 i3 S) Z P
105 [( s- L! U8 @+ ~: x6 N
114 |2 E# ?3 B+ Y2 V
12" e, N0 T _3 y( i7 m( c# B0 I E
137 E$ W# Y8 E3 @1 a1 o% z9 g# S
得到结果: - J7 y. p7 I4 @
% w8 E# Y. k% y0 |6 D7 A/ Q) I8 l6 u K9 i
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。) P0 p- ^( C- u5 p0 K/ ~
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?: X" u9 x. Q+ d4 ~) j6 l! W6 ^) ]- T
3 z% {* N* y; D+ O# }1 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
% V5 Z7 y- R: S2 t% M& i5 e∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj J+ h* `" _" |
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj, S6 t3 n5 X/ P: v" \
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。/ \- |1 e$ z& j- s9 E Y
( h9 y b1 ]; I! x' T0 W8 _代码:, t$ k4 J! S. {4 Q# v
$ R2 p+ `' U x( |! u# i
!旅行商问题;
( A6 a* ?1 b2 lmodel:
2 W' `3 X0 _% N( w* e& i; X3 j. Qsets:4 }% b" T& W9 t$ q. n9 Z) h9 w
city / 1.. 5/: u;
( j0 y; V$ K. v9 N" i link(city, city):- n- I' e0 D1 i4 j1 N6 \' _
dist, x; !距离矩阵;# n B' _: r. [" l0 l n- x" ]
endsets
+ _8 `! y7 k- O& F- E n = @size(city);, p/ f2 t8 I" C& o( @* b5 ~
data: !距离矩阵,它并不需要是对称的;6 N! E" C: z3 f8 Q) ?
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
! n$ w/ p. O0 ]& o7 d7 U A# Senddata6 n: k U2 K6 U5 }0 y
min = @sum(link:dist * x);
! O P* { z7 o9 X, E6 U @FOR(city(K):: J1 X6 C5 ^) m/ W k8 N9 }
@sum(city(I)|I #ne# K: x(I, K)) = 1;
0 [3 ~+ b* S4 a) E !进入城市K;* Y7 q4 E- Q* ` ^
@sum(city(J)|J #ne# K: x(K, J)) = 1;
: Z1 [ B/ p% [ );( N3 l7 [7 D7 X0 ?, k0 Z
@for(city(I)|I #gt# 1:
. F$ ]$ n7 R' n6 Z3 m w6 L @for(city( J)| J#gt#1 #and# I #ne# J:
# |7 c8 V4 `. E1 ^ u(I) - u(J) + n * x(I,J) <= n - 1);
: `+ @& M% G- Y! c( c- a7 |' }* D3 w7 [ );* u' s% L; A6 \6 l/ T; w G, m
@for(city(I)|I #gt# 1: u(I) <= n - 2);
8 J3 h$ v9 N! @) y0 j$ l@for(link: @bin(x));
/ o4 q+ V& U# send
2 G- e+ J: ~( M/ M$ P( c5 a1( j; N0 G* D1 L
2
8 h: [+ T0 Q1 u* m3
4 u4 g: D# F( M0 s: {4
6 T5 z( y" J: Y9 `5
! X) ]6 l7 U! v P5 |- |; d8 N6$ d! S( q9 v5 n+ w1 P& [
72 ], }3 X: K1 B1 O" t* _$ `
8) l) k; ?) h2 {. x; h) k5 r, K* ?1 f/ \
9
' g0 ]% s7 {2 r: n6 l, Y10: G, `, r/ x# O. T' C+ @
119 B$ {! [% |, U/ m' L
12
" ?7 [, m( W$ q# |8 b- p' @13
# {% Z8 {4 {/ r* d8 |0 S' }$ g+ ?14' D1 K( T/ M }. t+ V
15
9 S- h" {* l0 M0 T8 I U% p16
( y, g3 C8 U4 V6 A: r17
' c# f+ |, a) L/ _+ ~3 p' V- I18
5 V: y# R4 p! L% r7 x19
: r; N: C/ Y5 D5 ~6 d* O20, K6 L9 n) f, T6 L3 P
21! h+ T. \5 x, v( b5 K& w
22
% A" t! I* h) S23
5 ]" ]( }0 v1 H" Y24
' f0 `5 S4 P! z, H5 ^; W可以得到结果:
* W. a& S2 K0 f/ ]7 q6 A* y' t+ q9 m" O. B/ p- v5 b- t
---------------------
9 ]& y% P: ~8 P- {/ F. P+ Z0 P' _ j; {* G! g
8 M' [% Q- \' A3 O+ i( _+ L/ k6 G0 f
2 i0 C+ x7 y# m
1 x! D# _; ?( F7 z/ Z( h0 Q0 b6 R6 f
|
zan
|