- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569304 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176014
- 相册
- 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解法
2 |: @. j2 o: x2 G- K/ f( R" J( q" z一、 从规划问题引入: c5 f+ h& H; o9 X: {7 ?6 U
& {0 O0 k2 e& L: J 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
# j, \$ ]2 W1 ?, \. m6 f3 E4 G, k k) M3 D+ S8 O/ p
二、 软件分析与选择2 v! Z8 g: j- ^( c
) J5 m @2 U& m$ ?7 A1 g Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。& E: F% d1 A8 d# `/ Y4 U
* r) p1 i, n9 F6 W7 o: b+ u5 a
首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
1 k' d3 M& u$ X& ] 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
9 ?! `3 U" P) o4 }7 z& @: X- H/ Rhttps://www.zhihu.com/question/49319704/answer/165923451
) P% T% K1 V: N; z `$ |2 T0 c/ n: Y/ o/ S: h* z/ S
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
2 \/ Y+ e# S2 l4 v. J 然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
1 d1 c- V. u( ? 而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。6 E% e7 M# F9 Y, p
# _: A8 w V3 T* M' B- _ 那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。9 I2 _0 `$ [% J
6 K6 x# c) Q$ X( [- j2 H7 z
三、 如何上手Lingo' L0 ?: ~* R6 ^2 P. U( `0 E
n6 Y8 v/ M7 X$ _) s 有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
' S! B( t/ _6 @; T! O. l “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
( }: a4 I. u+ j+ o! X! v
7 w7 c P2 ?/ E) T/ G四、 Lingo的基本语法规则& _4 ~3 c* K7 n9 E0 T
. O: j. u9 D( q. v0 k$ m+ b8 t1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
) Y. U2 X" T( D1 J2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; ! t4 Y# W$ s% v! h
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
" Y3 p6 r4 Q7 C5 a; j5 |- g* ]* @4、可以给语句加上标号; % V0 R# M" _0 G; t& ^+ Y0 z7 [
5、注释以“!”开头以“;”结束; : ^5 j) K( d8 ?7 Z) H& [
6、默认所有的决策变量为非负数; + t; k. W, S; R7 c! g/ H6 S
7、Lingo模型以“MODEL”开头以“END”结束。
6 c$ ?4 j% m: @- a7 J) K1 F* _8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 7 s. \/ {" B* I' g0 t3 C4 y
9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
; d2 V1 i# u0 h8 s10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。, `1 K( a2 c% H
, N- o3 i; s" n) m0 J( _
五、 谈一谈例子
$ d" s9 G5 H5 M3 O3 n* \0 v7 y }, v9 z! h
那么Lingo用起来到底有多简单呢,我们来看一个例子。0 Z6 h a9 R" P) I1 \ Z% h" c
. {0 H3 I) R. d* v2 n6 Q' ]例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:: C5 r8 G2 ?! b9 d. m- H0 ?
5 D% Z% Z# G0 i. F; w
每个书桌 每个餐桌 每个椅子 现有资源总数
0 `4 s9 z3 j4 w% I8 \木料 8个单位 6个单位 1个单位 48个单位1 e. |1 J' R2 O. w
漆工 4个单位 2个单位 1.5个单位 20个单位
8 t% _: T4 @8 Y. E- f2 c( V木工 2个单位 1.5个单位 0.5个单位 8个单位
; j2 c1 u! r! S) v. y! A: }1 {' b成品单价 60个单位 30个单位 20个单位
5 P2 q" n$ E% d3 ~ 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
u7 J" H4 `$ [1 [$ A) F& L4 l' P/ i, h: v1 F/ @
解:代码
* C" l. j& g+ f- ~
0 _/ _- Z3 m6 ?* X9 N8 i! lmax = 60 * desks + 30 * tables + 20 * chairs;$ n9 U8 [& r8 a0 E& m. i# H* P
8 * desks + 6 * tables + chairs <= 48;
3 U! x8 ~1 v' l2 \7 \. A 4 * desks + 2 * tables + 1.5 * chairs <= 20; V; {, O/ F# O+ Q3 E, {3 z0 k
2 * desks + 1.5 * tables + .5 * chairs <= 8;- j; F# g! S) a$ i+ }
tables <= 5;( l% t( E3 \. N! W9 o0 b' Z
1& z% O& a4 y3 D4 m4 c
2
( A# d- z: K* W' g) {36 M i! `% j. {: V7 A8 P
4
+ @8 v7 N! A8 @: ~4 ?5( v7 Y E" q$ W/ h4 }
可以得到结果:
$ L$ S% Q) }, ^5 v! ]' b z' U7 j; p/ N& B) W$ m
这里的 Total solver iteration 表示一共迭代2次得到最优解。 ( g1 Z$ k) T: R
Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
. |$ H" u8 T! V% V6 L, I9 e( Q9 m 可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
" u9 f1 O; N6 v _# i/ p; r1 E5 r l% H* c
例2:给定一个直角三角形,求包含该三角形的最小正方形。9 l8 z# E: a4 X; n# `
6 p' I, L/ B* Q ^ T
我们可以作出如下正方形:
$ F0 P* x" t U2 I8 z) e: U
# e; C! e5 D) S7 n. M. v/ |, q
* k8 C9 G% u4 U# D CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
3 l: i: ^8 ~5 \- t9 G \ H 转化为了规划问题那么正方形面积最小的时候即为最优解。
; }9 j; ?1 u+ ]( L. Y+ w 代码:
1 \$ ?% ^& f1 c. ^7 ~) Z5 G3 g7 V4 v" K8 w% x
model:2 M% B" F3 l; {
sets:) ]6 h+ M% M; S3 G8 Y) F; z
object/1..3/:f;4 i1 I8 s7 E# o. r! w" F( d
endsets
" ~( \. V9 D& y9 E- F( zdata:
- O4 V8 Y1 o* r9 L9 v8 C" _% X a, b = 3, 4;
S' B* S; b2 U3 J! p3 Benddata
1 V f( M3 E6 c" v6 x' u& c; @/ x f(1) = a * @sin(x);
2 ]5 n& V8 j5 J" Q" h f(2) = b * @cos(x);3 Y' \$ [, Q" P' ]
f(3) = a * @cos(x) + b * @sin(x);
! J4 a7 Y# p$ K& [0 G* x7 c+ c min = @smax(f(1), f(2), f(3));
8 t0 i4 m( \- k, G+ q- r- H; e @bnd(0, x, 1.57);
! e* }/ K7 L! r5 `4 P- i `+ ^1 Oend/ d& ?2 X% c# t( b* L/ f+ r
1
9 ` F' W7 W% p6 A- f2
4 u. X5 b0 N3 u3& J: t" Y$ a8 I& g) [: g4 m
4/ g3 u R! i8 V2 w& b9 k
5
# F% ^) D* \/ Z$ Y% }6$ p7 ^6 s" i: C. w
7
6 p* g: x$ Q" m F+ F8
, o. e6 d6 g8 N! y; t, o9
; @# g/ x& s# B9 [1 b. V# T10
E% e+ K4 E( A11 Y' h; d3 ]$ Z1 ]! G
12
% H1 ^& W$ q8 g2 T( U2 O7 s6 S138 { o. x* ~/ A( h" B
得到结果:
$ B5 R) ^! E2 p- A. j/ D* a* I2 H5 q
/ ~* ]1 s# {& o8 |
这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。* b# \( |0 K \' a: z
那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
8 p, G7 ^- F/ n+ V6 h% b, r+ H
% G7 m) |4 O. n例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 x4 C5 c; k6 w5 i∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj) o' d5 K3 P! k# Y2 g
∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj9 Q' A" F" B0 ~1 q1 a: ]
由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。4 r+ j5 X# m: ~. @0 h+ K) o
' ]: G3 U) T) |. f5 r6 a8 R5 `1 i代码:
) S7 p9 W) f9 F3 J7 j+ S6 v, c6 p; p6 ~
!旅行商问题;% L2 D, \4 w5 |8 [9 K
model:5 O% P3 Z& m5 ^% b0 s
sets:
6 \& B8 h. Z5 C' E2 p* H6 L) a- g x city / 1.. 5/: u;
. n0 k# N/ p8 h; E8 X2 g link(city, city):( V. ?0 H) h. c: Y( M2 o
dist, x; !距离矩阵;
8 U p: Y" n7 }9 ?' j+ `+ Mendsets
8 Q4 X+ A" C" U( M5 H4 M n = @size(city);; j$ j5 |: p( ]$ p7 Z
data: !距离矩阵,它并不需要是对称的;# }6 B. Z p- V
dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;7 g/ `, _9 ]8 L
enddata
- G0 g9 r) Y) ?* j# Z- R min = @sum(link:dist * x);
- B/ h3 B$ a7 _6 N- W @FOR(city(K): j- A- J4 }: A9 y) D( i/ {; J) f
@sum(city(I)|I #ne# K: x(I, K)) = 1;9 c* w4 s) i. v, i& H( c9 K+ U
!进入城市K;/ H% ^ }# p% f" U L# j* {
@sum(city(J)|J #ne# K: x(K, J)) = 1;9 n' q; h c+ @
);0 N- l% I \& ^
@for(city(I)|I #gt# 1:, v2 s. E1 ]* f# d
@for(city( J)| J#gt#1 #and# I #ne# J:
& l9 H( _, D$ w1 J3 d u(I) - u(J) + n * x(I,J) <= n - 1); _& l5 ?& o& j7 l2 m; x
);
' M9 D6 c( Y# R+ X7 O2 V6 Z@for(city(I)|I #gt# 1: u(I) <= n - 2);
+ Q' \0 c; ^/ {5 c, c/ `@for(link: @bin(x));
7 ?( B* m" C: k' N' G; i. _% Tend
# O( {3 B3 B+ L1 s7 T: l0 e1
' v5 ]* z& [7 a$ Z1 O+ w/ \4 G2# E% T3 G e8 I) f; L# E
3
/ `) N! `9 i5 A% W# z$ ~4 x6 `% v4) k" j" J: G$ Y v. o
5
1 B% `2 ^& h- R, N& I6
, O; L M8 D/ w1 H8 b5 j7: V! j: e5 [, N, t: |4 K% E/ i& R
8
: r6 I" }' F$ u; w+ w0 n/ ?9
3 j' a; _% j! `) @+ d Q10
& r( `. W+ k) R" a11/ {, c- @' ]1 E3 d
12
5 y- J. L5 k) Q6 n8 u136 ]9 M! _, A$ X* X% `/ u
14
- u7 ^ \/ H, N8 f" h5 X& o152 k% m3 O! y/ a
16
3 u/ b9 I1 m* Q4 o172 p1 I5 Z1 E* O0 c& F
18
/ h3 {. A" L R% s19
( i* Q2 A$ b- }2 n" ^5 W8 A" c202 e# N6 e" r0 y" I3 y3 }) u7 l
219 J$ S/ k% }, ^, y
22 n7 d: E/ b% d1 M* I8 Y4 Y6 N- [
23
! y, }8 x4 v) g) @6 q' i24
4 m0 f/ @2 G$ [/ A) q. B可以得到结果: ) t' z( u- C0 x" C& F
# J/ c- W8 D8 x$ Q
--------------------- 0 p: a I' o- N: b2 D
e7 L, b' P1 D* m5 F) h; U8 l
7 z% t8 K- n1 w: @4 {$ s' B
. E, u* G# S. s+ }4 z" l2 _( M, ?
, N. B: j3 R% }: o/ H
1 b3 @$ }0 m: L, L$ A$ J) J5 j |
zan
|