- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563327 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 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 }0 m/ T, I8 N/ r一、 从规划问题引入# U8 m1 u1 J, W" r4 R
" B* j/ ^9 t& W$ l6 q 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?$ U+ K0 M. e6 Y4 |: i5 H+ m. D* k
6 O+ Q7 Z7 w8 n! Q, Z6 c二、 软件分析与选择
7 _. e0 n2 r6 A, E, l' [: x+ O" I, b8 d+ s7 x# F
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
% s$ W8 j K- B' p) v* P
7 ]" n( A1 N/ C, s 首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 & V# e: Y8 B2 G* K. Z* B. g
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 ( b. H4 E( `9 @" ]2 u# T# `
https://www.zhihu.com/question/49319704/answer/165923451
3 j6 q. G! F( p# ?# f, \
7 ~2 S7 T; Z9 G' a! U- ?, J" ^ 用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 ; d9 @! ^% E$ K- Z6 Z/ H
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 . ^6 e6 S" G3 B
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。' ?: U$ _4 x9 |, } R- t( g
9 I* W& o" v+ p; p- n: z* X
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。5 L' b- Q# P, m: a( O" G" I
4 Z% k0 V' O* t8 o+ G( O三、 如何上手Lingo
* ^5 O# e* d; [2 F
: t8 [1 j4 p7 _8 P- ~ 有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
8 u& b$ t7 z, |3 y- u1 s “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。, {& O$ K$ d9 Y
, R! g9 [# r) g- S3 w
四、 Lingo的基本语法规则! Y9 \* u+ V7 {/ O6 t
. b/ ]: @' b- j" `. ~
1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
$ [0 w9 H$ s3 p6 p& d/ q" s5 o( D2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 2 W; ]$ ]* C; P" h
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
6 H' s/ j5 x* H% C9 C4、可以给语句加上标号;
; L$ i7 L) Y6 P7 b5、注释以“!”开头以“;”结束;
g) [/ [5 u$ N0 N; e L6、默认所有的决策变量为非负数; " I3 b$ q8 h, e4 v- Q. @
7、Lingo模型以“MODEL”开头以“END”结束。 + s1 S/ r, b" M0 N
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 & c, h/ F6 Y' C0 ^% j' h0 N- G
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 1 {7 p$ V$ x" M1 C# q4 d
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
0 K1 [" I; }( ^+ f# X) _0 s
4 e# s3 Z; Y* @& W% p* ~" ^五、 谈一谈例子
% o: d% ?) V) J+ |6 J6 E
& E/ p0 m! d: R: c 那么Lingo用起来到底有多简单呢,我们来看一个例子。
$ J! o- j& ?# `- _- _) S4 e
- g/ A6 S) @. {/ I0 |( h+ R例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
# Y) l8 y8 m" V: X, b- M Z; S* l9 ^
每个书桌 每个餐桌 每个椅子 现有资源总数* k# q" s a' I9 R" D" N
木料 8个单位 6个单位 1个单位 48个单位
" L0 _3 t# Q- t) F: b8 `漆工 4个单位 2个单位 1.5个单位 20个单位
7 j( w b, E) X% Y木工 2个单位 1.5个单位 0.5个单位 8个单位
) w0 k, l B( U! k成品单价 60个单位 30个单位 20个单位
5 }6 r7 O5 G8 z+ h8 L; n: Q1 f 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
7 @" U4 m! C& R+ j" r% u. e
7 v6 E4 q! D# _# j b1 f: S解:代码9 q- O7 Q4 x4 P% h
0 k: h, ^$ w" T: z0 F
max = 60 * desks + 30 * tables + 20 * chairs;* r9 F! \* ~$ B! `- F. H: c6 j& G
8 * desks + 6 * tables + chairs <= 48;
4 y1 t; s e; [+ V- z 4 * desks + 2 * tables + 1.5 * chairs <= 20;: N+ _9 T( w4 p& j/ ?
2 * desks + 1.5 * tables + .5 * chairs <= 8;' `9 W) c* |8 J: q
tables <= 5;9 Z, Y0 }! U1 H% }' _3 R; X( N) K
1; ^; ?9 b: w- c7 F4 ]% _2 E4 f
2
$ g7 N9 Z- S4 h* P" }3
2 l3 {' }9 P' q4
B9 t/ m# e( @9 U/ {! A4 P4 j1 K& P5$ x: f3 i* d2 ?
可以得到结果:
$ g- ?0 j7 }4 I l/ d6 ~6 M L
8 V: r) V+ I9 h% u 这里的 Total solver iteration 表示一共迭代2次得到最优解。 ) w1 b7 h# _! \' v# c
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
1 S2 O. v8 F& _% { 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。7 m, W( F* N( `) T" w
) ?5 N# a% o/ t5 y$ [
例2:给定一个直角三角形,求包含该三角形的最小正方形。1 p$ O, ^' y3 M1 O- n, ~, r
. s$ U: M2 w; V" r我们可以作出如下正方形:
F9 e! D3 }( Y1 N/ [0 @+ R1 y7 v& g" `
' F5 s$ I1 h! p% E* E
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx7 Y& w! o2 m, q6 @
转化为了规划问题那么正方形面积最小的时候即为最优解。 3 S; u' ]4 j$ L7 q& R/ X7 l
代码:
% o' W4 s. f7 L0 R0 ~) o6 k9 `( _: t" T% H7 o) X5 P6 M' Q
model:' l7 a1 l* F- R: e5 Z
sets:0 L- n. o$ O9 Y0 T* s7 X4 r+ v
object/1..3/:f;
" f' I8 B3 I1 c9 K* [endsets
2 Y+ \% |- ~* S+ q1 ?7 `: cdata:
; L7 @" W) g. B3 t- k. ` a, b = 3, 4;2 z/ u: P S2 Z4 f3 ?/ L
enddata! o! n9 k- r/ O9 U& h4 U% a
f(1) = a * @sin(x);3 w* h" ?# m8 X5 q6 K
f(2) = b * @cos(x);7 Q4 A" j, G5 J) K) K
f(3) = a * @cos(x) + b * @sin(x);
5 L( z% U8 ]; Q5 R2 a/ ~0 c min = @smax(f(1), f(2), f(3));6 Y) c$ @7 U, G- Q, p
@bnd(0, x, 1.57);
5 {, K$ U* F2 Xend
' i5 Y% h ^: U- v. f7 c1
4 k' N; c. _9 L: {' e2; Q5 h- {6 P& e1 X8 r
38 b; b+ ^; S; K1 N& i2 I7 e, q, `
46 P7 O: F& ^6 E, P+ G8 x
5% x$ @9 v2 f0 c/ b4 M) F( S
6
7 b8 s: Z/ r. i8 G& D q7
& i! b8 ~0 D5 V0 }2 {84 t% P6 F& Q- n% @+ }& h1 \! X
9 E0 g& p/ k5 y1 c% G7 c
10
. Y/ ]. J: O6 e6 M8 ~4 z11, c- ^5 ^: x6 R' J1 Y0 y
12& b! O$ P$ r! u+ a% L
130 H( ?9 A5 B5 f) W
得到结果:
& D1 x6 b' f6 r+ R9 `8 ]: a
- P4 O! y/ X& n& t/ D7 Z2 G6 ? d; x# R8 m6 J! Z
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
, a0 N7 E2 N2 h. B 那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
+ ~. }# v& x$ I
5 b: S: T c- L7 m6 f( s例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
, \$ U) p5 Y3 D3 K∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj$ J( Z" K4 ^" [ ] p9 g: B
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj7 U. O- ?- m5 O. `7 ^' ?5 D$ x
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。# r% D- b2 `1 T$ V% q
! C/ O t* Q, p& B4 K' |
代码:
4 F) C2 P8 O+ o
' d0 [. Z- c* `" b- h! [* v+ P!旅行商问题;* s% d5 p1 C9 z: G
model:! [5 T# T% M! R& Q1 ?9 ^
sets:
2 o" B" u+ h/ E city / 1.. 5/: u;: R5 Q7 d( L' N8 N; y
link(city, city):
+ \ q" T/ j$ \ dist, x; !距离矩阵;& e5 _- T9 v2 x, ?9 U8 \% Z
endsets# |: D/ p, ?7 p5 j. }& B
n = @size(city);( ]2 Y1 q6 U- a2 d4 Y' y1 a; M
data: !距离矩阵,它并不需要是对称的;. F0 [4 W3 v3 I( x
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
6 x( C$ A6 h: W# C0 r# Oenddata
% [; v5 T% p7 V- J; { min = @sum(link:dist * x);
" C$ r0 i# m8 @: j) R @FOR(city(K):
- t+ o( L. X9 L$ B# @$ s5 j @sum(city(I)|I #ne# K: x(I, K)) = 1;1 y; W$ z; v W* k
!进入城市K;) f) ]0 U# s* j+ X" h' x, a8 l
@sum(city(J)|J #ne# K: x(K, J)) = 1;& r9 p2 C2 }' ~+ O; `" {6 }! ~
);( x! m; J1 R0 {
@for(city(I)|I #gt# 1:: Z- [6 w! w0 @! s) K0 ~# M
@for(city( J)| J#gt#1 #and# I #ne# J:
! d( r: @' D* g- v4 t+ Y. w u(I) - u(J) + n * x(I,J) <= n - 1);
7 v: Q/ m2 G) Z* F! M );+ U+ p# ?7 A5 N( U I( ^1 S7 k
@for(city(I)|I #gt# 1: u(I) <= n - 2);4 \: d2 F: J3 f
@for(link: @bin(x));' J. e4 [1 V& n; p$ V& C8 C
end
/ y$ r' L! v0 _2 y6 ^0 i4 a1! H+ U7 u. K# r* d8 b
2+ E2 b: v5 R: {" `) l
36 r# F7 b, Q" g) U$ G. P
46 w1 k# m+ ^0 G' O$ f; p9 j4 x
5
0 F3 f9 Z4 M+ e6
0 v. E. L' E3 h" I) L7 g! f! H4 v7
5 n, V& W' n) D1 D0 D8! p+ Q2 r P- ?2 Y' X
9; t5 V- }& e0 E9 z& E# E4 i
10- ^) L8 Q6 B4 H3 H; u1 L
11
1 s* V( t) ~3 X4 J: b# x# R12* h- F# W5 z: ]
13
- B8 ?6 W$ t, ?14
; _- \1 M4 O; x' `. K* u) u9 e151 J+ y/ H8 w% ]8 d- m
16
3 A1 y+ X! ?" U0 u17. x) N8 d* ^2 ^& m7 y
18
1 V2 Z: `; P" l$ d- S+ Z6 E19" }1 h: A0 W+ B6 C) j
206 w% ^! S+ w' A! Y5 R+ Z
21
' l+ X, R' r+ A22" T( s& t( H4 r# N7 d. y4 M
23
4 v, D0 Y0 L0 m2 k8 r7 V# |249 a5 i3 ]% v3 ]- `) G- h; o
可以得到结果:
5 k, O. ]; [- {$ Q- B6 l- X. t4 U+ y; i7 }$ H+ G
--------------------- ' z% l( e- S, N
# | Y( ]/ _" F0 Z6 F, f
8 R; C5 Z. @% Z6 ]# d: H' R
6 E8 |2 o$ G. C- J2 o) ~' }0 H7 v- W: ~ G/ j) T/ g& h
8 Y( j( d1 t% I" u" d- S
|
zan
|