- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563297 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174212
- 相册
- 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 ]: U4 g, l) `7 W; w( Z8 e! n# i一、 从规划问题引入
# A' s3 [5 l9 }( u
7 Q& {# {& z3 L3 h3 b 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?9 p4 ~5 g0 X. m; B# t+ X
# J" A+ V$ Q$ n' e# L% V* Q
二、 软件分析与选择
/ w8 w9 X& `. q1 ?. K
( g0 x# W$ a! Q5 G Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
6 c5 W6 l d S' @6 \6 h
" P& I" b: _ u. a/ q 首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
( p3 b' E" i1 N }( @# \8 r2 s N 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 1 _$ ]! Y$ a. M
https://www.zhihu.com/question/49319704/answer/165923451
/ v9 {7 M) I( o+ D& u6 K: X8 s
8 y+ {3 {) G5 a 用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
- p) a/ M4 z) f' V( @4 t- B 然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
0 F6 \/ _; b* j: | 而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
1 |5 `3 ~# M+ `
' c# u! {0 g" h9 s" T* o* } ]+ _" h6 J 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。 }5 ^' c; V$ U L8 g
' g. n5 [8 Y3 g6 t# l i9 X* L+ K
三、 如何上手Lingo
" ~7 ^0 x6 E9 w& ^" h
; ~& P& V6 I2 |( _/ n 有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 ) \; c6 r$ e0 `' \
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。! C* [& j, I0 N6 q- V; B; {
4 f# H: P; K' D) o. k2 I四、 Lingo的基本语法规则3 L2 B3 g" @ ]# |0 ~. d/ u
2 j# R6 j" }+ t# F1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; , G! p% b& O$ c- l
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
4 j# [0 R$ j- E% q) D7 P" u3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 4 W8 f6 W8 _9 h* m
4、可以给语句加上标号; 5 }3 w+ W3 R, H( {
5、注释以“!”开头以“;”结束;
/ I8 e: D: l1 c" L7 w7 R) w! p( T$ I& C; U6、默认所有的决策变量为非负数; ) H+ N g" g5 P" V" h9 q
7、Lingo模型以“MODEL”开头以“END”结束。 ) r2 \9 J; f/ H5 a+ J/ ~
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
9 ^; i! W5 u' z/ Z0 P; x9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 * z. P3 @$ |" Y; Z7 b( u6 y x
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。9 d- ?" S% k. Z* b
2 b X1 i& y/ n. h
五、 谈一谈例子% F% }; ~. d v! i
6 G" Z% t, D* i" b+ Y6 N3 _ 那么Lingo用起来到底有多简单呢,我们来看一个例子。
/ `0 Y6 }6 n/ A
8 O0 |% W$ ]' [1 s+ y/ g' C0 @例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
3 {) H M$ w% I7 y3 w1 Z4 u
# _0 D: K. y: s3 R$ J% L' _ 每个书桌 每个餐桌 每个椅子 现有资源总数
( s9 l/ e f- B" ~ k. d木料 8个单位 6个单位 1个单位 48个单位& _, V1 ~ m+ ~: o/ h2 _2 [: b$ E. {
漆工 4个单位 2个单位 1.5个单位 20个单位4 i, i- e. _/ t
木工 2个单位 1.5个单位 0.5个单位 8个单位
9 n& t3 u+ E& F( `4 q9 D成品单价 60个单位 30个单位 20个单位 " ?* u2 p5 c7 \& E1 D
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?5 X, \- w2 z! K6 C3 r
) G% I# o2 _( [/ X% Y2 t, ]解:代码
9 b& \; }3 @. ~+ [9 D3 n+ ?8 R
2 G6 |+ t# w" c1 a. lmax = 60 * desks + 30 * tables + 20 * chairs;
2 V4 Z2 l1 P% n7 W! y* b2 L 8 * desks + 6 * tables + chairs <= 48;3 v& Z* M$ A: x* y; h3 [
4 * desks + 2 * tables + 1.5 * chairs <= 20;* r& C/ u% f1 u$ Q% H: C8 { J9 W
2 * desks + 1.5 * tables + .5 * chairs <= 8;" C: f, [/ B, m4 u! Y
tables <= 5;
4 H8 U( d8 Z& b/ m- l6 q2 y$ ~* \1
& u8 v1 ]# }( q. M2
) q1 |! l# \# _ I. V0 \3 y! ^6 L% H/ x5 m$ n4 O( ?- { p
4 |* H9 P, ^& i0 v8 j
5
( C) H) J# c9 G0 Q! {可以得到结果:
% K6 G2 }5 l- }1 }' q+ T6 ~! J& y+ Z
这里的 Total solver iteration 表示一共迭代2次得到最优解。 - W6 C c$ {) @7 f* c2 O; T
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 - U- _) ^7 B6 M
可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
1 D! y1 @2 \2 W" p' T4 d- p8 u# ]8 X$ U$ O. N3 ?+ Q
例2:给定一个直角三角形,求包含该三角形的最小正方形。9 L; R0 W3 w% s
- Y2 {5 a+ O2 B
我们可以作出如下正方形:
1 X( Y" Y7 _# v9 g# h; T; Q6 S" t7 V6 U: h: @3 B+ r7 ?- g
8 E) \. T6 c6 i/ F+ Y2 L+ Z, U
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx$ ^. Z* w' R' v# }" E
转化为了规划问题那么正方形面积最小的时候即为最优解。 3 M% X5 E( w0 o, j% Y D) l
代码:$ i$ {7 i) v! c
9 m! m' z T; c4 H) ~( J3 T" }- l
model:
6 n9 s( R0 {6 p% E( rsets:* `- c0 X8 N0 C9 \2 }8 g
object/1..3/:f;
8 k& C# ]' Z+ [5 _' z9 b/ Qendsets! w6 u( `4 u- E. z0 H) y. A0 n
data:
) g) Q) T! e$ f' ?% r8 i a, b = 3, 4;
7 n1 K& `- }; p9 r0 |enddata: k6 E `; L6 o) a+ O& M
f(1) = a * @sin(x);
4 }, m: K9 {) _0 O+ [1 w f(2) = b * @cos(x);$ C& j8 n' P. ~4 `: z9 C4 a+ _3 A
f(3) = a * @cos(x) + b * @sin(x);+ r3 y0 X2 k$ L$ m9 v9 p/ ]6 K
min = @smax(f(1), f(2), f(3));( M+ }7 i1 m/ c9 y5 G! j' d
@bnd(0, x, 1.57);6 e% p5 D% b# e" s' J7 l2 h" h
end7 ^' X z+ k! ^, W$ P( N2 g
1
, Z% n+ m- ?% V) R, [$ X2
3 d, U: a: D4 Y" a; S3
0 E% p+ Z C h& [- S2 N( {4% I2 H( C, e/ w9 z7 h0 b S2 }, r# O
5# J" O3 p5 F( }9 N9 h/ e* t
6
. P; ?1 L3 ?; P" `& h7$ t( }/ [% C* j
89 |, _1 ]# u3 n
9( D! r6 i4 Z: h; Y9 y
10
- y3 \& ^) }& V; w) M. ^6 ?1 k7 M/ i11" \( R! V) ] w! ~% m0 _/ n2 i9 W
124 Q+ k. L! @$ Y' W( E R
13
. s" Q7 P- c* E r 得到结果: % J/ ~( R: M& Y& o# C& r9 H
" Q4 o1 T4 n- r
3 h6 G4 }, C" u9 o5 |- P7 p
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。; b5 l/ ~. c0 f
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?" i5 G5 D Y" }
% t, [- `5 z9 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 2 f7 q& `9 H, F: G
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj5 |# O& E9 c# X& o \8 i
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj8 w# r* z- ^1 X& K3 }
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。* K$ ?7 X0 j+ U( g- _
& C8 v3 k7 z9 y4 H) a1 g* ]; S代码:4 @# B% m+ d, O
4 c+ g! T8 e, t
!旅行商问题;( `( O+ c" R' C: L0 M" T* q
model:- K5 g! f( ~. r/ @' e. ]# e
sets:, y8 M$ J$ F; P0 g/ Z/ a
city / 1.. 5/: u;
4 U. g; C/ b% g) Y; [2 f2 n link(city, city):
' T4 s4 q9 c6 E dist, x; !距离矩阵;; I* D9 A' i8 l6 P
endsets6 |4 |* R- Z$ B) J; o0 S
n = @size(city);$ h; L, M7 M6 g% r
data: !距离矩阵,它并不需要是对称的;
" w0 D" e5 r- g/ H3 k3 ? dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;% A* J/ f$ B4 z N
enddata
; s" Z H' F, _. k min = @sum(link:dist * x);$ y' b, z) w/ D2 }9 H. n+ _+ v
@FOR(city(K):: c9 ]( r7 P9 m: R- L7 o
@sum(city(I)|I #ne# K: x(I, K)) = 1;: n2 y, i! J: o% B. U1 T
!进入城市K;1 B/ w9 ]. `. S, Z9 @$ C
@sum(city(J)|J #ne# K: x(K, J)) = 1;
) p( @8 }5 ^) T7 g2 N );. c% }8 `' s$ Y( |* f
@for(city(I)|I #gt# 1:8 o5 _( n6 S2 _2 N
@for(city( J)| J#gt#1 #and# I #ne# J:
6 ~, G; _- n7 x! Q0 K# K, v* Q% F! N u(I) - u(J) + n * x(I,J) <= n - 1);/ s( j5 }7 T9 k
);
/ D& H; W' T# a$ f8 R3 `1 F0 C2 z@for(city(I)|I #gt# 1: u(I) <= n - 2);# {, {9 P! M. B
@for(link: @bin(x));
e) ]' u2 |3 i4 {( c$ g4 Wend
5 r1 u. u h- M: e/ D7 @; l+ R1
& {1 r. i( p' h: m( `2
" k0 c# P, I: {1 S5 ^3 W" h3
! g" e0 x0 S( w' q! u4
: X9 U" Q, p3 Y/ |2 F3 I5
5 q$ p* B$ P! @6
$ w/ R# U: W2 J7
0 Q; h! V& z& I8 F8
, h+ l' |5 [1 E- x- t( R9% }7 [# I4 \3 [ O. d$ T( T
10' d M- t; b9 d, k7 t
11
# X5 ^2 u! h$ l% {% p% l7 n12
! `3 k; V6 H/ j. S136 l0 g$ @3 m) e) J: G" ^
14
1 ?, o h) m# Z3 X# X4 ?4 V& D15
7 L/ {& ^ Y; I- L1 q) @$ g# d16
# k# R" A# T2 a) V17
- q, o0 _. I3 B$ F) ]18
% x. Z3 o. _ U9 B* U# j19. m) z9 ^' x$ V7 Z3 m. D0 W
206 _ X. g- X) j Y
21. |2 Y1 n" B" {
223 ]4 O' W k8 D; w8 Y
23
) d9 K0 m' n J( u. w& _24
1 s* X) Z9 q1 ]7 ^/ m, d3 [可以得到结果: 5 `, U( w- X( _* h) Y: v
7 P! R5 U$ K9 e9 M F--------------------- 3 @% s) H3 a2 D( Z8 {
2 ^2 O4 u% B1 \! E$ R9 ?- n# V( V- _/ { {/ E6 w
2 ?; G8 v. u0 D8 {1 Z, e
5 d/ B& O& b% \$ t3 ?
J' C# B. T7 _) c( w |
zan
|