- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563307 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174215
- 相册
- 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解法
$ ]$ W" r3 j: v% h* F一、 从规划问题引入
, x1 W, q1 }5 T* |8 W+ r$ R1 G' W# t- w) ?0 l+ q- i7 P& \6 V, q
在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?! ^3 D8 ?- x- q
k, t0 S3 L6 f" [0 K" M" v二、 软件分析与选择
5 u& `; A$ T9 X+ U# N2 A8 L) A' x1 ? e! Q
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
2 r1 K/ Z. m$ U' U- O
9 }1 N9 @- h$ S6 P 首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
/ S6 i/ S3 R7 y8 } 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
3 C4 X+ K; e! f* f, Mhttps://www.zhihu.com/question/49319704/answer/165923451
% w8 b- ], E) K, c8 I& M1 T' C5 T. N3 Q+ }. L- a2 c
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 % n, h% f3 D$ d
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 1 c! g/ M# [0 g8 W7 }* t
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
$ a' r# x* B% D3 f2 [
$ I5 ?7 w: X$ R" ]$ ]0 | 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
) Y' q* D& C- }9 @7 E/ S
# H6 h; J, {0 {1 l( K( y, [三、 如何上手Lingo
' H: a5 n+ V3 w' z9 d# S) Q$ `3 Y; {4 W" X; E: b. H
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
& i2 }3 Z# u( ]( { “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。9 g5 C/ o$ X0 `% Q$ X
4 v1 _8 `8 C( O6 W# _
四、 Lingo的基本语法规则: I' p9 s; G+ m, K/ D; n
) l: j) x8 k# E! R2 v% o- G1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
) J% l+ F! B& t+ L% x x* g' b* R$ s2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
7 c$ }4 T% E' z; y' c g) M3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
! ~+ X7 o5 h. `* H# S4、可以给语句加上标号;
5 E/ o5 o9 }2 t/ e% H6 @5、注释以“!”开头以“;”结束;
/ y& T) B* f7 Y# p6、默认所有的决策变量为非负数;
4 ~( Q1 p: \) g+ U+ Y7、Lingo模型以“MODEL”开头以“END”结束。 * d% B: P4 _9 A- k/ M
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 2 C( O* u6 C% w8 o6 Y: P2 `/ Z
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 8 |! \5 v5 H4 a( H0 K- f' B
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
/ k: _! Z' g }( S. ^0 O5 \; P& F: h* w8 ?. u, ]
五、 谈一谈例子
7 K& g& y' D" x$ {' k; L' L8 g6 a% {/ Q) o, z& }# ^, U0 ~+ q" y
那么Lingo用起来到底有多简单呢,我们来看一个例子。
3 ^3 A& r3 u! w1 G; o" o. v
9 O( O, |, E# [7 g: \) N例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:) {! h/ l! W& l, P0 G
) [# m$ m( k! c( C 每个书桌 每个餐桌 每个椅子 现有资源总数
) }$ L- c4 h3 b; B, W" z% p4 m6 ^木料 8个单位 6个单位 1个单位 48个单位
+ K* K; S5 z1 ^7 }* E0 [漆工 4个单位 2个单位 1.5个单位 20个单位
: B- f+ y% U( K木工 2个单位 1.5个单位 0.5个单位 8个单位
2 O1 _' b" G; Z. P: v成品单价 60个单位 30个单位 20个单位 3 m9 g1 D2 }+ v5 S7 z" Y; y
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
1 F i' o, q: [4 U- A$ l8 m, V3 c" F' m h2 f7 W' _) r! q& W
解:代码
( R# ]5 Z# Q' m$ g5 K) V* E
5 Y# I5 \8 E' t7 O( q6 K8 v/ E: {4 omax = 60 * desks + 30 * tables + 20 * chairs;
2 C, M* l1 v4 Q* j 8 * desks + 6 * tables + chairs <= 48;
, }2 z) O% F( G2 K5 i1 u9 j9 m 4 * desks + 2 * tables + 1.5 * chairs <= 20;
, E$ @6 a0 P9 W6 D2 A& \ 2 * desks + 1.5 * tables + .5 * chairs <= 8;: }3 r* D9 P5 g, w. H
tables <= 5;
8 N0 b, P* J" y) z0 Q; B1% \0 v; ^8 ~' i. c
2- @/ a1 P# b8 X
3
0 h9 S; D: [, k8 a% k t0 A4
: ^+ e a1 j: q4 h5$ {* H: \$ N: ?9 ]6 V4 f$ C
可以得到结果: $ |8 ~5 _" n( ?8 P) C1 A' d4 X
8 M2 v4 @# S& h" M3 C; H/ z 这里的 Total solver iteration 表示一共迭代2次得到最优解。
( i) ~, u# F6 l; C5 ]( Y0 m6 j Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
: q# }! |" T- R5 L# L F, | 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。5 [( a1 m4 I& c+ l
( I% J' t7 V9 ^6 w" J' q
例2:给定一个直角三角形,求包含该三角形的最小正方形。( ^' L1 T8 a2 B- Z
N& F9 c" \4 H+ _5 T
我们可以作出如下正方形: 5 d2 `( s2 Q5 E W
% h8 p U& K4 h0 h' L4 K
. P g9 }& n5 X `9 ~5 N8 k
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
$ e+ B4 R1 I- E9 D8 Q) W 转化为了规划问题那么正方形面积最小的时候即为最优解。 % v# z" _+ }& |3 P9 N; x
代码:; l. d/ S& Z1 f8 h& L% B
3 T) R5 |9 w( [1 v: ?7 ~model:
. r" g0 |/ D+ M/ W$ c) dsets:# O) {0 b- C% P2 s( ~- }3 W
object/1..3/:f;
5 O! }2 X6 b6 \: a) N7 {: ?endsets2 H/ U, Q7 b0 h# h/ D# M2 {/ T
data:
3 H$ m: [* [. y y' { a, b = 3, 4;
2 b1 S F, N) x8 H0 G3 Q: U W' denddata: a+ p7 R& o% ]4 c$ G4 y/ h
f(1) = a * @sin(x);
: t" {; C. e7 g+ ]& m7 P f(2) = b * @cos(x);5 L ?: q( z: X6 v; l. @
f(3) = a * @cos(x) + b * @sin(x);
2 p4 C1 V H' g. U! q" b min = @smax(f(1), f(2), f(3));# Z" k. f$ C" d+ _, x3 \
@bnd(0, x, 1.57);
! ~" q4 p" q7 mend7 w! h% V/ Z r
1
/ b- h+ h Z. T7 D1 W6 {5 N1 w, J2
Q& l( v3 n" ^$ g3 \7 ?3 a, Y, z( n# F% g* _1 j
4: e8 q) \# N) U( z1 i
5/ c/ E: I3 U4 M3 E& Y8 B
6% n* s9 e9 S+ X! \2 j0 o
78 k5 a f; i3 b; p3 z' [9 J7 T
8+ P& ]' V+ ?( P! W! `7 f1 B1 |
9: d# C% A! Z7 |% M2 ^
10
# V L5 h8 r9 m2 j+ l11
2 ?9 k, O, _, ?. U* }12
9 \9 R% _ B, R, w* c137 F! D6 Q6 M; k. u. w* q' P
得到结果:
4 ]' M. C: i: H- \ k) S
1 _; K$ u. n4 T( S7 p/ N$ h* @
- a6 c6 o2 ?# j8 h) e' R 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
! q6 I; l! |" o6 q6 T 那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?+ ~! {; ~1 U- }7 U" c# I: p G% Q3 u
: R3 D9 D- G% L9 p* I, ~例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 * {6 C/ P5 S4 u7 k/ i. Y" y3 \
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
0 C( n" \( s. j9 v; `# U$ j∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
$ @' `3 C: i+ ]9 Z由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
) D& i3 T) X& A: l% o- P8 S6 V T# q" V# k, l
代码:
& X# C: b4 h3 R. ?2 Y5 u \7 s+ _2 @% B T* D2 W
!旅行商问题;
1 r3 V2 a; p1 m- q( [4 Qmodel:
& a) \% F2 h: Z, Z1 ksets:
* `* j6 `% K& c3 g% z2 r O city / 1.. 5/: u;, D- \: L( n5 k7 a# E: |
link(city, city):4 n8 {8 {- e1 `) e5 b6 `7 A
dist, x; !距离矩阵;# b0 a1 R1 X, m' v! W) F q+ o, V" |( s
endsets
+ }; p% j# S. r n = @size(city);' Z9 A4 ~/ X+ @& Y/ v H( H
data: !距离矩阵,它并不需要是对称的;
' K/ c M9 a0 f x) u5 @4 V0 @' G dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;$ h: o: c+ j* k4 ^4 v* _( o
enddata
. P, n* u8 n$ |% W# _4 r r+ C min = @sum(link:dist * x);
3 E3 W& w, G) | z0 `- { @FOR(city(K):. e, e' P( q$ \& T6 @1 Y# j
@sum(city(I)|I #ne# K: x(I, K)) = 1;; N: Q, T w! N U
!进入城市K;
: a7 R, w& f" u3 q5 X8 w4 l @sum(city(J)|J #ne# K: x(K, J)) = 1;& N, B& j! C( R, \* `
);
7 N( |# ^9 r0 k P" v* j @for(city(I)|I #gt# 1:
6 E" a6 Y) h, I! Z4 ?2 R' y3 a7 E @for(city( J)| J#gt#1 #and# I #ne# J:
, w- @* B7 q7 _: G u(I) - u(J) + n * x(I,J) <= n - 1);
8 a. K3 Q9 J; U) n8 c$ s );
|" l: L- U+ y1 r1 o$ J@for(city(I)|I #gt# 1: u(I) <= n - 2);
* j& ?( y1 G' Y: g0 h@for(link: @bin(x));4 J& D% u& p/ B) M( m# T* Z3 l: T
end* ^( J6 L+ H' T% i, N! Y7 ?
1
7 u: `( O ]$ d7 f3 ~2
# r" Y0 e- Q# L+ X/ }6 h9 M38 X2 V5 ~! E2 ^$ |+ l% Y
4
7 o ^: o- z% A) q- D- s55 ~. H+ V9 R1 S1 ?" K1 I; N
6( i. Y) o( j& K8 H g
7" L8 p. D0 `3 \3 e1 _" w Q/ [
8
4 O; b) m9 g* U7 ~% x% L9
4 |& \/ u5 `9 u7 \+ A- b6 T10+ U+ o$ I/ C- q0 l! K' o- @6 g& \2 J
11! q* Q, i; N @+ K# J7 W" a) K
12
1 C3 z" i! c; M137 c6 U& d( f7 P
14
: M% v6 d5 `* `+ }4 E15
+ W. H1 G$ P K' a9 Q% i16$ z$ ^5 B: X1 q( G! e8 D$ w
17
; e2 l! B$ w" d# P9 b+ s' q18
! S- S( G- w7 S19
6 ]' x* u4 G" w4 e# |9 a! h20
- l% R# B$ I& f% m# V2 F21$ }3 y$ b6 }+ D0 ]' f$ R! h4 @
22
- @( g; I5 s" O# E) t23
) C! I, h! J% \$ v3 k0 H24
2 r# O. @- K2 c+ F. K. Z3 X! x9 v! {% L可以得到结果:
) V2 @. Y6 v( C4 @9 Z! j
7 N8 Q# J% w& O( i7 p--------------------- 9 |. U F" X2 {5 G, J
# g0 Y& Q: [* d7 [5 i: z
7 }( ~3 q8 W4 e4 M8 l- e& ?/ A
$ }4 k' Q5 V; Y. W" ~! i
: K1 j- S: m6 v2 T
9 n9 j2 @) p S( w& {5 W |
zan
|