QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10173|回复: 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解法
    - L/ B; `  d0 M1 f1 A$ h: b一、 从规划问题引入
    0 l0 ^& j2 t3 m5 D
    6 Q, q+ u1 u. l# K% M- e  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?5 e; A& f: G7 P/ [- p" `7 B# I# r  ^
    ) w- \- U* s* h3 i' v
    二、 软件分析与选择
    7 K8 E/ X7 Z' I2 @( |1 W/ [5 P4 X( T
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    - ]. [1 f" e7 [$ Y, L' K  C4 F. S2 E: `9 V0 r5 z
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 ( M5 K. f" f1 ~/ H% @0 S  v
      而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    - }; E* d$ ~/ T) l# \8 l! khttps://www.zhihu.com/question/49319704/answer/1659234518 m4 Z* h/ U3 Y

    , `# E8 }( I$ z  用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    % [! ~. _6 [1 [$ ?- d; g+ h  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 1 l# Q) H. U% k7 B  D* o$ z
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
    1 P/ S* W: o& }, f$ v& F0 L7 @5 {2 ]4 f+ e1 r
      那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
    " {) u8 R$ _3 j8 g% r$ E( A% L! ?' H5 `' c' Q9 e) v
    三、 如何上手Lingo
    2 ]% n3 E- `! K. m) L
    & |* l- V; }. O2 f, N) i* A0 [! [  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
    ! T9 M9 G' }; k& d) r. L) s) _  “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。$ {+ B; c; Y1 k7 p# ?/ p

    & Y/ g' n2 T4 X: `5 {四、 Lingo的基本语法规则' e9 ~+ [% A% p7 g: c% }
    0 ~4 ?  D: V# [  K5 J
    1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    ! N4 C8 w; n# y+ @6 q6 M2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; : [& {5 W! k5 f% s" v
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    ( v( G; h* s1 x2 w! w/ z8 y) m4、可以给语句加上标号; 6 r( F( B$ g1 h, E
    5、注释以“!”开头以“;”结束; ) }3 M2 `" d2 ?. h; k
    6、默认所有的决策变量为非负数; 2 q3 I$ X, z- t, E
    7、Lingo模型以“MODEL”开头以“END”结束。
    3 a2 {$ q5 C: T3 L8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 7 R6 {5 W0 A& j8 v
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 , R+ \  q" `3 Y
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。1 X5 N" T! A6 T- z. P3 c

    ! @% p1 \7 l( M* D五、 谈一谈例子
    8 ~8 \/ u: ^1 U5 J. ]: l5 }  P: O  y
    0 E' \, u2 V/ }) w0 A  那么Lingo用起来到底有多简单呢,我们来看一个例子。  C, ~( \1 d+ q' N/ U

    3 |) N6 P1 @( @/ ~0 S例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:0 `; n- H1 |" [/ f; [

    ( H, i2 \1 `+ F5 a2 _( d         每个书桌        每个餐桌        每个椅子        现有资源总数
    9 o) {: _! ^' i* y; h) T木料        8个单位        6个单位        1个单位        48个单位
    1 g: R5 b1 f+ e8 o9 I: y9 K漆工        4个单位        2个单位        1.5个单位        20个单位
    # Z; r9 K/ W8 c' M  r: G6 S1 [( ]木工        2个单位        1.5个单位        0.5个单位        8个单位
    / Z- L3 o6 I0 W( Z6 q) {6 l7 M成品单价        60个单位        30个单位        20个单位         
    $ k) q1 K4 O: ^: }  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?3 M9 F& G% h5 u0 X, o
    4 A8 b7 S) h7 m
    解:代码- `) a& Z+ ]  G9 q$ w( G. k
    / Z1 R/ q. o- C/ w- G6 Z& x
    max = 60 * desks + 30 * tables + 20 * chairs;& A# X4 c7 E! k% n( A6 l- C
          8 * desks + 6 * tables + chairs <= 48;7 `5 z% `% ?" j# n% L( U# W( [
          4 * desks + 2 * tables + 1.5 * chairs <= 20;
    3 O9 v( a& J8 x      2 * desks + 1.5 * tables + .5 * chairs <= 8;+ p$ W& k1 ~0 e+ h) V5 l5 H
    tables <= 5;  F; Y5 ]$ B  o$ w* b
    1
    # s: i! {/ b0 P, e$ v7 T2 }2' `7 U- X9 m" f$ P0 l) S9 Y  s
    3
    ' U0 w0 }. M  P* W4
    ( |7 G3 r7 d; k7 ?* C55 ]( M( a: Y2 `9 ]) N- @5 z' N
    可以得到结果:
      p3 b) P! Y9 x9 m8 y- |- i4 \
    " C" s- F5 E' J6 z. w% t3 y  这里的 Total solver iteration 表示一共迭代2次得到最优解。
    5 ]4 q5 K. ?5 C7 P2 [: J  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    ; _+ Q% x% O. E0 A  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
    & ^2 M4 I. n3 e6 I/ X! N# y; b' r' `2 ^+ Q
    例2:给定一个直角三角形,求包含该三角形的最小正方形。
    4 e$ ~  R/ G  l2 u$ S& S
    # g; l/ m& \; Y我们可以作出如下正方形: " c: x: C+ ]8 M' _2 K: ~

    % X$ m6 C! {9 S$ f4 X+ }6 i, s# z2 n  a3 Y  R4 i5 ^
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx. u" `( e5 Z2 g
      转化为了规划问题那么正方形面积最小的时候即为最优解。
    $ g, I/ K8 H7 j; l  代码:
    : r: |+ S2 J4 z6 ?" r
    - e7 Y% ]5 [7 L5 N2 Hmodel:: Y& w. x+ A7 F) N1 T' |  B; a8 {
    sets:
    + `. r9 c# Z) ?' D    object/1..3/:f;
    - P3 r: M9 B1 u6 M. V& g8 U% Eendsets7 X8 z: V3 G' ?& M
    data:3 ~0 ]$ z3 G( Z7 a7 e
        a, b = 3, 4;
    ( A7 z1 A+ k5 oenddata
    4 e% l! P; }  f* I    f(1) = a * @sin(x);& K3 j5 ]. w. ]
        f(2) = b * @cos(x);
    ) v" V$ ?+ H) Y' B    f(3) = a * @cos(x) + b * @sin(x);
    8 N, v6 S  B' b! A# C3 c    min = @smax(f(1), f(2), f(3));8 k, \% V# K8 c7 r+ G) L4 `: W1 y  v
        @bnd(0, x, 1.57);
    8 {0 [3 `+ L( O' o- L- M7 vend% L  N4 _/ R, B  E9 T3 V
    1
    0 i1 T* w# A) q8 e2
    ; x5 z/ q! S# j6 i+ O3
    & v) l; K  b9 `, X( R# I4
    . I( ?! `( q5 i+ R+ U5
    * z; }! w! {8 Y  ~9 E4 `65 \0 T( t6 ]/ C3 c
    7
    + X' @" ~0 R8 O' H2 |8
    ) M% ]7 j) [, ?9
    2 p0 x. g( ^5 }: ~; y+ l10
    ' [' h6 Q: c0 q: N. n6 H# U8 s114 J, {0 i2 T* P6 s4 Z; S
    123 c+ O7 x% T9 t) j
    13
    ) x+ Q+ O' W( Q& d! n. p  得到结果: " T; s- {9 z( o5 a3 L) M* |

    / }- h7 ^2 u  ^( v3 z3 Q7 S
    ' x2 V% R0 {3 v8 W: K6 p, n  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    , s' P  G2 ]" z4 O7 l  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    : o8 w( r8 T& s! ^8 X% [- q
      ~4 Z+ P0 H; q' C5 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 / \; O% s5 V/ b# h6 V# K
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
      C6 _3 g  {# x6 V- E∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    3 Y$ ~  c- ~: ]- W, w) e  q由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。2 ^$ _/ j0 R4 u' f( g
    % {2 d+ N/ e9 j6 O) \6 ^* ]
    代码:- }8 D5 w- C$ g1 }" X

    5 ]. T  q" A, c: x/ ^!旅行商问题;
    9 v6 M2 u3 a3 i4 ^6 tmodel:
    0 h/ M5 ^5 Q2 s/ I: v6 ]; xsets:) k: q: w5 x( c. Z" r& F, B" S
        city / 1.. 5/: u;
    & p! x0 K' j1 [( `4 i1 M, g9 G    link(city, city):* ~4 y6 K, d: x: `
            dist, x; !距离矩阵;3 P6 i6 e& W, c- S# @
    endsets
    2 M. r! p) X: ^+ x) f/ B; H    n = @size(city);
    " s: R  K6 ~( L: e2 Z2 `9 T4 Cdata: !距离矩阵,它并不需要是对称的;
    * j* X* X; u  f    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    $ X3 F8 {; e" i) K8 tenddata
    . P8 K$ y9 e" X# A    min = @sum(link:dist * x);2 A% o; S# F1 ~0 m- f- {) b- F  d
        @FOR(city(K):
    1 ]; I8 s( E9 ?        @sum(city(I)|I #ne# K: x(I, K)) = 1;% K( q/ B7 j: K: r7 U6 v$ e: v" n
            !进入城市K;9 [4 m) V* h- I* x- A2 ]
            @sum(city(J)|J #ne# K: x(K, J)) = 1;
      \2 R$ T' j0 N7 B" w+ f8 s6 H    );: e5 Z% Z" q: Y9 N  `
        @for(city(I)|I #gt# 1:
    ; ]3 \% Z: K: b! n        @for(city( J)| J#gt#1 #and# I #ne# J:% j/ X; b7 m  |2 q# P
                 u(I) - u(J) + n * x(I,J) <= n - 1);
    * D% _# o' d( ^5 A7 v% v+ |4 i0 X    );
    / |$ P# u5 f" M( }@for(city(I)|I #gt# 1: u(I) <= n - 2);: {. F. B! j1 s
    @for(link: @bin(x));* \& d" T" Q- P
    end) C! _( R0 L% O' ?' [" H) B
    1
    4 M2 T. G  @, Y( M( Z% c2! r4 A: }+ W5 C# v* f
    3
      J: ^% E4 Z1 z6 |1 t6 i; n9 q4
    + m: L- E& s- k. }, l% m1 Z  [5# Y- z% i4 @% I7 L7 F4 i' w# s6 z
    6
    . q7 v8 n& ?6 @' k78 d6 R6 |6 a' I' u5 y
    8% e1 y$ }6 ]6 ?: m' t# f1 M! O7 n
    95 s* @+ Z. U5 [7 o# n5 W4 c
    10. `5 J# I1 v3 g9 {
    11
    # N0 e7 \1 u# M7 b! g8 e' D% C4 w- ]6 Z/ J12
    / f' v1 g6 V0 o7 A- Q6 m& P138 h3 \/ d4 S0 q! n8 S
    14) s8 M4 w7 |& A8 f$ u1 d$ l2 b
    15) e3 B( b) p) X
    166 [& ?2 o9 q6 v! h; U9 ?
    172 i/ h% K, _: C0 o# R
    18( a# R0 {7 `; F' F' ~% E
    19
    3 a) H* F3 I: B" {20
    4 f3 Y" d8 m2 s' q; |$ s2 ?21
    ; }! ^! I; N+ N1 V% ]) p22
    5 `/ D/ i% E/ G% U, p% J23
      `) Q! a9 w% }8 f24: S4 ?5 F4 @' |$ j
    可以得到结果: # O6 T7 E& k$ h( w( p$ w% u) ~
    / N' E. Y4 r4 e! `; f' u1 H
    ---------------------
    : S9 h# c. j3 D' J8 G2 D) k& I; F" J* M$ C- o' c
    : ~! M* f" d- L' F& F- T
    & D; S6 `: v0 b3 v& [1 |2 A
    4 i- a1 i- R0 T5 G0 B  H

    4 d% }2 W; V' H, l) T
    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-8-4 19:07 , Processed in 0.613551 second(s), 50 queries .

    回顶部