QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10044|回复: 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解法
    9 ]: U4 g, l) `7 W; w( Z8 e! n# i一、 从规划问题引入
    # A' s3 [5 l9 }( u
    7 Q& {# {& z3 L3 h3 b  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?9 p4 ~5 g0 X. m; B# t+ X
    # J" A+ V$ Q$ n' e# L% V* Q
    二、 软件分析与选择
    / w8 w9 X& `. q1 ?. K
    ( g0 x# W$ a! Q5 G  Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    6 c5 W6 l  d  S' @6 \6 h
    " P& I" b: _  u. a/ q  首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    ( p3 b' E" i1 N  }( @# \8 r2 s  N  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 1 _$ ]! Y$ a. M
    https://www.zhihu.com/question/49319704/answer/165923451
    / v9 {7 M) I( o+ D& u6 K: X8 s
    8 y+ {3 {) G5 a  用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    - p) a/ M4 z) f' V( @4 t- B  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    0 F6 \/ _; b* j: |  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
    1 |5 `3 ~# M+ `
    ' c# u! {0 g" h9 s" T* o* }  ]+ _" h6 J  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。  }5 ^' c; V$ U  L8 g
    ' g. n5 [8 Y3 g6 t# l  i9 X* L+ K
    三、 如何上手Lingo
    " ~7 ^0 x6 E9 w& ^" h
    ; ~& P& V6 I2 |( _/ n  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 ) \; c6 r$ e0 `' \
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。! C* [& j, I0 N6 q- V; B; {

    4 f# H: P; K' D) o. k2 I四、 Lingo的基本语法规则3 L2 B3 g" @  ]# |0 ~. d/ u

    2 j# R6 j" }+ t# F1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; , G! p% b& O$ c- l
    2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
    4 j# [0 R$ j- E% q) D7 P" u3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写; 4 W8 f6 W8 _9 h* m
    4、可以给语句加上标号; 5 }3 w+ W3 R, H( {
    5、注释以“!”开头以“;”结束;
    / I8 e: D: l1 c" L7 w7 R) w! p( T$ I& C; U6、默认所有的决策变量为非负数; ) H+ N  g" g5 P" V" h9 q
    7、Lingo模型以“MODEL”开头以“END”结束。 ) r2 \9 J; f/ H5 a+ J/ ~
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
    9 ^; i! W5 u' z/ Z0 P; x9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 * z. P3 @$ |" Y; Z7 b( u6 y  x
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。9 d- ?" S% k. Z* b
    2 b  X1 i& y/ n. h
    五、 谈一谈例子% F% }; ~. d  v! i

    6 G" Z% t, D* i" b+ Y6 N3 _  那么Lingo用起来到底有多简单呢,我们来看一个例子。
    / `0 Y6 }6 n/ A
    8 O0 |% W$ ]' [1 s+ y/ g' C0 @例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    3 {) H  M$ w% I7 y3 w1 Z4 u
    # _0 D: K. y: s3 R$ J% L' _         每个书桌        每个餐桌        每个椅子        现有资源总数
    ( s9 l/ e  f- B" ~  k. d木料        8个单位        6个单位        1个单位        48个单位& _, V1 ~  m+ ~: o/ h2 _2 [: b$ E. {
    漆工        4个单位        2个单位        1.5个单位        20个单位4 i, i- e. _/ t
    木工        2个单位        1.5个单位        0.5个单位        8个单位
    9 n& t3 u+ E& F( `4 q9 D成品单价        60个单位        30个单位        20个单位         " ?* u2 p5 c7 \& E1 D
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?5 X, \- w2 z! K6 C3 r

    ) G% I# o2 _( [/ X% Y2 t, ]解:代码
    9 b& \; }3 @. ~+ [9 D3 n+ ?8 R
    2 G6 |+ t# w" c1 a. lmax = 60 * desks + 30 * tables + 20 * chairs;
    2 V4 Z2 l1 P% n7 W! y* b2 L      8 * desks + 6 * tables + chairs <= 48;3 v& Z* M$ A: x* y; h3 [
          4 * desks + 2 * tables + 1.5 * chairs <= 20;* r& C/ u% f1 u$ Q% H: C8 {  J9 W
          2 * desks + 1.5 * tables + .5 * chairs <= 8;" C: f, [/ B, m4 u! Y
    tables <= 5;
    4 H8 U( d8 Z& b/ m- l6 q2 y$ ~* \1
    & u8 v1 ]# }( q. M2
    ) q1 |! l# \# _  I. V0 \3  y! ^6 L% H/ x5 m$ n4 O( ?- {  p
    4  |* H9 P, ^& i0 v8 j
    5
    ( C) H) J# c9 G0 Q! {可以得到结果:
    % K6 G2 }5 l- }1 }' q+ T6 ~! J& y+ Z
      这里的 Total solver iteration 表示一共迭代2次得到最优解。 - W6 C  c$ {) @7 f* c2 O; T
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 - U- _) ^7 B6 M
      可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
    1 D! y1 @2 \2 W" p' T4 d- p8 u# ]8 X$ U$ O. N3 ?+ Q
    例2:给定一个直角三角形,求包含该三角形的最小正方形。9 L; R0 W3 w% s
    - Y2 {5 a+ O2 B
    我们可以作出如下正方形:
    1 X( Y" Y7 _# v9 g# h; T; Q6 S" t7 V6 U: h: @3 B+ r7 ?- g
    8 E) \. T6 c6 i/ F+ Y2 L+ Z, U
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx$ ^. Z* w' R' v# }" E
      转化为了规划问题那么正方形面积最小的时候即为最优解。 3 M% X5 E( w0 o, j% Y  D) l
      代码:$ i$ {7 i) v! c
    9 m! m' z  T; c4 H) ~( J3 T" }- l
    model:
    6 n9 s( R0 {6 p% E( rsets:* `- c0 X8 N0 C9 \2 }8 g
        object/1..3/:f;
    8 k& C# ]' Z+ [5 _' z9 b/ Qendsets! w6 u( `4 u- E. z0 H) y. A0 n
    data:
    ) g) Q) T! e$ f' ?% r8 i    a, b = 3, 4;
    7 n1 K& `- }; p9 r0 |enddata: k6 E  `; L6 o) a+ O& M
        f(1) = a * @sin(x);
    4 }, m: K9 {) _0 O+ [1 w    f(2) = b * @cos(x);$ C& j8 n' P. ~4 `: z9 C4 a+ _3 A
        f(3) = a * @cos(x) + b * @sin(x);+ r3 y0 X2 k$ L$ m9 v9 p/ ]6 K
        min = @smax(f(1), f(2), f(3));( M+ }7 i1 m/ c9 y5 G! j' d
        @bnd(0, x, 1.57);6 e% p5 D% b# e" s' J7 l2 h" h
    end7 ^' X  z+ k! ^, W$ P( N2 g
    1
    , Z% n+ m- ?% V) R, [$ X2
    3 d, U: a: D4 Y" a; S3
    0 E% p+ Z  C  h& [- S2 N( {4% I2 H( C, e/ w9 z7 h0 b  S2 }, r# O
    5# J" O3 p5 F( }9 N9 h/ e* t
    6
    . P; ?1 L3 ?; P" `& h7$ t( }/ [% C* j
    89 |, _1 ]# u3 n
    9( D! r6 i4 Z: h; Y9 y
    10
    - y3 \& ^) }& V; w) M. ^6 ?1 k7 M/ i11" \( R! V) ]  w! ~% m0 _/ n2 i9 W
    124 Q+ k. L! @$ Y' W( E  R
    13
    . s" Q7 P- c* E  r  得到结果: % J/ ~( R: M& Y& o# C& r9 H
    " Q4 o1 T4 n- r
    3 h6 G4 }, C" u9 o5 |- P7 p
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。; b5 l/ ~. c0 f
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?" i5 G5 D  Y" }

    % t, [- `5 z9 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 2 f7 q& `9 H, F: G
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj5 |# O& E9 c# X& o  \8 i
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj8 w# r* z- ^1 X& K3 }
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。* K$ ?7 X0 j+ U( g- _

    & C8 v3 k7 z9 y4 H) a1 g* ]; S代码:4 @# B% m+ d, O
    4 c+ g! T8 e, t
    !旅行商问题;( `( O+ c" R' C: L0 M" T* q
    model:- K5 g! f( ~. r/ @' e. ]# e
    sets:, y8 M$ J$ F; P0 g/ Z/ a
        city / 1.. 5/: u;
    4 U. g; C/ b% g) Y; [2 f2 n    link(city, city):
    ' T4 s4 q9 c6 E        dist, x; !距离矩阵;; I* D9 A' i8 l6 P
    endsets6 |4 |* R- Z$ B) J; o0 S
        n = @size(city);$ h; L, M7 M6 g% r
    data: !距离矩阵,它并不需要是对称的;
    " w0 D" e5 r- g/ H3 k3 ?    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;% A* J/ f$ B4 z  N
    enddata
    ; s" Z  H' F, _. k    min = @sum(link:dist * x);$ y' b, z) w/ D2 }9 H. n+ _+ v
        @FOR(city(K):: c9 ]( r7 P9 m: R- L7 o
            @sum(city(I)|I #ne# K: x(I, K)) = 1;: n2 y, i! J: o% B. U1 T
            !进入城市K;1 B/ w9 ]. `. S, Z9 @$ C
            @sum(city(J)|J #ne# K: x(K, J)) = 1;
    ) p( @8 }5 ^) T7 g2 N    );. c% }8 `' s$ Y( |* f
        @for(city(I)|I #gt# 1:8 o5 _( n6 S2 _2 N
            @for(city( J)| J#gt#1 #and# I #ne# J:
    6 ~, G; _- n7 x! Q0 K# K, v* Q% F! N             u(I) - u(J) + n * x(I,J) <= n - 1);/ s( j5 }7 T9 k
        );
    / D& H; W' T# a$ f8 R3 `1 F0 C2 z@for(city(I)|I #gt# 1: u(I) <= n - 2);# {, {9 P! M. B
    @for(link: @bin(x));
      e) ]' u2 |3 i4 {( c$ g4 Wend
    5 r1 u. u  h- M: e/ D7 @; l+ R1
    & {1 r. i( p' h: m( `2
    " k0 c# P, I: {1 S5 ^3 W" h3
    ! g" e0 x0 S( w' q! u4
    : X9 U" Q, p3 Y/ |2 F3 I5
    5 q$ p* B$ P! @6
    $ w/ R# U: W2 J7
    0 Q; h! V& z& I8 F8
    , h+ l' |5 [1 E- x- t( R9% }7 [# I4 \3 [  O. d$ T( T
    10' d  M- t; b9 d, k7 t
    11
    # X5 ^2 u! h$ l% {% p% l7 n12
    ! `3 k; V6 H/ j. S136 l0 g$ @3 m) e) J: G" ^
    14
    1 ?, o  h) m# Z3 X# X4 ?4 V& D15
    7 L/ {& ^  Y; I- L1 q) @$ g# d16
    # k# R" A# T2 a) V17
    - q, o0 _. I3 B$ F) ]18
    % x. Z3 o. _  U9 B* U# j19. m) z9 ^' x$ V7 Z3 m. D0 W
    206 _  X. g- X) j  Y
    21. |2 Y1 n" B" {
    223 ]4 O' W  k8 D; w8 Y
    23
    ) d9 K0 m' n  J( u. w& _24
    1 s* X) Z9 q1 ]7 ^/ m, d3 [可以得到结果: 5 `, U( w- X( _* h) Y: v

    7 P! R5 U$ K9 e9 M  F--------------------- 3 @% s) H3 a2 D( Z8 {

    2 ^2 O4 u% B1 \! E$ R9 ?- n# V( V- _/ {  {/ E6 w
    2 ?; G8 v. u0 D8 {1 Z, e
    5 d/ B& O& b% \$ t3 ?

      J' C# B. T7 _) c( w
    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-12 04:39 , Processed in 0.349304 second(s), 51 queries .

    回顶部