- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 562956 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174260
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2-7、规划问题的Lingo解法/ h2 A* f" q. x
一、 从规划问题引入
# a- N% |/ E ?! e4 n' s. O7 r! m1 S; ]0 z
在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?0 Q8 `& ]$ `- _7 i$ T! C! M
. H( f( K& d/ b# J' ]6 ]0 u9 R6 U二、 软件分析与选择
# m" e0 T6 h! g" M0 R, r0 d1 U F' V8 K2 H4 y- z. h
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
, @. ~9 X+ q8 t' E7 p& J7 T( ]$ k3 B" X1 D
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
6 ]: n/ l: o- R+ G/ e2 b 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 $ }+ A: y$ G y1 Q0 b* E
https://www.zhihu.com/question/49319704/answer/165923451
0 j, D, P, o$ \& a. x8 T6 E7 D2 X3 s, E0 Z: B+ v1 ?
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 7 I# D% E! U U; |* ?3 l; [
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
8 D; }- U& N- s' Y$ J. e7 \) P 而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。+ `1 ?$ u3 f# |! Z9 o" t0 v# |
& Q! R" \! H, D' ?; x 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。2 o3 E* @( T; a6 s
9 W8 D* K; o; Y) I8 r4 [
三、 如何上手Lingo+ g/ `9 [5 i: {" N; q
* i4 C, J0 Y5 [0 }+ u
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
6 V$ W. B* e# `# {4 A “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。0 M' G, u2 e+ P- B, W
7 d5 F% j3 t6 C8 r+ c7 x/ W
四、 Lingo的基本语法规则" h4 n4 G8 Y0 f% `" E0 z
1 q) Y8 h- |0 _+ [" S6 O1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; - }8 K0 @# P0 L
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; / r+ S, l* M' e' W# ]% B& }4 l- t
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
3 t8 I$ @! H: M/ [1 w4、可以给语句加上标号; % b" Y1 f! W" N
5、注释以“!”开头以“;”结束;
7 W! h0 w0 f" f/ \, t; u3 V6、默认所有的决策变量为非负数;
`# _! x3 v& e) Z7 j7、Lingo模型以“MODEL”开头以“END”结束。
: e' ?9 M* x; @* u( P: d' r4 G9 X6 B2 ?# }8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 $ W' `. L# W/ b( p0 l5 M
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
( F# I7 T6 o" B10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
2 L9 x, j0 e: m2 [$ z. R
6 x& _' ^) W! ]) Z$ P* ^五、 谈一谈例子2 t L7 d2 l3 _4 k# ^# N$ C
) J( N7 @6 H5 z! I( A+ Y0 g0 { 那么Lingo用起来到底有多简单呢,我们来看一个例子。- T% {. M2 m7 ?$ i) p3 \8 p
7 P4 L6 g; R$ p2 |
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:5 k0 s6 _ }# P* N9 q2 D
" G2 V$ ^/ H! ~ i; t
每个书桌 每个餐桌 每个椅子 现有资源总数! v& m0 Q9 s* Q1 O8 u$ j
木料 8个单位 6个单位 1个单位 48个单位: M8 U4 H, e5 M: w
漆工 4个单位 2个单位 1.5个单位 20个单位 G) f6 j) N1 M# E5 L5 L$ C
木工 2个单位 1.5个单位 0.5个单位 8个单位
6 |4 k( [+ @" \$ o7 {- g7 i- x成品单价 60个单位 30个单位 20个单位 / |* W0 W: g. C# }* F- N
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
9 L# N4 K+ U# T7 c, Z+ ?! z1 B* |, O+ o" n
解:代码. M( A4 F4 t4 T v) z3 G, Y
: ?) @# _' ?/ _. e5 vmax = 60 * desks + 30 * tables + 20 * chairs;
~6 C/ f7 r6 V8 D 8 * desks + 6 * tables + chairs <= 48;: n$ m7 e' G, v- R( p
4 * desks + 2 * tables + 1.5 * chairs <= 20;
7 K% i8 j) T, f1 g/ F0 T0 o/ |3 w 2 * desks + 1.5 * tables + .5 * chairs <= 8;7 L! p) v( V& K8 U2 i4 @( Y
tables <= 5;2 L- ~; H7 i+ l' u W
1
+ K) v- n* W! f* w' t2
! @; j% B6 P) M8 Y3; `: r: y) {/ A' y; {, Y: N) q
4
$ X& Q% Z* z) F0 X C7 s m52 g7 A1 M& c# n" [: b& z# J
可以得到结果:
+ F+ d( X% {2 O2 B+ {3 S0 U4 J% ^. U0 w4 P& c) W
这里的 Total solver iteration 表示一共迭代2次得到最优解。 : X) O: |" l8 g; _
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
5 u4 `9 r# Q, {; d' l 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
6 Q+ C8 i- U8 ^# {8 Q: H* f) o, y7 U8 M7 B
例2:给定一个直角三角形,求包含该三角形的最小正方形。; j: {! L! J6 r6 u& `* s
- h) a( T! D6 N: P& b; U我们可以作出如下正方形: - t* y3 }8 q) H) L
9 t$ W6 A0 n. z: n/ I3 P. G6 X! F& M2 N) V
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
1 g. j% k$ _ ~7 c) |; |6 C; l' s 转化为了规划问题那么正方形面积最小的时候即为最优解。 9 O9 P, t% w% u+ x0 ?/ O
代码:4 w( }0 n) @! V7 A9 z1 f6 I
- f5 x( _7 Y8 }) u) O# A4 l. x" Vmodel:4 }8 d S1 \/ k
sets:7 E: e9 U! l) }
object/1..3/:f;+ l1 i( @. h- N! m" Z5 o2 R, j
endsets+ Y' U! C$ | d7 ?
data:. s, w- @5 `/ h( y: G+ J7 X* O
a, b = 3, 4;% A5 K$ o! V# }. X
enddata$ l% O5 `: P: k
f(1) = a * @sin(x);" W z- q/ ~9 D
f(2) = b * @cos(x);5 l1 y' Z) J/ W a' x
f(3) = a * @cos(x) + b * @sin(x);
" W4 I" m$ l C4 @# F0 t8 K min = @smax(f(1), f(2), f(3));
$ v2 A: l, d2 G# D+ R7 G# | A# H @bnd(0, x, 1.57);
2 p8 V, E6 b4 ~" p! G+ K2 J+ Jend( p4 U7 D0 c: ~: |
1- k; C9 i7 n: Q' D, v
2
( D' g, W1 R9 r3 g4 E; k; ^. e3" {# ]' {9 [& P( V2 e: x
4* ?! B: L( o5 z+ X
5# N5 A0 U: Q1 V. M- D
6
+ t9 L% u3 O w7
% C3 a8 |2 _& v: k6 p- K6 z9 ]! j8
5 b! `; d) z$ w; }: l9: K' Z# b6 w7 s$ s6 Y' g
10
/ n8 P; l6 r) q+ D1 V11
5 w' L" U' p6 T12* _# X% _( R* f4 ^
132 A+ _9 ^3 w# l3 F, Y8 h7 `
得到结果:
* ^* s: A U+ e ~2 z5 V! d. g5 k" ~* s
- b* _) J6 y4 R; v$ }3 J" H
- E" C$ z+ {: n 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。9 i0 f1 H4 v- ?0 m# b& `
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
: C C1 C8 e! h1 z- j, w/ u
$ L2 ?) D2 E" T/ b( d: i0 `例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 - q$ g* C3 g# f6 m& ]! r n( u- S# _
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
4 X+ `2 t! D, k9 I" d; N∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
7 P3 D, T3 A! `7 C- G由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。% ]( d+ l4 A% o* t( d: d7 G
/ r' @8 }! |7 G, s+ B
代码:
F( S9 ^) D1 e$ a5 X+ F* m0 N" Q% O1 X# B8 {
!旅行商问题;
+ M, m" q1 k& }2 |! m1 o3 ?model:
' W2 Y+ Z/ X% a7 R3 o6 r8 `sets:
% p A3 l9 o% `, `& R city / 1.. 5/: u;
; i$ }4 W) I1 @0 H link(city, city):
4 k# b/ ], x6 P dist, x; !距离矩阵;
. A6 G9 p4 G( {) P% {8 f3 H |endsets
3 z; K0 j; y8 p5 _8 _( M- ] n = @size(city);
" U8 x7 @! P8 l! ]4 I. B. c" @$ c0 Fdata: !距离矩阵,它并不需要是对称的;
: ?, A: k ]" y, N- K7 Z- g% q dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
* W0 Z9 A' r* A9 K$ ] K; j- Wenddata, e5 w7 W; i" c
min = @sum(link:dist * x);0 G' p$ C+ O" V! B; w5 ]; y
@FOR(city(K):& V ?5 _7 o3 ~0 ^0 {3 x( k# K8 F: z
@sum(city(I)|I #ne# K: x(I, K)) = 1;* s# J* q( }( Q
!进入城市K;2 Z2 e6 }4 S% x6 e
@sum(city(J)|J #ne# K: x(K, J)) = 1;7 Q1 K$ |* t( _0 O
);4 ~( a" W3 r1 w7 o2 T9 K& m
@for(city(I)|I #gt# 1:
3 p4 S) d3 A/ O7 ^7 U @for(city( J)| J#gt#1 #and# I #ne# J:8 ?# J6 {3 e; ?; W' A; l
u(I) - u(J) + n * x(I,J) <= n - 1);
( A( K. h1 s5 P2 z' i$ [ );* C$ ^% q( j; D2 H- J
@for(city(I)|I #gt# 1: u(I) <= n - 2);) @; K; z+ E' \1 G
@for(link: @bin(x));( \/ i: @+ Y4 [) H: g Y
end
- o! w4 u- |" O; _& Z- O e17 M1 V% ?- H0 [5 a2 ?; {( _8 H8 s
2+ _0 u- g( C0 y& y$ h
3
/ `5 V2 B; f6 Z/ l# G4
, i% V" W" w1 Z$ j: f6 g; s5
# n1 S: |5 b6 @# Z }6
! h( P8 m( m% N+ V! { o7
% \9 _( S& \4 z89 c6 p1 b9 E5 F
9
# \5 o7 g1 j3 G' B& V$ Q10
, r3 _' q# w* p% w) ]11 A0 r) d' e# r. R1 I0 b
12/ Z, o5 g; d1 V/ B6 Y. `6 V( G
13
5 M/ X7 T+ N6 Z$ s1 \- h14# `! o) u, F, D8 C# o* D. p
15" E0 Q/ m3 B) e' G% V( F
16
4 e3 [' e0 t x, M, t" M* w. @17
8 A( I: {+ D0 S18
( {8 H# m. d6 }" p0 l0 C19* s7 X- K! O, ]$ _( ]( J
205 U$ W) M7 ~! N9 i
21( Y" n/ n, x2 ^, K: x
22
: r; x1 N* y. R4 g23
: V( {7 [4 G/ z245 Q2 |7 @. {9 x0 |5 L6 X, r/ X
可以得到结果: / W5 E$ ]7 M( f4 c' _5 N
3 v3 @7 Q: Q8 C. y1 ?
---------------------
- G2 a! J) f P7 Y" @
6 p( @4 m! {/ _8 e1 _: M/ w0 P
, B. b! c6 I% s! w
8 o; X W7 T, h9 R! U* o; k
+ u5 y8 S6 b9 w( n) r8 u1 O/ N, }( Y8 e- a
|
zan
|