- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569262 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176001
- 相册
- 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解法9 G. f1 }9 z0 n3 r- b- u$ n7 K
一、 从规划问题引入1 a; g8 d. K: d# G
. M) q3 ~' g$ J: S; I+ z) U 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?( y! j% g8 d- K$ I$ k6 r/ Y, p# b
0 N/ A; }: d5 r7 [" z+ M
二、 软件分析与选择
7 f% \ k5 |5 Y9 t6 P- @# h
v8 U+ U3 e9 R0 ? k Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。6 X0 m, G9 J& T
2 b0 C9 l( a* w9 h" M! L+ L; b8 ] 首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 5 {0 Q) b2 }1 P0 D# B
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 i, Q2 q% x" R0 H
https://www.zhihu.com/question/49319704/answer/1659234515 s I' p* S& u# s) z- i* P
; `) n% z& h @* t
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 ! Y; b1 M& y! K* t; G
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 7 V4 V5 h& e% O0 A
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
7 _7 p) ~% i3 h; k9 J8 I3 ]$ t0 |1 U
. G% P0 T+ ?8 m. q/ N: t( ]$ Z 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。 L1 f' w8 k5 g' P1 n7 m2 u3 n
9 c1 ]" i* j! k. B( i) q三、 如何上手Lingo1 i2 E6 S' m" X! U! x2 w2 E
* b9 d, k5 [+ q; ? o4 C
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 8 Y& F$ x1 \" n" ]
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
. Z+ d* [# v8 x: p0 {* I8 S
, G2 o2 K7 k& y! {0 z: g0 J$ a四、 Lingo的基本语法规则2 F3 n5 {5 `9 E9 Z6 n9 v
W) v) b# V ?- j1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; , k/ o1 J. q; K" Z6 q9 @: y
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; ' \# z& L" L0 o/ [+ w1 a1 X
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
3 o' Q( M J+ W7 T' z* M4、可以给语句加上标号;
( p4 f# z8 ?" q& [+ Z; @5、注释以“!”开头以“;”结束;
0 P3 m9 g8 B9 l" f) B6、默认所有的决策变量为非负数; 6 s z! R' E0 \. v0 c$ |. q/ Z
7、Lingo模型以“MODEL”开头以“END”结束。
: S! u3 @1 f' x: k% G" O2 B8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
I8 w: x: g6 J, T' c/ S' p% I% g9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
% H* g$ s1 U7 u' k' D* Z10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。. u5 z& T& A$ v
4 F9 H7 E2 ?3 b; R五、 谈一谈例子
/ c* ~7 J, [' R2 ~
\" |1 ?5 `- N y 那么Lingo用起来到底有多简单呢,我们来看一个例子。* T4 z0 g# N$ ?- x9 M4 w6 |
4 |7 u8 E' w' }4 x3 w* C( V; e
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
8 ^# Z: d* g% f* H
( [& v& M* ~ t4 E 每个书桌 每个餐桌 每个椅子 现有资源总数
! g5 r- s/ i% E, Z( O$ U& s木料 8个单位 6个单位 1个单位 48个单位
& I$ Q( k& y* k4 ^1 n7 L漆工 4个单位 2个单位 1.5个单位 20个单位- ^- v: C* ]1 c# i# z' z
木工 2个单位 1.5个单位 0.5个单位 8个单位
8 g: [0 r3 U$ _7 K" ?" K成品单价 60个单位 30个单位 20个单位 ) m$ l/ F; z N6 w
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?$ y5 Z+ M3 I. J& A. }6 D
/ T% N# M# Q6 r7 J/ U7 \9 i7 T解:代码
% [4 }4 ^& W/ H% B2 [! Z: b: `6 V# \' B/ N! k
max = 60 * desks + 30 * tables + 20 * chairs;
+ H& p I7 q8 c' N# ~) f 8 * desks + 6 * tables + chairs <= 48;
; P. x- E! {& G- _6 X 4 * desks + 2 * tables + 1.5 * chairs <= 20;: y8 u' q P9 G( i! G
2 * desks + 1.5 * tables + .5 * chairs <= 8;
, d9 \* L" o. A4 e! ptables <= 5;% n$ }9 X/ f( D% H
1$ |2 K( p" }3 a9 D1 p! {
2" g& {3 k9 z% V/ t4 W
3* y. s3 W4 n, d G& j) l0 m) }
4. t* D4 L5 i" k1 E5 s3 N: e1 Z
5
1 y R. A, Y$ a# f, m7 [8 }可以得到结果: 3 X+ ` @) i1 d9 c* y# s& ~
3 ?. V% A; u' u9 O, b0 s, I
这里的 Total solver iteration 表示一共迭代2次得到最优解。
, a3 R0 i$ e Z1 D: b7 W$ l Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
+ }# l+ m0 N7 [# l M0 \ 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。/ m D" Y- y* Z4 a$ i
; G8 C) C3 T: r# J h; C0 w6 f9 T例2:给定一个直角三角形,求包含该三角形的最小正方形。
3 Y+ X* O7 i' p+ q4 Q3 \1 K+ ? l. s2 |( ^0 ~
我们可以作出如下正方形: 1 }0 d4 a8 o4 o5 a4 m7 J d ~
; j1 s! o: O* O% x# o5 }& B4 ^3 G! G3 u' ]6 W; v
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
5 q5 b: H# K& k$ Q2 o1 ]: M; p- _ 转化为了规划问题那么正方形面积最小的时候即为最优解。
2 ]$ ]2 q6 r9 s: M% h4 ? 代码:
x( X/ d& l/ t5 ?8 n" k4 v* N
. G1 m' q0 A+ Wmodel:4 H% x2 \% e/ z4 N8 a
sets:
8 d$ r: X0 `0 ]- g% B object/1..3/:f;
7 u9 b% T) p" |4 Pendsets
. Z$ e; G# O5 T* L: a% o% ?% z* E7 Bdata:
2 b( Y3 [9 b' S0 e a, b = 3, 4;
! U. w8 c- j. h i8 L- H# J# \enddata7 @4 W$ o% X2 p, \" A9 H
f(1) = a * @sin(x);
. G9 D" f6 W7 L; k f(2) = b * @cos(x);
( v) z$ t8 ^1 z0 ~2 Q& T f(3) = a * @cos(x) + b * @sin(x);
, Y7 Q$ X; F$ {7 p3 O( `. ]0 P min = @smax(f(1), f(2), f(3)); l1 n! F4 E( ]
@bnd(0, x, 1.57);1 j$ K4 R+ n# j9 U
end
+ u/ |- C# w. J( b P( R( [- s1/ k' i w3 g0 \' s/ U
2) O. v9 P7 E9 b
3
! N1 j1 n- i" W# H: M9 Y4
+ c3 ~, Y0 d7 { u+ a56 q+ O. p3 C5 i* h' o) @
6
, `- A P: U$ D) ~ Q' |! t7- K1 X' o% i. D; p" {# @7 T
8
$ w+ O, s6 R9 z. A: J; B9
0 m1 E8 D) ~: L5 @$ ? O105 A. W. D2 y" H8 {. y7 v
11
. L3 f/ a! w: j( p12+ N& s; P" m' a( i) Q
131 D8 V# |5 B4 y; a' X0 j
得到结果: : Y Z: l9 l- o+ |) L1 b) ^
# a7 K) ^. q* `- I6 T5 M
8 r/ f" G# @2 q+ H: K8 g* G6 @% U 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。* x! p2 c+ Y% ]5 u( M
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
3 H7 ]! ]/ r+ J* }
2 [+ n! t0 V9 }. Q, _例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 % b+ m5 G1 R8 O7 M* n' V& b2 t
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj/ _6 C( ~( y" ^- D1 W
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
' T3 [' F b- a. [# k. T$ o由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
7 {9 ?& v6 ^( P0 c- S
. G4 r: }7 i, }, v: q代码:
1 g+ V! k, |+ o5 ?0 T6 Y% b& d( i) @ N* R) ]
!旅行商问题;
2 W3 w& G" n" `% ~% Q+ A. J; X4 Nmodel:
6 F/ q8 w" ~6 w9 C ^, E+ q2 J& g9 @sets:
6 x: @! ~: I+ U& c0 e( @ city / 1.. 5/: u;
$ I. {% L3 G( @# _2 d9 [' |0 O link(city, city):3 @( o2 P' H' w3 S
dist, x; !距离矩阵;
) ~ S0 y$ J* d, Pendsets1 c" U. h5 c, ~ N
n = @size(city);: f' u& j! |! s8 ?
data: !距离矩阵,它并不需要是对称的;
- m3 [( H. Y. t0 N6 _" s8 i dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;$ r4 n# F3 T( F( H
enddata
: c6 a$ [. A+ `! h. j min = @sum(link:dist * x);- I `8 Z1 \" L4 c
@FOR(city(K):4 _9 x- S% H9 P4 o6 a' W( a
@sum(city(I)|I #ne# K: x(I, K)) = 1;
* V4 Y$ l) m! f N- p8 N# C) }* A !进入城市K;
- i. S/ U4 S. X @sum(city(J)|J #ne# K: x(K, J)) = 1;
% G) o, Z, J2 |3 J );" |2 n9 u' `& @% [8 Y) ~
@for(city(I)|I #gt# 1:* e$ y: s! `4 T1 N# L. N: _
@for(city( J)| J#gt#1 #and# I #ne# J:* v! z' O+ ]) D
u(I) - u(J) + n * x(I,J) <= n - 1);# y- a* S- d5 J* s7 G, I
);
6 ^2 `9 I+ } {7 v, B* Y@for(city(I)|I #gt# 1: u(I) <= n - 2);' ]- D4 @. C% _7 h
@for(link: @bin(x));
& q* z- \( q) {- k4 {, y1 fend' N3 Q' |; o) d
13 d7 a- n+ [) K. @$ H$ \
2
/ t0 L4 H" ^7 n( L3 I) ]3& R" P% b" n% s- ?( r9 W/ i" K
4
# j. h+ Y( n1 O! V5
: a# u9 P, A, @: E' v$ Z6" ]' d$ E( Q) K- u2 Y) l `; t3 P
72 W7 N. ^ V* y, s4 ]
8
3 q) h4 q. ^( }0 A& I" k* `94 r- ~! d6 }5 Q* f. p! D$ m
10; E* |# X4 L+ g4 n3 O
11. ]2 K) j, ~7 G, `( d1 r3 t
12" b# d! R% I: I( G3 E" Q# N1 L! `
13
- c+ `- I; `: n1 m8 p* y: ]14; e3 f4 R9 \9 s- @' M) f8 {
15% I# q) z3 O8 n/ X
16
8 `* K% N$ r7 V4 E4 q17$ x4 u$ O( o9 u+ @9 n4 ]/ N
18
) I: s$ P7 `; a6 q# m190 I1 `+ h% d4 `
20
! l7 X s) n$ ?; l: R7 l21, |) x3 `. y' L @7 c/ b
220 v4 y5 m- u+ e" n# U* `
23
6 k' R, {0 l- Q3 ?+ ?5 O' n24+ [+ b3 k, W: a6 J; q
可以得到结果:
' j% Y5 D! w$ ~/ z; y* @4 t/ k- H6 P0 F' s @( x: J
--------------------- ' }! L% _, q X3 Q/ o- W
5 K! D+ R5 X# O4 `$ P. a: [' v; k; Z
9 G5 w$ T+ H* z6 k/ a) \& m6 D8 I3 S0 l& `) j
6 j1 f1 _. v; t4 j, H |
zan
|