- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 561417 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173798
- 相册
- 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解法
4 F ]4 O7 }- \$ |一、 从规划问题引入
! c; A0 q6 B6 s6 ~ }) L
/ [2 ~4 q" k) J6 j' N 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
- `0 |+ g& `; J
9 [/ g; b! D$ n8 O) }( C5 V6 Z二、 软件分析与选择
4 X; ^ v$ L0 ~2 l9 h& l- X$ w* }
4 v; I- g2 L+ m Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
* C |; F9 D( ~) Z+ W( _$ }" O1 E- t: b P: [5 C# @$ H
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 5 n, q* @9 {# g4 R' T) a
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 7 U4 V; z' |, ~* N0 v" Q, R" a
https://www.zhihu.com/question/49319704/answer/165923451
6 s/ z0 j: R; |0 x' l! a/ ~/ p" j$ p: y. ^5 l; C& I
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 0 }1 Z1 M0 t8 j6 J$ g
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 " W6 g$ N9 E' K' G
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
7 c: o; H- x P A5 j9 p3 H' }6 K) @* p, S% p) c u
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
. F2 ^* J' E/ K& }8 |6 e C# b. }
0 m( r9 ]( ]! K; R3 M8 Q) d4 {三、 如何上手Lingo/ N0 z4 F0 n( f' V/ }
% k. a. c7 L/ ~" S' d" D
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
9 Q: i$ a) L( B2 Q4 m “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。! d f; v) s3 ~$ j
5 N9 B- i- ?' h9 l四、 Lingo的基本语法规则
- o4 z7 q) w+ H' j- {( F8 Q
6 A# x a3 [: k% y1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; $ ?; O. q- r4 n1 I$ r+ U6 a; `% X* s8 ]
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
( f4 u0 a& P* Y3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 6 j4 r% l8 G# C9 k! A7 \
4、可以给语句加上标号; ) o: v7 H! p/ @0 ?& e7 n$ E
5、注释以“!”开头以“;”结束; 3 t c' ?% s, f- ?2 z
6、默认所有的决策变量为非负数;
J1 F6 u4 e# i+ u7、Lingo模型以“MODEL”开头以“END”结束。
" ~6 f/ |) c! E( k# n5 z1 J* \- L3 u8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
5 N5 D( E* N! u3 e. A9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
; s, v2 W9 E. q! e0 n; ], ~10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
" V9 d+ J3 ]' L& ^6 u3 n; C V S# f/ |5 J
五、 谈一谈例子 X# \1 W* ]5 p; S; Y& g) ?
1 }/ @/ H1 q7 l( \' B1 t/ H 那么Lingo用起来到底有多简单呢,我们来看一个例子。' d' a M/ M) e! v% c, q
* ?4 t9 Q: N8 f$ U# B: g$ K. y
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
0 B2 S; e6 R- u5 `
. J' |: `* u2 @/ E6 x, p8 {9 J# ^ 每个书桌 每个餐桌 每个椅子 现有资源总数 m: E. g/ y+ H6 E" I/ D; k
木料 8个单位 6个单位 1个单位 48个单位
, n# q8 Z3 ~ _/ t a漆工 4个单位 2个单位 1.5个单位 20个单位% S5 C3 G0 q% ]: Y2 o2 `6 [
木工 2个单位 1.5个单位 0.5个单位 8个单位
0 x5 x7 q% L! f! c% Y8 X成品单价 60个单位 30个单位 20个单位 2 h6 q" [. t* K" F
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大? D; F" l9 k; I, L, M g
5 f1 L b b+ h' E! c4 _
解:代码
+ ~0 c f; q9 F+ F) m5 t3 ]
' ?; l0 `( H3 P$ m8 S! ]2 Hmax = 60 * desks + 30 * tables + 20 * chairs;
( Y6 r# `# \2 a0 b! U 8 * desks + 6 * tables + chairs <= 48;
" L" Q7 e. ~# w' n# y! o9 ? 4 * desks + 2 * tables + 1.5 * chairs <= 20;
' p; b1 m* }& c7 \3 t7 y 2 * desks + 1.5 * tables + .5 * chairs <= 8;
+ d6 W# k# `0 @tables <= 5;1 r* g# Q* y: Q' {) l6 U5 f, c; Z
1
: P$ o* T6 W' I, A- y0 Q2$ R- T- B7 B: Q1 ?: c3 z6 X
3. [7 }% `% Y4 U3 H5 m
4
5 n% b3 r) I3 K( U# {# y; {5
7 V+ O7 i4 I% |1 v8 s7 l7 }可以得到结果:
( r0 R# b8 ], F4 _$ A& G8 l9 v* {* r. V0 \( K. y l
这里的 Total solver iteration 表示一共迭代2次得到最优解。 / `- D9 W0 f8 b% l3 W0 H
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 + u/ o$ u' }2 X$ x
可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
/ G) [& Q# c$ H- R8 {. I$ P, @% n2 z; B4 }! U8 f7 j" e, f
例2:给定一个直角三角形,求包含该三角形的最小正方形。
& X, t! E1 h& V5 r% R
/ x. N5 @0 @/ O8 M9 S我们可以作出如下正方形: ( m: Q1 ~' b# ~0 Y: y# \. S
: c: B$ I8 `2 t$ t8 I8 c$ J
, D4 U% ~9 r* M! e) F CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx2 p t' g8 ^1 t \ H0 k; k; O
转化为了规划问题那么正方形面积最小的时候即为最优解。
. _- }3 ]; C/ o& R4 `. D; ~2 k ` 代码:/ @. o& z: L3 J3 I- \- |- V4 n- O
% D/ n9 C8 A0 ~" @, W+ G
model:
0 I+ @/ ^: X4 b2 @sets:
/ { v! e! o F) [' r$ u7 J object/1..3/:f; X4 E) @9 O9 R) C* ~- w
endsets
( f/ o+ K9 i2 a( z' n$ a9 r$ @data:
2 `3 f1 w3 ?9 V: b7 D) A a, b = 3, 4;9 M6 t* d5 X9 u1 E3 v2 D! G
enddata+ H1 a4 S! W; _; L d+ m
f(1) = a * @sin(x);
' C. z1 s8 I0 B# B# Z f(2) = b * @cos(x);9 u" J+ H+ K' l4 A
f(3) = a * @cos(x) + b * @sin(x);6 _+ }4 k) [. r4 z
min = @smax(f(1), f(2), f(3));
) Q9 v7 @. w* { [# M4 K @bnd(0, x, 1.57);: |2 {( j$ [% D+ N, z7 E* {
end
2 g6 [8 I9 N' p+ ~1
- @$ [1 d4 g% S2( h( a2 e/ P+ d) D/ R9 A0 A2 F8 S: e
3
" G6 N, c* F0 h- Q4
9 i m4 \3 X, i# j i" \5
( [' W6 T$ m5 X& k. Q: A7 n+ t63 o6 C. Y" J5 i" ^
7
3 M( R, ]+ v, [5 I- K) ]; ~9 k7 Z8& ]7 t# j' R. t4 M$ E; W" w4 r. S- f
9
& M5 {6 }0 t6 ^5 b! T% e106 y4 v. O# h1 G6 H& T
11
0 W5 ~/ p* E- P* T5 w+ |& T( b12" P7 y" V: \0 \4 b
13
: K, R- f7 x2 P 得到结果: 0 F0 m. Z( @0 B* r) v N4 Y0 r
G6 _5 s$ w3 s* X4 _$ G/ @
$ h! H8 A, I2 b, [/ U 这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。* C5 w7 r+ }# K$ u9 ^& b) W# ^
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?8 s3 o) w2 e, e s: `# B- |; T+ e
; i" S1 t! f7 `: J g例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
# ^0 j. l. ]5 t$ v% |∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
6 |7 M, W2 A( {+ e7 d" D" S∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj" }8 J$ U3 Y/ B5 H
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
" k2 I; X- e. [/ T7 w, M: x- X+ e5 U6 I+ A* I4 k
代码:
0 R+ ^ Z; b2 n0 b4 Z, B1 D% O: s
7 X4 k0 v7 d3 a2 d, {!旅行商问题;- m! O+ E z1 Z6 U, E {% a+ Q
model:6 S# J( F! J3 p! D ~9 r; m
sets:* R" Y) x, T# F
city / 1.. 5/: u;8 J; }# f1 W# m: G2 H# A8 B
link(city, city):
# _! H) L& n2 {, }+ o J# g! Y dist, x; !距离矩阵;$ e+ k1 R$ c( R, L
endsets. G- m n' N3 g
n = @size(city);
9 v' \8 O6 l% Q: b$ s3 J$ E- y7 u) xdata: !距离矩阵,它并不需要是对称的;2 N- \7 {1 B9 d& n3 q! M. N
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;( V. T+ G1 C) T+ ~; K
enddata% v8 e2 x8 D! ]7 {4 G
min = @sum(link:dist * x);, S5 v' A) T3 r6 ^" Y
@FOR(city(K):/ }7 l, Q1 `3 k/ k6 w+ @
@sum(city(I)|I #ne# K: x(I, K)) = 1;8 i. x1 Z+ B6 G; n% Y, {" n
!进入城市K;. K$ y( I- \# `: q; i8 }5 X
@sum(city(J)|J #ne# K: x(K, J)) = 1;
- w# n) N. {; x );
5 Q) s' m& c+ e! ]3 m" D8 ` h @for(city(I)|I #gt# 1:
% A( g# ?6 y# j' I: p H @for(city( J)| J#gt#1 #and# I #ne# J:& q1 P8 D) {0 q; B2 _! |
u(I) - u(J) + n * x(I,J) <= n - 1);3 n1 O% p3 Z$ j( g& w4 R2 d
);
9 I* X0 r/ V4 `; ]3 J- U% B, E@for(city(I)|I #gt# 1: u(I) <= n - 2);: k3 c' m# ~, z& S* C( a0 @8 B
@for(link: @bin(x));
" f2 q, j% u! u5 bend
! ?: S. X9 z" F9 c! Y1
) K$ ^* G2 W2 p" v7 N. @2 T2
' i5 ?, y. S% Z4 v& l% ^, y36 s+ ~% G# g* b$ h6 A; `
4
. Y9 X" [4 J2 M6 }% @( z5/ P2 d' L( y1 ~) a# Q( o' |) I7 p3 N/ X
6
- b# _7 X* V. u' b7, n0 l; M# y" n, |
8
; K& e# [- [: A( V% z! l: z& J( P* e92 K! d1 r* s. k* _( @/ U5 V
10; C4 s4 f2 g( l* D( f. e6 t% Z: J
111 v7 a P3 |9 T
123 @2 d" i& v5 ?' ~! P4 L& U
13
$ E( ?) a, j9 C- G. z5 x7 ~/ n" O14
6 P8 Y j, w5 V15
; ~1 O- O+ g' D16
0 U' V0 T& m! X5 [8 ^17& d; |! \' A2 M4 f% k. W
18
7 [: j5 j0 p/ _: m/ E( j! R192 x# `# }8 e5 p9 S ^
20* s2 Q6 e9 U, r
21
' }+ x2 W7 m- H22& ^1 r; s) f ?$ x8 h
23+ q" w# P+ I# U; B$ i
24" c0 L& D N. h+ s& y7 J
可以得到结果: ' ]7 l. N* G2 Q
% \/ S7 Q. f; `* _$ N. A6 I' W
---------------------
& q3 \% V* S2 R4 U% N! i6 V# b" n" b, ^ Q3 w
# \9 o% P$ V, ~" m$ ~, B; \9 p# H( g2 \; T
# j4 x' [! ]/ g, r$ w- r$ x
$ _; I$ }; f- K4 a7 I: {3 O
|
zan
|