QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10047|回复: 0
打印 上一主题 下一主题

2-7、规划问题的Lingo解法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2019-4-25 16:16 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    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

    $ H7 n5 g7 B0 U* n' x% tmax = 60 * desks + 30 * tables + 20 * chairs;8 z' f& t# o& S- }5 y6 R  A9 F7 {
          8 * desks + 6 * tables + chairs <= 48;5 p8 R: V% ]' L( [
          4 * desks + 2 * tables + 1.5 * chairs <= 20;/ }4 R/ D( U, T6 |# x' o2 M4 T" P
          2 * desks + 1.5 * tables + .5 * chairs <= 8;. v; C8 N: Y$ k& r" f, `
    tables <= 5;
    ) ?1 m: j7 j2 ~6 Z/ J( W1 ^1  m0 `/ U9 S/ \5 j0 Z
    2: P3 t. b0 e0 E% m- x6 r
    3
    3 g& g; F3 p- e( I4 _4
    $ ]6 I. ]5 h" r5
    ( ~7 _$ a4 ~! q4 q+ t可以得到结果:   q' i% P; B8 e5 F6 b

    ! h3 ~4 x9 @6 `( z8 H9 |+ j( Z  这里的 Total solver iteration 表示一共迭代2次得到最优解。
    $ I: O; x- b& k# c2 E! L+ h  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    ' r' H) m, F4 G, u2 i' Q# ?  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。7 r5 C/ s5 v. d7 `1 n3 u
    ' C6 M7 T6 n( U
    例2:给定一个直角三角形,求包含该三角形的最小正方形。
    * p! L+ Y5 K4 T
    / R) H5 _, b% I5 u, d, W我们可以作出如下正方形: - I$ T/ b: I; ^- X0 |, p# V
    " J" @& c' \5 b. x3 I0 g
    $ d/ F" N' ]. X4 l
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
    8 q/ B0 W/ r/ c% k  转化为了规划问题那么正方形面积最小的时候即为最优解。 ) T" U0 E  c, f" |( b& n- V7 P- X
      代码:) V( l# n( Y( L  ^' Y- H

    5 A& c. o& T2 D6 V8 Q3 imodel:
    1 M$ g- |* ^5 i2 E5 F. \7 \6 _sets:
    , G7 h: I3 T- |- c4 M+ M" i    object/1..3/:f;
    . z  m0 F/ E% }, x, Xendsets
    & M7 U# m3 Q! s( j# udata:( a) J+ M9 \! m* W
        a, b = 3, 4;9 t" H6 S$ m9 W8 i) L# n! f( I
    enddata. C0 g! m9 _+ P5 L. y5 b# Q
        f(1) = a * @sin(x);" ?# o. e  l2 o# \+ U, Z
        f(2) = b * @cos(x);
    % F$ @4 y  t! \' P8 _' F' I. s4 c3 C    f(3) = a * @cos(x) + b * @sin(x);
    - h( I* X/ o  d) O- o4 E    min = @smax(f(1), f(2), f(3));+ A& d' j& ~# B# }7 E1 M) ?# a
        @bnd(0, x, 1.57);5 D! `$ E, }0 Q' A
    end
    # G5 M& B0 h% ?3 D) f9 e9 Q1" d  P& P( D) y- T% Y7 ]% W
    2
    6 }5 k( J% t8 \" r& C37 \0 e! c- B6 z% s) e
    4
    & D. _- E: ]6 ?; I3 O* K* ~" y6 g5, R0 U% {# x6 B3 M( s
    6& t  x! ~5 W; Z9 }' r( I/ ]' }
    7+ Z' F" F1 {3 m2 h" @8 r
    8
    0 G4 U0 _* B/ u92 F' P. H/ V& l4 D' z$ T! r
    10! p$ C7 R% q! x! h2 T+ r, n
    11
    4 q- }5 q; D; }% l4 a) ?12/ O* z6 b# b8 |- M$ n( t
    13
    & ]& b/ V6 q) D, Y  得到结果: ; _! M+ _2 ?8 l* z. f2 |
    . V$ W, T- H4 }! P, l1 `- {

    ! z- I% t: V/ f) H- y/ P7 S5 o  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。- i; U4 k0 Z* C" J
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?9 K+ S) v" C3 s8 q% M' q! Q
    9 u9 o' S8 f3 u' \& F+ @
    例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    ' w. P. _' Z2 `" U- D+ R$ z∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj) }& x# Z* i' H, y) g
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj/ _1 P/ A) h4 H3 x5 M+ ~; S
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
    ' T2 d& J, N0 P, `1 c" [; l% A
    3 m0 b/ s0 @! U代码:/ [5 Q* v1 F' Q* t% F3 E$ l
    ( ?) U2 K. d( ]6 {
    !旅行商问题;6 g0 f! W" i/ v8 k3 A8 |( y
    model:% E9 {8 y& v! h6 @5 x7 Q
    sets:
    . I) }  a. u" P, ^0 D    city / 1.. 5/: u;
    ' g6 _" j1 ]* d/ b    link(city, city):& `+ F; q0 h  ?
            dist, x; !距离矩阵;4 S- J# g% [4 c- w6 \8 @
    endsets
    5 i, F: a: d8 U- X" N/ b    n = @size(city);
    3 s) X7 Y/ l; n; h; hdata: !距离矩阵,它并不需要是对称的;% n# f3 V& j# r( s/ a
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;' h/ v& Q. n5 x7 J( E1 o
    enddata5 q! y9 {! b. ?  d+ ^; c
        min = @sum(link:dist * x);1 V3 R& K8 F# g) Q9 Z
        @FOR(city(K):
    2 @7 V; j- A- ]2 s) w        @sum(city(I)|I #ne# K: x(I, K)) = 1;5 C( ^; k$ h' C0 |9 T
            !进入城市K;
    % l( s3 A  I' m, w" h; h        @sum(city(J)|J #ne# K: x(K, J)) = 1;
    * p  w/ j! k1 m& ?    );6 }" m( s. \8 ]  M, S
        @for(city(I)|I #gt# 1:
    ! Q$ \9 P; k; x5 w* b4 ^        @for(city( J)| J#gt#1 #and# I #ne# J:
    5 s' G' G  s6 a: F& u! m9 B             u(I) - u(J) + n * x(I,J) <= n - 1);
    ; B  c' L) j: d- C+ A# j    );+ |' ^0 W: Y, ?+ t' X- v
    @for(city(I)|I #gt# 1: u(I) <= n - 2);
    ) \: k+ l3 p4 e* W@for(link: @bin(x));
    , j6 r, p. _6 l4 d4 X" Jend
    9 w2 |8 H& j2 {* g; H  `; G% p18 s1 R; q" \' `) ]
    2
    2 O: a, G  D+ {3 c; V0 j8 `7 ]. K3
    ' X1 k+ H1 \1 v. u! j4
    " {! u$ c2 B) n% ?& K9 b' A* h5# ?0 v- q) b4 r; S
    6
    , ]. K0 f$ h& N: E6 v$ X; Y# Y7" D5 `% T7 C! {  N7 M: @' e8 K
    8+ F. I& m8 ?+ i, {
    9
    . K- O" }. Z- b8 q$ s1 s10) I9 K9 Y$ N% Q' H) `* g% ]* `
    11
    0 ~, [1 {3 m; P5 l12
    8 Z3 I* G' H& J0 y1 _, m137 Y* N: M1 U! [# t% ?8 O" B
    14( C/ q& t+ ?- S# G' x
    15
    ) u, ^: t) L$ o* X6 c7 s16
    * Y9 w2 T! {. {1 j3 I1 D4 s174 G0 U% a% A4 k, x/ R- j$ b! f% e
    18' c1 L& \9 b- d; X
    19
    7 t2 H5 w  l9 [20. J% R7 b* Q7 ~
    21
    9 Q' u: \. a8 d4 n- V* T22
    ' G# b( {: j& b- Q% Z0 F4 s! v% \- J! ^230 A9 j. f( W" {' W/ K) x0 y0 f3 S
    24) F4 {  W3 M( |0 N# v7 V* Q8 K# y
    可以得到结果: - K, k  h' H+ B

    : |: n  N8 \6 z$ l--------------------- " i9 G# Q: m' L) D

    ( T7 }! _0 K6 k4 f' ^! d! i0 m% s$ _  t3 i4 \9 y9 }

    - {: d& o9 i& b( r* h& w% B. _3 @: W+ V; [
    . `# }( u: g' v1 h+ K
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-13 18:12 , Processed in 0.424486 second(s), 51 queries .

    回顶部