2-7、规划问题的Lingo解法 " J9 I( e% m) m {2 W0 P# d一、 从规划问题引入; O1 B3 Q% Q w
" O8 a8 B. m) ]1 _% E 在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?. r; n f0 K1 N6 [5 b2 F! K
c/ t, ^& O6 \+ S二、 软件分析与选择 ( p- h0 e) T4 y! r/ }/ u- _( j7 {
Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。 4 h% A5 B+ L3 V% | z \2 t' F) m& J% O9 h/ O6 @* W 首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 1 D1 ]& o9 N: r6 M! u9 n5 k 而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 - _! L; b% d( p" ~https://www.zhihu.com/question/49319704/answer/165923451 4 }( {4 M# Y6 @6 l3 ?8 [) b2 Y0 u7 P* [6 t9 E6 |+ v
用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 & z3 X3 N# ?! r8 ?! c
然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 3 Z) t% l0 P7 z b7 _! \3 z9 B+ w) y( l
而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。 0 ?4 U W# Y+ ]; v# e) S# O2 i; y, G' R( q; G* [& N& i
那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。8 W: o g0 }7 |) C) \2 n/ Q/ G# V
% V7 I& f: d9 c& v2 T/ i5 y
三、 如何上手Lingo" c7 r, ^. A" `6 Z6 G0 L
3 ^2 V5 r3 U8 b' t4 N
有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 6 X6 e6 ?( }! g2 o
“简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。 # T! e' @1 a! ]- M. @) B9 r* [; v0 c# J$ B" O* [) H; {
四、 Lingo的基本语法规则 ' Z& u# K. Q; ~; F# r( Y; Q - \9 ?7 f y7 f3 r3 k1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; . w A+ w9 }1 j9 D2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 8 M$ U P9 {* @6 s" G
3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 4 x; l1 g. q2 t4、可以给语句加上标号; ( U4 Z( k& V1 M3 \8 B5、注释以“!”开头以“;”结束; ) @" P8 L l& ~4 b( Z; o5 U
6、默认所有的决策变量为非负数; " t V4 [9 N' X1 \3 p
7、Lingo模型以“MODEL”开头以“END”结束。 : E* _( R$ n) ^" X9 L
8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 % ]9 g5 X/ p! W7 j$ |9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 . I6 X: g. B+ B: o/ i2 A5 D$ _8 D' [
10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。: M* a( Q( b& Y+ x- ~- S! m) G
9 ^' c! Z1 Y6 b+ c" L( \& h1 \' t
五、 谈一谈例子* e) n. {# q1 l6 o, r$ h' A
$ J6 [! \( M- K+ }! p% h 那么Lingo用起来到底有多简单呢,我们来看一个例子。( ?( f8 o3 W4 _) }9 A
7 S+ C' R! l5 A; n
例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示: % @( C) d9 o; m: k" B7 Y2 }& q; Y6 t4 P1 ]/ M
每个书桌 每个餐桌 每个椅子 现有资源总数 - A; o* H# A( y6 o9 }0 l木料 8个单位 6个单位 1个单位 48个单位 ) B! G5 X* ?9 m6 ^漆工 4个单位 2个单位 1.5个单位 20个单位 , ?! [ g Y; |, t- `* p0 S, o5 r木工 2个单位 1.5个单位 0.5个单位 8个单位 * L4 J$ W: a6 V7 |0 n. b1 X. \9 O成品单价 60个单位 30个单位 20个单位 7 y' n M E7 \' w' g# b
若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大? 5 f. j# K9 e# F' `' U, I3 c$ L+ `( \6 d) U% G
解:代码3 ~' f) J$ p0 d* X2 e q, @$ L