QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10051|回复: 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解法% G* ^) f5 g0 v- i& N
    一、 从规划问题引入! h" u) ?1 s  S# X( L' N
    , @- R4 u2 H9 a9 K
      在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    1 e* k% s  y7 y" N; u$ J7 l
    . g' G' y* N! r) x- N! _* p1 k2 x+ ?二、 软件分析与选择' k+ ?5 H. @/ E! n" g9 M
    . Q. D& V+ @" D! p% e
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。2 d. @  R) Q5 u3 G

    * \+ n3 E* u' V, X  首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 / s* r9 ~1 U( ^9 W4 u1 z: M  f
      而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    + @- L2 y: x; _) [4 A: O. Ihttps://www.zhihu.com/question/49319704/answer/165923451
    " o% L3 b6 C1 F) C4 b. Q6 ~( K3 b, T! a. t8 O) J  g
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 : T" \& S8 A( x( A& f* O
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    6 ~% d# x4 \, F7 A3 D) d" q  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。2 q- {( p+ Z  E8 [8 k9 g

    : a( k2 \* m$ l$ s8 e& S8 N& F  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
    * Z5 K1 {! ~9 F1 l* z8 K1 X
    * p; a. i0 n' s) z) {. N三、 如何上手Lingo9 ?( V2 V8 G- b5 j2 `0 w( M

    + `% u4 v' m1 ~* ]6 J* v6 |  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 4 @1 u% @1 Y0 E4 H/ b& [$ M& |
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
    & x; o/ @3 ~1 c' H0 P+ l# e1 j# J# I
    四、 Lingo的基本语法规则* I* v* H; L  h2 O! s$ A
    * _1 h4 Y/ r; i  m6 P0 C- Z, K
    1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    * N, e) G  F% c- @" w  K2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; - ^% |( B- ?8 Q" K- s
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; + E4 L' ]1 B9 a7 g  d& v2 r! w7 ]
    4、可以给语句加上标号;
    5 W# o; f7 N0 @( Z$ d3 \9 @5、注释以“!”开头以“;”结束; / q6 C" m  i* H; ?! c* h
    6、默认所有的决策变量为非负数;
    & M# _+ k$ W  Q9 m+ q& a7、Lingo模型以“MODEL”开头以“END”结束。
    4 k/ M/ r# g8 _; @& u- M- N8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
    1 i: q; J. G; E9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
    8 V) u8 R; P; c# w- j! d5 _' A( }10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。$ Z) v0 F8 O8 c0 W3 r" N/ \, ~

    , O! r& Z* ?5 F' k+ J/ g, A五、 谈一谈例子
    * V/ c9 v  C  f* b$ d
    6 F3 m& I( t; U1 n. `  M3 r  那么Lingo用起来到底有多简单呢,我们来看一个例子。
    * \( J4 @) Z3 n# h! _, E" T, g* w$ B% d: v
    例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    ; A9 \! j5 Y, u8 e/ X$ V( @5 ?' _2 M' P2 Y* b
             每个书桌        每个餐桌        每个椅子        现有资源总数5 u6 S8 Z7 w( P% F7 z0 V1 j4 ?
    木料        8个单位        6个单位        1个单位        48个单位
    $ x  ^+ `. V% B% `  w/ i  L7 U) }- a漆工        4个单位        2个单位        1.5个单位        20个单位
    3 H% K5 x! _6 n木工        2个单位        1.5个单位        0.5个单位        8个单位
    " T5 |! s& r9 R" e7 l成品单价        60个单位        30个单位        20个单位         7 a. a# m; m- h; }
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    / t1 I6 ~5 z. E  T/ t8 T3 I5 S
      H( k, d5 K4 ]  E解:代码6 Y. H. A& l! n* ~$ w

    # R; ?+ [9 g- J6 j+ e; amax = 60 * desks + 30 * tables + 20 * chairs;
    , U& X3 D5 z/ Y( E) r      8 * desks + 6 * tables + chairs <= 48;6 W- `: c8 P5 l; y) o4 a
          4 * desks + 2 * tables + 1.5 * chairs <= 20;( V$ ?4 W0 S7 i8 [6 ]6 G2 i% r
          2 * desks + 1.5 * tables + .5 * chairs <= 8;% |: k. U7 t6 ^$ h
    tables <= 5;7 D+ @6 d/ _- o* z  ]% y) L) [
    1* s/ D; i0 G* {1 H+ ]8 c+ Q. M
    2
    3 W, _; E. [; u3
    0 U+ D5 a. z7 V; N* ]. e8 n5 k4
    ! x0 g+ N* t5 ^5 A6 y5
    & H; c# f% y3 _, `3 Q9 Y+ A可以得到结果: , x& s( j0 c9 p9 e

    & s. f6 c: H& e& S  这里的 Total solver iteration 表示一共迭代2次得到最优解。 8 x* m9 o9 x8 p) o# \. n( E/ q6 \$ e
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    " Q$ k! b; d% p  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。8 H7 k7 }1 _& W: {7 I
    ! l, B. B! q+ v8 _' t! X4 r
    例2:给定一个直角三角形,求包含该三角形的最小正方形。
    . G9 v/ d6 H, E9 }
    * i+ R0 I% m5 i0 o5 Y我们可以作出如下正方形: ! w8 a- t& l" z! n; ~
    & L0 c4 Q) [/ n  g* {

    5 V1 O1 d4 R/ [8 O  CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx: P6 [& x( i7 l1 ], @3 u
      转化为了规划问题那么正方形面积最小的时候即为最优解。
    , n% N1 C# ^* t- l8 @3 O! c6 \  代码:- h  ^. j6 @) Y$ B8 s1 e" c; E

    & I8 |) @3 o* j$ N9 {- Vmodel:
    0 G- C6 {) i& vsets:5 N* ~* X. @$ ]) R" r
        object/1..3/:f;
    & [7 m) V& Y# w6 I. m$ y9 B9 u* Mendsets' a: Q& f4 c5 S, z  N& t( P
    data:
    / s) a  Y8 _' ]* `& w- @    a, b = 3, 4;- z9 g- a3 |3 L+ V( M
    enddata( N9 [1 [; f2 k' n: X, k
        f(1) = a * @sin(x);
    7 _3 z) e. f) ~+ _# w4 T    f(2) = b * @cos(x);+ W: k6 {" b+ I. A7 c
        f(3) = a * @cos(x) + b * @sin(x);
    ( |) T& E/ n: x& w+ f7 S    min = @smax(f(1), f(2), f(3));: s* U& L& v5 w0 f4 r
        @bnd(0, x, 1.57);
    3 D# j2 g# d5 F- wend6 ?( l" U) E' `& f- l3 H: Q
    12 P) }0 t# s" P1 |% S- c. Z5 g
    2! y3 Q9 u8 h5 Q+ j
    39 O- C" W$ J. u9 W" i
    4! ^5 \& A# g( g' ]4 V3 M+ h' y
    55 ~' Y1 F; h3 ]* k- h+ L3 D
    6
    / c- P. f" X' S7: X- w$ q5 y' C& J; f$ o: x) Y' |
    8
    $ O2 e' g% h% [% p& c9( a) _. j9 ?! _1 m
    10$ k3 y4 S7 {& H) a+ T: w# G
    11
    : [# D- b  @' X. o& k9 B& J) @127 N: t. \$ T3 Z4 J- _9 f
    133 L; L6 h' s& [& n
      得到结果: $ p2 M9 E5 y% a4 i8 v/ ^
      }( h) E9 d; l

    * j, _! g' l, n% S- n  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    , S. w; U! M7 Q1 o  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?' y3 ~8 [' o# V) w; y

    1 S: O' O% o9 ?8 A5 X例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 # J: g5 i* e8 u1 M. V
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj+ l1 \' L6 w$ ?2 N
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj( b' T1 L! c8 W" Z
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
    + j1 ^6 G0 p* l. Y6 q/ G- t! C7 E
    1 X3 q) T) ^0 w3 y  h代码:
    1 U1 f4 y, B) o4 Q# A( x3 `7 t. p8 Y9 p
    !旅行商问题;: x4 b5 V/ O8 C4 H; Z" C0 b' C
    model:1 F* x7 Y& Y& T! Z/ A
    sets:
    , G; c/ w  K# U; [, F6 X    city / 1.. 5/: u;
    : M+ v9 v$ i' l1 F! [    link(city, city):$ q) h! T& ]+ u' k% h7 ^
            dist, x; !距离矩阵;' v% k3 n4 I# ~; z* g" ?
    endsets4 h/ A/ `+ [' c) ?0 C* {4 |
        n = @size(city);
    $ l; ~5 T; T7 m# k( b% G* ndata: !距离矩阵,它并不需要是对称的;  A7 e5 p. S3 u
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    - t' A5 j2 J2 l2 y. ]8 W) D3 D0 e9 aenddata- \; N; J, ?6 Z5 F! ]- p) Q
        min = @sum(link:dist * x);7 i2 x/ j" ^. w# t' V7 s( e4 ]8 i
        @FOR(city(K):
    ; a/ U/ C$ }$ a; j/ x+ B        @sum(city(I)|I #ne# K: x(I, K)) = 1;" H5 g% e! \' [
            !进入城市K;8 E/ C; D! O2 p
            @sum(city(J)|J #ne# K: x(K, J)) = 1;; a# H  U8 s/ I, S+ w
        );
    7 F4 y) I5 {, q8 ^( B+ q4 s    @for(city(I)|I #gt# 1:
    " [+ z% R" ^, M8 E        @for(city( J)| J#gt#1 #and# I #ne# J:+ Y# M: |1 i. d5 {4 |
                 u(I) - u(J) + n * x(I,J) <= n - 1);
    " q5 a4 U6 T0 D3 s/ ^& r' [    );
    * r7 j* F  e8 Q7 p) b% y1 Q@for(city(I)|I #gt# 1: u(I) <= n - 2);4 E5 z) h/ t+ J( Y
    @for(link: @bin(x));  a3 W) ~, U: ?
    end
    9 {* j. {/ r! N( b# @3 l4 J2 L. k1
    3 E8 r4 t8 B( K5 g1 o2' S- i6 e, v' |. g
    3
    ) n2 V4 U% R6 n$ K46 V+ B' d* H! j& M! i& g
    5
    + T  r6 t8 J+ w5 z6& u1 O; e0 o9 }) X
    7
    7 ]) B+ E7 x( F! g+ r; n) i1 s/ D8
    + s! C3 [  m2 F! y1 I$ A7 ?9
    7 N, J* k4 ]. Q' I$ X# @10! f# ^/ R% Y/ _
    11$ A2 `/ _' t/ g1 N
    12+ w, T/ x, ^! r: l( C+ g% L
    13
    % [9 O; e( J4 q14, f- @5 G/ e, t  }+ P4 P0 l
    15: U3 ]& {6 J0 u' h
    160 r5 Q/ J: Q' I0 i2 m5 v7 N, ^
    176 n) Q) `& Q5 J- A% b0 B
    18& ~  r/ @9 X9 \2 s# C7 |
    199 m! U: F* v, e0 G' }7 `
    20
    # T; O9 a7 `  }) z% |21% K/ T  C% [0 d; @
    22
    + @! _7 n. c' _/ G7 ?; z* }* n& t237 ^% z( c& Q( g+ K0 ~
    244 m: [$ i- w2 |9 ]& b
    可以得到结果:
    + Y9 M8 t' _8 [: T; Z- F4 y
    & e. ^2 g9 l0 G# Z- T* f---------------------
    4 @; b8 K6 n$ c8 l0 U7 S
    8 _& X, I' n% h3 r$ V7 p
    - V3 o4 [2 w( b/ @! N- ~1 S. T+ B* Z* I
    . Q( k( y2 r! @5 G" j# x' J* Q1 j8 @/ B
    ' G7 N! R) l* j8 H5 V" P( T7 {
    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-16 04:39 , Processed in 0.418344 second(s), 50 queries .

    回顶部