QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10293|回复: 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解法
    % ^" T7 p$ q7 e( M一、 从规划问题引入$ V; ^9 T0 a+ J

    + O  |) ^% W" W  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    # V6 k7 n" q3 n% o" M5 l1 o. k  l# f. k. ^) Q+ e! X
    二、 软件分析与选择
    1 O. S! ]. D# \: d$ G4 }' D
    & O7 Q6 G5 |3 v2 k6 r3 E5 `  Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。' k# A6 ?$ N0 v# K
    ! U' k7 U6 }5 P) o3 C
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    7 i/ C4 g$ e, }+ f( I; H  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 3 m- T# m6 O6 u) [* j- I
    https://www.zhihu.com/question/49319704/answer/165923451
    6 F5 q1 z" A; k% n( \4 J, @: _, Q- r/ I# R  L- _2 B
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 0 x$ K, L& }8 J; ?: p
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    & p+ R; a9 N7 X7 R$ c0 [  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。* b* c4 H! t- `* I2 T$ v: J3 A

    + _* ]: U) ~4 W# Y8 U6 z  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。1 h* W" x9 c! \; \

    : [; \! G8 d& e' a# _; a5 ]5 B* i+ i! k三、 如何上手Lingo! x$ V5 x- s) i" Z4 A

    4 J: n+ L& H( n( J% C  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 * b9 Q7 Q+ N4 A8 c7 g( Y
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。6 C4 e1 K  e/ I

    $ S  A' j4 D( U8 I$ h2 }! D四、 Lingo的基本语法规则
    / p9 C8 N! j9 H. g$ H5 w/ D* ^8 p
    7 ]. h! k+ `  E1 L- }1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;   [+ Z, M, ~! A7 ?8 O4 I# a* P% u
    2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 7 w" N5 c! \; b+ E! k4 K9 [$ d
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 1 `, R2 L: T  i* J) b8 ^
    4、可以给语句加上标号;
    & E- {. Z% f( f" @2 J+ X/ d! u5 @5 U5、注释以“!”开头以“;”结束;
    " l  I. L- G3 m0 y6、默认所有的决策变量为非负数; & {* c5 o2 x( H4 o; _. j2 [
    7、Lingo模型以“MODEL”开头以“END”结束。
    1 o7 A+ t6 x$ c- g# e: Y' `5 g2 W8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 1 a1 {3 i" ]& H* @9 w) Z, |
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 7 M/ P" x9 v$ B% l+ }% O6 n
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
    , c2 ^0 S: m6 u  T* Q8 V2 t
    , ~$ ]: f8 Z! q9 n/ J" m五、 谈一谈例子# C, x, a% Z0 ^
    - E" O8 ^2 E! `$ U% J
      那么Lingo用起来到底有多简单呢,我们来看一个例子。5 g0 }; t* y" J
    0 v5 \9 S, ~- S  Q* c& V
    例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    : G, J( J3 k6 ~
    : [$ u* z/ O5 D& E6 k, J         每个书桌        每个餐桌        每个椅子        现有资源总数" W& f9 Z$ i3 D% o  j) g( Q: r2 L
    木料        8个单位        6个单位        1个单位        48个单位% k2 m9 l  O. x1 Y; z5 k1 M7 W
    漆工        4个单位        2个单位        1.5个单位        20个单位+ I4 _8 z; P+ K
    木工        2个单位        1.5个单位        0.5个单位        8个单位! R  ]) w) ?; A- ?; `3 g
    成品单价        60个单位        30个单位        20个单位         
    : C9 P& ^0 _, a* }; _) X  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?" [' e4 j( [" |2 ^
    . d, O" F1 Y. d# b8 O
    解:代码0 R5 R5 _( E  h) X( u9 p

      D  p& s$ ]# Wmax = 60 * desks + 30 * tables + 20 * chairs;& C  I% b* Y5 f$ ]2 Z- O
          8 * desks + 6 * tables + chairs <= 48;
    ) \7 p/ l+ m+ o( L* u8 D      4 * desks + 2 * tables + 1.5 * chairs <= 20;1 L: ]- R! W; B+ @1 s$ C7 a
          2 * desks + 1.5 * tables + .5 * chairs <= 8;
    # G3 Y- s$ S4 \' Z, c, ^tables <= 5;
    9 x6 q9 N. s5 C5 c9 p! f1/ L4 t0 u; o- V% P
    24 i3 u5 q( N- `# S4 K% A* n
    3/ ?6 [7 o3 |$ G/ Q
    4
    % n/ O' O, _9 K. D# O$ I) Q% S5
    & T4 E2 w- P( [& {# f5 j可以得到结果:
    0 J3 ~! B  Z7 b! K0 K* M
    + o/ w; Q. {+ i" X9 |  这里的 Total solver iteration 表示一共迭代2次得到最优解。
    % t( ^; {  q8 ?% i* F8 R& b7 C  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    1 Y( N3 P' `+ i1 [  t. _  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
    % z6 Q$ @8 F& s& P8 e
    ! L8 E$ l9 o- p* e" ]' s3 ^例2:给定一个直角三角形,求包含该三角形的最小正方形。; T- U& j& q0 o( o' P* Z6 b: |

    4 `  y! }$ O8 g& J0 [( Y" P我们可以作出如下正方形: # }/ O) n! D8 V# N& I5 q. v2 C4 z
    ) W; Z' n; _, q& m

    - j2 G9 E0 x% r7 b- |! H  CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx9 a$ D: O6 d$ e/ I! V0 Z: d4 M& @
      转化为了规划问题那么正方形面积最小的时候即为最优解。 . @" }0 b2 R+ B$ Q
      代码:7 H2 u  \1 H" x" U$ s: f( ?

    ! d- j; j3 C0 Z2 |model:; W. h, n$ |0 i+ c8 p* p
    sets:
    / F  F( C: N7 Y4 W% G3 I2 P, y: k    object/1..3/:f;
    : {0 z! B. }' S  q; ~; O+ Wendsets
    " q( O( j; N$ d7 m$ Jdata:
    + P# C: C5 D# D8 w7 v, H    a, b = 3, 4;
    1 _* H8 v0 [( Eenddata
    . _# e. g) c) K: r! v    f(1) = a * @sin(x);& I7 }1 m  M6 f6 ?7 v+ X
        f(2) = b * @cos(x);" J) F! o2 `6 p2 Z8 T: i5 M1 v
        f(3) = a * @cos(x) + b * @sin(x);
    3 U# i$ o- y1 _) t6 R/ ~( Q    min = @smax(f(1), f(2), f(3));# K' M9 v8 L0 @9 f, \+ I  K0 k
        @bnd(0, x, 1.57);( V2 ~1 @) t! C0 s0 b# F8 q+ B
    end. R* Z3 t6 O8 O! w2 G
    1+ ?7 ~: L/ i0 s9 L
    2$ u; o# C' |( u! k$ w
    3+ P: y) h: z% j1 A% T1 Q3 w( G
    4
    , _3 T: B, C8 m8 W& _! _/ ~5
    # z. W0 ?5 R4 z6 q" ~60 w! m9 j" ]6 ?6 M
    7
    # T9 H; _( a& X9 {8: H: c" `; \- S# a/ r7 U5 B
    9) c3 L1 `, n8 w, a0 V
    104 l* O& A* ^2 z
    11
      E0 e" X) T, ]5 L0 Q& v" _5 C12
    8 {6 T/ ^9 \, ]* T9 Y  ^135 o- ?' i7 i1 L+ L0 m
      得到结果:
    ; m2 R$ M. ~# a8 P
    % u2 u7 D* q7 v: Z
    9 u  ?: S; ]2 Y; ~: c  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。/ n2 n8 {$ n1 [) Q( S
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    3 P$ K+ H$ y: Z' b% g
    . m# N/ c4 E8 I9 ~% d9 N: ?5 j4 j例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    4 I) Y) {# ?: H∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    , i# f, q0 ?8 Q2 w! s∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj/ D4 m+ I" n& C0 h) j
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。- L5 E) f6 W; D% H
    % U2 d5 C2 D. h! X3 q  O; D$ }7 X
    代码:
    ! J+ X7 J7 M' W9 G3 q/ c. z4 o# c2 I' s" Z) l( _# g
    !旅行商问题;! x, Z9 G2 L2 m3 D: Y; ~4 K1 ^
    model:4 a) ~3 R( x& Y" N
    sets:; _. N1 \' Q3 r; b0 r
        city / 1.. 5/: u;, B2 J' ]) V3 `/ P' n
        link(city, city):
    8 w- @6 |) Z. b" j' q) _* v        dist, x; !距离矩阵;1 }5 {- b5 m8 h1 ?+ V
    endsets
    5 K* p) v& X5 H- Z+ X' E    n = @size(city);
    & S4 T/ i$ \5 o1 u% k. \data: !距离矩阵,它并不需要是对称的;
    7 ]$ A5 _+ L, _' F" k1 C    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    4 y! T/ X/ _; n0 Z  @enddata6 m% g9 Q8 Q, |$ ]0 K0 d/ U6 q6 r
        min = @sum(link:dist * x);
    " Q8 u2 r, A( l7 N. _    @FOR(city(K):8 U/ q( w' w7 Q; M
            @sum(city(I)|I #ne# K: x(I, K)) = 1;+ B5 \( M, y. [6 ]3 k; [* a: H4 _
            !进入城市K;
    ! \" i, O2 N4 x  H8 O% l        @sum(city(J)|J #ne# K: x(K, J)) = 1;! a( [' v4 x& X) N+ Q! Y' e
        );
    8 N3 z6 ^% q9 g" z    @for(city(I)|I #gt# 1:
    0 M2 y) @; ~* F( {1 r        @for(city( J)| J#gt#1 #and# I #ne# J:
    # \- Z* P3 b9 O" ?( }5 v$ b9 s" m" a             u(I) - u(J) + n * x(I,J) <= n - 1);
    2 M6 z% L" D2 h: {    );
    0 l, n& {4 [4 l@for(city(I)|I #gt# 1: u(I) <= n - 2);
    0 _* o0 [4 \- O@for(link: @bin(x));* E2 w. z9 G$ M7 H9 k' Q
    end/ ?3 s$ R; U0 H. c0 T7 J6 }% ]
    1. M3 d3 ?9 m' e; R1 ?9 K$ ?' U7 X
    2
    . Z7 L3 _9 o: _3
    ' K+ Z8 ^( C+ b4 G0 S4
    ' `$ n) H- @5 n) e51 a% o& R- }5 L9 x
    6
    8 Q( b) @8 h' ^! C7
    ! K2 z, A" d' p& p84 n) w9 z: }0 N0 C0 i) Y5 c
    9
      ^' g: i3 [- V1 x+ q10: s% h; w1 z. l' b. y
    11
    ' P# R, Q( Y! j9 X* [, C12
    ; X: M7 v/ |3 h' m1 D% P* Y# ~135 M: R! W7 Q4 [( V8 n+ Q& E
    14
    6 B, O; r# {/ [15' p( I6 F* J" S- b
    16$ R7 K. u  }3 |# @+ p6 @
    17
    / d) t( p  w) l) o, H18, m) d6 @+ c7 }' W6 F7 D
    19
    , {; L, k4 l& R- b, r20
    * x. j( H" I4 s" _6 G/ F7 ]212 e1 d% f2 v( g3 B' t5 B+ E+ b
    229 r! z  P4 J. t4 l3 i
    23
    5 i4 E: F8 a( `9 q( g! N8 S# m3 n24
    - [4 M+ F, u6 \; i可以得到结果:
    $ c( w! F) E. f3 b# F# d3 g& q7 s$ T" k8 O. J' \* l& ?. y
    --------------------- 5 Q0 G$ j9 P2 w; h1 ^

    1 @$ L. x0 m- s1 m0 \) J" w+ u& x8 P, M
    4 M: n2 R' V+ m5 s

    # [! `& o% g+ l; m, r1 D8 w; q0 K2 N$ u: y" M
    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-9-30 01:26 , Processed in 0.701785 second(s), 50 queries .

    回顶部