数学建模社区-数学中国
标题:
2-7、规划问题的Lingo解法
[打印本页]
作者:
杨利霞
时间:
2019-4-25 16:16
标题:
2-7、规划问题的Lingo解法
2-7、规划问题的Lingo解法
- h2 C8 i/ A* _
一、 从规划问题引入
2 r+ n B* G- Z: u
1 Z, X+ k$ d, s) D, S7 Y. w5 r
在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
& a' P+ N* |/ X1 a
1 N K- B0 q1 b1 D- d- \8 i; s
二、 软件分析与选择
3 o$ d, ]0 e) R
^( c! M# w% x: D& z) Q: v, r
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
5 \" p! R' A8 Y/ u7 B& M/ J! S
9 c% J& }* b1 Z9 F4 ]
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
8 T: H' }; g% z
而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
* ?/ a$ {! Q. F* } C/ A) N
https://www.zhihu.com/question/49319704/answer/165923451
( { k9 p. x4 g5 J
6 L, x4 D1 b) `, x0 z7 I
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
. G) b& J8 b* `7 V. k3 t0 I
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
$ o1 e+ g# A9 u% j0 B
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
$ k+ ^- o. ]6 i% K0 v
1 H( P! B/ Y2 N+ [
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
6 A7 V$ ]. X& n
8 K U5 H1 y* w6 b) x2 w
三、 如何上手Lingo
* i5 q% E2 o# a! _+ v5 p6 X
4 w9 q& L* r. o, i
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
( x1 e1 i; _. Y% N0 ` ?4 _9 ]" W9 G
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
# L9 u- y# N A" A, w+ l6 r: T
: `) E# R9 L7 {
四、 Lingo的基本语法规则
5 d( m p3 Z* u
( z0 x' S, Q5 q; R) t
1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
/ r) t& s9 L5 C) h R
2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
& u& l" x! H9 @( L+ m4 ~) F6 h
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
1 i/ g, c* j @, h2 }4 {
4、可以给语句加上标号;
& Q6 l o" \+ q
5、注释以“!”开头以“;”结束;
/ d! H1 U d/ ~8 Q
6、默认所有的决策变量为非负数;
x$ A* i' i& M& r
7、Lingo模型以“MODEL”开头以“END”结束。
, w+ ]" ~! F1 K
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
1 z+ r, E' c( m1 @, t/ t
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
* g5 R; e9 e7 v3 b2 }
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
1 N/ D0 y5 T9 u7 ~
( i+ k" W2 W- P3 y+ K& K+ q
五、 谈一谈例子
/ w- Y6 @4 \* I0 E) H2 |
0 ]' L& ?" Q5 G( |
那么Lingo用起来到底有多简单呢,我们来看一个例子。
5 A1 V0 r( P* p* _
) G# `" Y; \) Q! w v- r2 E/ W
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
! I' S$ y, r2 J2 J
3 z, ~4 m( v& l: f& n) M4 ?
每个书桌 每个餐桌 每个椅子 现有资源总数
$ c4 [/ h0 t0 I& K
木料 8个单位 6个单位 1个单位 48个单位
2 Y {1 q! b! x0 b$ u, h
漆工 4个单位 2个单位 1.5个单位 20个单位
& g; A# U+ k! {6 D9 @3 H2 G: `
木工 2个单位 1.5个单位 0.5个单位 8个单位
! F9 k/ g) h+ c2 \
成品单价 60个单位 30个单位 20个单位
# h/ ?) u. t$ Y% U; ~
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
, l3 i% P( V. T; Z( [2 |
, @3 {! w9 A2 G# `, J' I2 e( i3 z
解:代码
4 X% z; S% ^. x& o/ o8 [
: |: i( O8 I7 t/ F7 ?7 [4 C6 }& H( w
max = 60 * desks + 30 * tables + 20 * chairs;
% o! u- a4 e; m' L0 j0 V
8 * desks + 6 * tables + chairs <= 48;
- h$ S4 g9 O! m/ L
4 * desks + 2 * tables + 1.5 * chairs <= 20;
$ K# p$ V- Y7 s( a: { C
2 * desks + 1.5 * tables + .5 * chairs <= 8;
$ g* _- q: T# ^7 D* t
tables <= 5;
* }- _. C' ^2 S" y) u
1
! Y- D) @9 S$ x$ I& n) l% c, n5 B
2
+ ]2 `/ M3 p w. V" ?3 E; a
3
/ }2 J, _+ K: z0 V
4
9 w! c5 H. M% D$ v; T
5
- r- l* F8 ?( @( L; c
可以得到结果:
% Z# h R7 L# r5 J# O) I
$ C' x) v: P0 v& L9 p
这里的 Total solver iteration 表示一共迭代2次得到最优解。
! v. O& K. Y0 C2 u- H3 |" V& A# W
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
2 d- W, o. M) d; w' ]4 F8 X( m! {) m' J
可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
8 \/ U" t8 w+ ^( D2 ~
) U" m" F, @1 }$ {5 U. F9 s
例2:给定一个直角三角形,求包含该三角形的最小正方形。
% q/ H; [ {% E) y) }0 ]2 D
- j8 J3 w* S0 O5 G) k7 m; v( |
我们可以作出如下正方形:
' `5 y/ d# p, X7 S z7 V6 o1 t
( h6 t% `2 n' y7 e
5 q) q# C2 M% _
CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
8 c1 F' W5 F7 |. J' C' ]
转化为了规划问题那么正方形面积最小的时候即为最优解。
6 @6 g; g7 A- t3 h' _9 ?4 `
代码:
3 b% m9 b: |9 h+ \3 N
4 m* c8 s* T1 O O0 d* N' s6 c
model:
- o2 k# f0 i+ S1 N B& p
sets:
6 t* ?2 o; E, c& l/ s7 {2 S* V; t- k1 _
object/1..3/:f;
( Z" m; }" G1 ^) x
endsets
' y* j1 f* V9 Z, O7 s
data:
% t/ R$ u! t$ `7 [$ D, i" c+ c
a, b = 3, 4;
- M* ~5 ]# ?% t% S0 j( O
enddata
! Q7 E$ I- n- T8 m+ I a" @
f(1) = a * @sin(x);
. q9 \0 T" |, n8 l: m* m0 ^7 P
f(2) = b * @cos(x);
: _, ]) q, F, Z, f
f(3) = a * @cos(x) + b * @sin(x);
' c$ `0 [" \; ]$ c3 J( b2 U i( m; d
min = @smax(f(1), f(2), f(3));
/ R. y- D0 X+ `" D
@bnd(0, x, 1.57);
; X* n. A. T/ N2 |, t6 H0 V/ T* C
end
) B& @4 n# Z% y h! H6 T- g
1
3 t) z( S& o7 r- @4 q' _
2
: F7 i1 b: k! I
3
, U# P' z8 j# I; L4 a2 i
4
; v1 i) ?6 p6 W5 M/ r! o4 s# R, r
5
4 E) O5 I0 y6 R; h# ^& m' \/ b
6
9 f& H. ^& w5 U% n" ?* K
7
. B: G; c! b2 Q$ b. a; U( n% S
8
8 @" v& {( |" c2 u
9
7 g' P0 Z- u- m3 }' F. b7 x
10
( \# A6 a. P/ M8 E- Y |, c
11
7 h& x/ ^3 D5 d* N) C& k8 s0 {* b- \
12
$ V/ c# _# u0 E9 a+ \: b
13
- y, z; @2 Q; q ]5 P0 c
得到结果:
8 f, {4 t! I( u! b) ~
/ ^/ _6 U N9 A8 r
% l$ q' n7 b9 f; R9 {" h0 z
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
! b# b# i6 n0 S1 v* Q& S2 l$ i5 s/ I
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
7 ?4 B+ Y; J% G9 S# [& ?
x c) |. Y9 w( l
例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
) c2 P( V# L% j
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
; I. L) ~5 `" U- ~
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
6 C/ D0 Y" }6 W; @+ D6 y; l
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
/ d% a% V2 c, a* E) _8 b
# t V/ H$ y- j7 d! s! a
代码:
) Q9 b- |& J- o L+ k
: d8 \9 x0 L5 t
!旅行商问题;
4 N7 e( h- t7 w, J
model:
4 J; z7 {' O1 J2 u& O
sets:
|# G8 X5 ^6 E% A* \ t$ S
city / 1.. 5/: u;
( M# P/ n* X8 I
link(city, city):
0 O: w+ @ ~9 {$ m, x+ X
dist, x; !距离矩阵;
: p; L1 p) H, M5 D$ y+ k0 K* h. r3 Z
endsets
) Q2 x2 j, @# L- F) x( i
n = @size(city);
! ~5 L9 ^; |5 [" R6 F6 r- B6 y
data: !距离矩阵,它并不需要是对称的;
y* A7 D6 |. n; l+ _- A
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
; t) z+ f) x$ B
enddata
( S7 j' F9 \4 H& y) E4 o' ^
min = @sum(link:dist * x);
$ [; L' l& A. g+ j# O4 s! I6 [9 v
@FOR(city(K):
1 F; q3 d7 {6 K8 C( {
@sum(city(I)|I #ne# K: x(I, K)) = 1;
+ u, M. o/ O/ M7 a
!进入城市K;
$ _1 X* _: f" T
@sum(city(J)|J #ne# K: x(K, J)) = 1;
" g& M) p* k$ `" M
);
6 o3 l7 T$ w/ d
@for(city(I)|I #gt# 1:
2 c; f2 D$ b$ V/ E
@for(city( J)| J#gt#1 #and# I #ne# J:
$ Z2 F" `' W* U. Q2 k, V# o8 F
u(I) - u(J) + n * x(I,J) <= n - 1);
: G4 V* ]7 T) ?" E/ K; b* j# j
);
/ a! {$ A6 l7 E9 @: i+ J
@for(city(I)|I #gt# 1: u(I) <= n - 2);
5 j; t2 @3 Q p Z O+ R0 Z* }
@for(link: @bin(x));
( `0 }6 N/ J- \+ f7 p* g1 U6 \$ u+ F
end
) x4 P7 Y' h/ M+ I7 `" M1 K; T
1
8 p R4 K6 u$ c3 N+ i X
2
: l- N5 _. x2 D A/ Z4 `, i
3
7 M+ X! O) U1 o
4
* D2 O% T# e9 _# K! q
5
0 {, x, `7 S1 f' I/ v5 t) M6 a
6
5 k R% l# o% w( o
7
, R" t8 a( R9 c7 ] K1 L& d
8
# k) }9 r. x' x7 E
9
. N% k# k/ g9 r1 k$ U2 e- B+ W. m
10
3 b9 x, ~% C" z; U# U- T0 j
11
* z( h4 |7 I+ `9 \* U' Y
12
. g8 O7 ~9 D Y5 `
13
1 i% v8 q$ t8 k
14
$ ~0 f. ]: O) D: f9 `( \9 {
15
8 c) Y$ ~' e; I( x0 ?: l4 B/ Q
16
: Z/ O/ ^" ]1 Z
17
# A3 R% y# h' t$ ?
18
6 s0 U9 x X1 s- j p" J
19
$ l' c9 Q* w) U- ?
20
" E5 I( B2 z2 e" v2 C$ [, @3 J
21
! h! f! J8 |: v+ Y. l
22
( B, v+ t( Z/ g7 |; q
23
. s- k/ y7 b# F' w2 s& M
24
, C2 H0 B: n8 {4 x' x4 i
可以得到结果:
% Y) y9 n8 H- d* {# G* q# y k
8 A- Z. h# o' w( O3 Q5 ^/ b8 T# ?
---------------------
' d) A3 s+ X& h7 {8 t: H
4 \, F, d" C/ V4 @) M* P8 A2 H
5 R9 h; p/ e/ l& r# S
z5 {3 `% S, g. A) a2 d1 C
+ g ?- b: W2 K! b, W8 Q' @" R
' M% S4 ?4 S) A; D
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5