QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10046|回复: 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解法
    ) _0 _# K: t) ?( E# g6 _+ k8 N' s一、 从规划问题引入
    - F8 w: \9 n. v4 X% G! T3 k& Q2 f. r. ?( h" n) M
      在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    9 e4 J, g" T0 r% \& I1 m; o3 R; d. w# M) S
    二、 软件分析与选择. F1 [7 N& ~  l' e- C5 p* r
    # f. b7 P5 r+ ?# u5 G
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。# W3 a# o' P6 Y! b. O, K. B
    + T3 [* h+ q0 Q, \8 u# F/ g  D
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    9 T; o0 M, D/ u& p  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    8 A% F. T! x$ @3 c( h6 nhttps://www.zhihu.com/question/49319704/answer/1659234513 U6 r! h3 O. I: K# H$ K) Z
    ( A! G! }( r' P1 p4 t# F3 N! n
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    * a; t2 w% r- r( C$ W  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 0 M, |0 ^1 f8 N8 W2 P. C
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。) M. P9 P& L, Y9 h; F

    " @! w3 |# e6 V; O% W  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。- w! q( e9 O* a7 Q  T" N

    5 t: j0 h! j2 ~* X9 s3 _( `三、 如何上手Lingo
    " `6 P: I2 h- }5 z5 e& V4 m; N3 E& u# U6 x0 ^7 x
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 & r) w! @, r* n5 ], {9 G
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。" l& Z3 j% s6 F, ~

    " o& W, o- z9 U* B" o5 K: Q# s四、 Lingo的基本语法规则
    0 s- B1 ~. N" S1 z5 D: ]
    - l3 S4 r  r9 j1 H3 u, |8 @1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; 3 m7 N/ k) k  }: n5 W& T
    2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 3 o' O7 a- @/ }  Q
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 6 O! {* `* k2 N" ^: K0 y  z0 j
    4、可以给语句加上标号; " `+ Y3 ]5 Z( r: G2 @* u6 Y; w& {
    5、注释以“!”开头以“;”结束;
    ( [% K2 j% {: J+ g6 Z2 R6、默认所有的决策变量为非负数; : @4 j* f& a7 a; |/ T
    7、Lingo模型以“MODEL”开头以“END”结束。 + W0 E' ~) ]8 ?1 T$ S! b
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 ; l: W( n9 x; D9 e
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 , g! ]4 g5 d4 N
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。0 [% u8 u8 J' d
    , W- d5 i0 P5 g0 Z" i. ^
    五、 谈一谈例子# ~. {% L/ @0 R2 c

    ; ]3 t/ ~; |$ R9 d. L  那么Lingo用起来到底有多简单呢,我们来看一个例子。
    6 e, x! j9 E0 |- e7 M7 n9 t
    6 U, q+ D$ X+ h例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:% I0 y0 C7 v9 ^5 C' D

    $ S) c% G# V& e6 \         每个书桌        每个餐桌        每个椅子        现有资源总数
    ' j2 s" T* _" k4 n, ~) q1 R) J木料        8个单位        6个单位        1个单位        48个单位" ?8 N" \' O8 K  F) f
    漆工        4个单位        2个单位        1.5个单位        20个单位
    : O; _' [$ E2 `9 {$ \7 g木工        2个单位        1.5个单位        0.5个单位        8个单位
      |) p0 b% K$ Q" `2 o) s成品单价        60个单位        30个单位        20个单位         
    6 C9 W1 w/ F" p. G1 l8 m' `  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    % t( s% L, K+ k9 s7 U) V$ w5 R( V4 f; m; Z( ?2 y, H
    解:代码
    5 r% I$ [; N' ^7 U0 u# r* |9 k9 \; t2 s. Q; i# J' `$ ]" ^! c
    max = 60 * desks + 30 * tables + 20 * chairs;: F. E# _" q4 c! ^1 h: ?0 V
          8 * desks + 6 * tables + chairs <= 48;
    2 H7 m) b4 y8 \4 k6 u& A      4 * desks + 2 * tables + 1.5 * chairs <= 20;
    7 x: p# V9 {$ w( R' }      2 * desks + 1.5 * tables + .5 * chairs <= 8;
    + q+ z1 Q  r, X* \( Vtables <= 5;$ P3 p. ]! J: k* J& Q( v
    13 E9 o4 T" h( z: j% j
    26 ~- ?. ?. b6 {) C- {9 J
    3/ n" _- W+ B8 J$ [
    4
    2 Z  D" u+ \" N/ j: E8 ]8 b55 K' ]! s+ J* c% J2 n* I" a' o
    可以得到结果: ! k3 K& O" z! p9 |$ m7 C: O
    + ~, S6 {, \. W! f: H, v7 J' j
      这里的 Total solver iteration 表示一共迭代2次得到最优解。
    " o, {, N0 I2 L3 w. {# A  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    , g# |* R1 L7 [6 ]  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。9 z  G8 Z  g" {5 ]9 o( m: G- n

    / v6 T% {* G' c! [% H例2:给定一个直角三角形,求包含该三角形的最小正方形。0 N6 B5 k7 m/ M3 _" i" m. Q" m, y9 B

    ' C% t! z; J7 i: P- y' w. c我们可以作出如下正方形: 3 L2 [& n% x* D4 X- q

    , ^% D. d# F5 |/ D- W% e9 c! y, C7 ]" L
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx- x- y4 Q/ _7 l4 v/ i
      转化为了规划问题那么正方形面积最小的时候即为最优解。
    % o, `2 i$ c, r5 U% \  代码:& p* f3 j8 }! o2 r

    , z6 a, m0 `- Xmodel:
    $ b6 ^* n, X# S. F# `& T- ]* z. asets:
    * D+ {3 g, C( G( w    object/1..3/:f;- r3 e7 D# x  N! f' E/ G) K
    endsets8 U' b) w( f, v2 h
    data:0 }0 u& U0 e' G3 [, h
        a, b = 3, 4;$ p1 L/ Y) D, _% L( o
    enddata
    * {! k' A/ t1 s- X  a    f(1) = a * @sin(x);, ?2 ~* _9 n& H1 r+ o0 |! g( L
        f(2) = b * @cos(x);
    : [" n) G+ F# Q- e7 w) n8 e    f(3) = a * @cos(x) + b * @sin(x);
    & J( ~$ p) a  t# Q! y9 w4 _    min = @smax(f(1), f(2), f(3));
    8 M/ y; ]& e' d2 |    @bnd(0, x, 1.57);- B  k0 M8 `* I/ V( x6 Q  K
    end
    2 E; r  M: v1 S: `: ~1/ n: Y  O; A: W8 k  L9 ~& ^2 Q" c
    2
    * A# p  Q" O0 g" j5 V30 J0 H! \9 v! ?" P& c8 w8 s
    4
    0 A5 K7 W3 Y8 m' B# j, [6 ]5
    6 M8 P- \& G- {% l" V2 w% T, R6! I3 }  t9 p; _
    7
    3 ^7 B  K& `; |9 E& c# S# i8+ Z4 j* ^, c. V1 |9 K% x; V
    9! }+ u4 l3 ^% R5 u$ w% C* f
    10& x  q2 V0 {+ P5 o8 B6 @
    11- l) I# q& X' j) P8 L- B
    12/ h; V! i+ |$ |  D3 ^: J2 V
    13) `6 ~( `# G& R5 [; \+ t) t. y
      得到结果:
    . g, q# T/ \( A: L- ~2 v  H3 J0 ~5 f3 v3 D5 l1 S$ M$ k" s  R4 c
    " s3 }: O0 `3 @% ~+ n
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    8 R+ o) Y+ ~: d7 C4 @0 R6 \- w  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    ( H1 x  f1 n. L7 y8 [2 W$ n7 e0 t  R4 k+ @
    例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 ) g, T6 c2 x+ M0 V3 ]. \! T; P
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    $ u  @- {- s0 [∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    ) ^- x  v  o! \* r+ Z  ^由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。7 \- ?# x4 ?- M4 ^

    ' b7 Q) A0 E9 w代码:7 O4 I3 Q) M7 a

    ( ?& a- y/ z% u5 c7 V/ O!旅行商问题;
    4 m# _# Q) s) Umodel:+ K! V: ^/ d( t1 u8 x3 j
    sets:  S. U  I3 u5 @2 J2 W# M7 X
        city / 1.. 5/: u;1 s5 U+ L9 _6 a$ j: `( {  L9 _( k
        link(city, city):" d& T# D/ \; m
            dist, x; !距离矩阵;# F) A" X9 n% M6 i& j
    endsets1 @1 F% T5 c& E7 G! g- G
        n = @size(city);
    6 G$ ?4 X* Y% L7 c3 y3 V3 fdata: !距离矩阵,它并不需要是对称的;& N' ]5 S" i) U. P  W# z
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    / o0 ]0 L3 Q3 e# ^enddata
    & o4 J) X' |# T8 Y& k; g    min = @sum(link:dist * x);
    ) U& U! v6 T( O* S    @FOR(city(K):
    , D" v8 {' d( l: M( ]        @sum(city(I)|I #ne# K: x(I, K)) = 1;. v  u' }! E9 t* v8 J6 w' P$ X
            !进入城市K;5 x; a, m# G  L9 ~5 b
            @sum(city(J)|J #ne# K: x(K, J)) = 1;  K& ~( K- y9 A. K! _0 H4 g
        );
    * V& q" G9 [( }3 I3 U2 h0 `    @for(city(I)|I #gt# 1:# p! a& Q0 {1 C) U
            @for(city( J)| J#gt#1 #and# I #ne# J:7 j# {+ _2 C3 G: i: e" m6 i. H( N
                 u(I) - u(J) + n * x(I,J) <= n - 1);4 u* z. p# \% D
        );4 x; p# A' P" ~
    @for(city(I)|I #gt# 1: u(I) <= n - 2);' M; L8 }/ z# i+ v
    @for(link: @bin(x));8 p4 C* u8 ^( [: X0 w: W" Z5 d
    end
    - n8 s) j; H( {: k1
    % ^4 a/ e+ R* ^4 @2
    $ u) q4 e+ W0 h3 k" O6 ?, n3
    . S* i% s2 T3 N4; ~1 A* f. `. W. _6 y
    5* V8 A0 k# z$ h6 U
    6/ Y0 @( S. {" }5 o1 M9 z% ~
    7* v- W8 S6 X! p& B3 v9 M
    8
    - ], F, g: F% S" w3 L9! T' g- E5 j& M: I& l5 a& }3 X
    10" M& z7 j/ B0 h( F: r2 b
    11
    4 ]# Z3 o7 E3 q. e; ~: @12- |5 A& i, F; {8 P
    13/ c+ T5 s0 |, A# l. J8 D- g
    14
    3 E4 K9 o$ R0 w2 K& N15# V) B2 n9 B+ N+ O# Z
    166 B( t7 _, O- j8 x
    173 x. ^/ L5 G6 B  w$ H# a" C1 w" ]
    18+ a5 ^* A1 Z4 B' a- Y4 t! ]3 j' I
    19
    ! P  X+ \( W! R200 Z2 ^* t' u9 X
    21" _" O2 C* u% h4 f/ U( H8 f
    22: l) m3 }2 F) M3 X" A( Q8 E' H
    23. b6 b8 j8 A2 Q
    24
    ' f8 N& b$ X$ f可以得到结果:
    % G3 N7 W5 s! z, }/ c3 x" ^& C' }2 m
    --------------------- , b# T  @5 O7 j5 a! Z% F
    ' m# j& |' K8 Y+ S5 }/ h( e, X& `! G

    # ]! h' X' E3 W: x$ f3 Y
    1 \7 s! l6 ?& a1 I
    ) F" u) P! g  W3 V! `* A$ s# Y' Z/ {% Z+ w7 z) _
    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 12:15 , Processed in 0.339198 second(s), 51 queries .

    回顶部