QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10005|回复: 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解法/ h2 A* f" q. x
    一、 从规划问题引入
    # a- N% |/ E  ?! e4 n' s. O7 r! m1 S; ]0 z
      在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?0 Q8 `& ]$ `- _7 i$ T! C! M

    . H( f( K& d/ b# J' ]6 ]0 u9 R6 U二、 软件分析与选择
    # m" e0 T6 h! g" M0 R, r0 d1 U  F' V8 K2 H4 y- z. h
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    , @. ~9 X+ q8 t' E7 p& J7 T( ]$ k3 B" X1 D
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    6 ]: n/ l: o- R+ G/ e2 b  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 $ }+ A: y$ G  y1 Q0 b* E
    https://www.zhihu.com/question/49319704/answer/165923451
    0 j, D, P, o$ \& a. x8 T6 E7 D2 X3 s, E0 Z: B+ v1 ?
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 7 I# D% E! U  U; |* ?3 l; [
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    8 D; }- U& N- s' Y$ J. e7 \) P  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。+ `1 ?$ u3 f# |! Z9 o" t0 v# |

    & Q! R" \! H, D' ?; x  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。2 o3 E* @( T; a6 s
    9 W8 D* K; o; Y) I8 r4 [
    三、 如何上手Lingo+ g/ `9 [5 i: {" N; q
    * i4 C, J0 Y5 [0 }+ u
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
    6 V$ W. B* e# `# {4 A  “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。0 M' G, u2 e+ P- B, W
    7 d5 F% j3 t6 C8 r+ c7 x/ W
    四、 Lingo的基本语法规则" h4 n4 G8 Y0 f% `" E0 z

    1 q) Y8 h- |0 _+ [" S6 O1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; - }8 K0 @# P0 L
    2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; / r+ S, l* M' e' W# ]% B& }4 l- t
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    3 t8 I$ @! H: M/ [1 w4、可以给语句加上标号; % b" Y1 f! W" N
    5、注释以“!”开头以“;”结束;
    7 W! h0 w0 f" f/ \, t; u3 V6、默认所有的决策变量为非负数;
      `# _! x3 v& e) Z7 j7、Lingo模型以“MODEL”开头以“END”结束。
    : e' ?9 M* x; @* u( P: d' r4 G9 X6 B2 ?# }8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 $ W' `. L# W/ b( p0 l5 M
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
    ( F# I7 T6 o" B10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
    2 L9 x, j0 e: m2 [$ z. R
    6 x& _' ^) W! ]) Z$ P* ^五、 谈一谈例子2 t  L7 d2 l3 _4 k# ^# N$ C

    ) J( N7 @6 H5 z! I( A+ Y0 g0 {  那么Lingo用起来到底有多简单呢,我们来看一个例子。- T% {. M2 m7 ?$ i) p3 \8 p
    7 P4 L6 g; R$ p2 |
    例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:5 k0 s6 _  }# P* N9 q2 D
    " G2 V$ ^/ H! ~  i; t
             每个书桌        每个餐桌        每个椅子        现有资源总数! v& m0 Q9 s* Q1 O8 u$ j
    木料        8个单位        6个单位        1个单位        48个单位: M8 U4 H, e5 M: w
    漆工        4个单位        2个单位        1.5个单位        20个单位  G) f6 j) N1 M# E5 L5 L$ C
    木工        2个单位        1.5个单位        0.5个单位        8个单位
    6 |4 k( [+ @" \$ o7 {- g7 i- x成品单价        60个单位        30个单位        20个单位         / |* W0 W: g. C# }* F- N
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    9 L# N4 K+ U# T7 c, Z+ ?! z1 B* |, O+ o" n
    解:代码. M( A4 F4 t4 T  v) z3 G, Y

    : ?) @# _' ?/ _. e5 vmax = 60 * desks + 30 * tables + 20 * chairs;
      ~6 C/ f7 r6 V8 D      8 * desks + 6 * tables + chairs <= 48;: n$ m7 e' G, v- R( p
          4 * desks + 2 * tables + 1.5 * chairs <= 20;
    7 K% i8 j) T, f1 g/ F0 T0 o/ |3 w      2 * desks + 1.5 * tables + .5 * chairs <= 8;7 L! p) v( V& K8 U2 i4 @( Y
    tables <= 5;2 L- ~; H7 i+ l' u  W
    1
    + K) v- n* W! f* w' t2
    ! @; j% B6 P) M8 Y3; `: r: y) {/ A' y; {, Y: N) q
    4
    $ X& Q% Z* z) F0 X  C7 s  m52 g7 A1 M& c# n" [: b& z# J
    可以得到结果:
    + F+ d( X% {2 O2 B+ {3 S0 U4 J% ^. U0 w4 P& c) W
      这里的 Total solver iteration 表示一共迭代2次得到最优解。 : X) O: |" l8 g; _
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    5 u4 `9 r# Q, {; d' l  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
    6 Q+ C8 i- U8 ^# {8 Q: H* f) o, y7 U8 M7 B
    例2:给定一个直角三角形,求包含该三角形的最小正方形。; j: {! L! J6 r6 u& `* s

    - h) a( T! D6 N: P& b; U我们可以作出如下正方形: - t* y3 }8 q) H) L

    9 t$ W6 A0 n. z: n/ I3 P. G6 X! F& M2 N) V
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
    1 g. j% k$ _  ~7 c) |; |6 C; l' s  转化为了规划问题那么正方形面积最小的时候即为最优解。 9 O9 P, t% w% u+ x0 ?/ O
      代码:4 w( }0 n) @! V7 A9 z1 f6 I

    - f5 x( _7 Y8 }) u) O# A4 l. x" Vmodel:4 }8 d  S1 \/ k
    sets:7 E: e9 U! l) }
        object/1..3/:f;+ l1 i( @. h- N! m" Z5 o2 R, j
    endsets+ Y' U! C$ |  d7 ?
    data:. s, w- @5 `/ h( y: G+ J7 X* O
        a, b = 3, 4;% A5 K$ o! V# }. X
    enddata$ l% O5 `: P: k
        f(1) = a * @sin(x);" W  z- q/ ~9 D
        f(2) = b * @cos(x);5 l1 y' Z) J/ W  a' x
        f(3) = a * @cos(x) + b * @sin(x);
    " W4 I" m$ l  C4 @# F0 t8 K    min = @smax(f(1), f(2), f(3));
    $ v2 A: l, d2 G# D+ R7 G# |  A# H    @bnd(0, x, 1.57);
    2 p8 V, E6 b4 ~" p! G+ K2 J+ Jend( p4 U7 D0 c: ~: |
    1- k; C9 i7 n: Q' D, v
    2
    ( D' g, W1 R9 r3 g4 E; k; ^. e3" {# ]' {9 [& P( V2 e: x
    4* ?! B: L( o5 z+ X
    5# N5 A0 U: Q1 V. M- D
    6
    + t9 L% u3 O  w7
    % C3 a8 |2 _& v: k6 p- K6 z9 ]! j8
    5 b! `; d) z$ w; }: l9: K' Z# b6 w7 s$ s6 Y' g
    10
    / n8 P; l6 r) q+ D1 V11
    5 w' L" U' p6 T12* _# X% _( R* f4 ^
    132 A+ _9 ^3 w# l3 F, Y8 h7 `
      得到结果:
    * ^* s: A  U+ e  ~2 z5 V! d. g5 k" ~* s
    - b* _) J6 y4 R; v$ }3 J" H
    - E" C$ z+ {: n  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。9 i0 f1 H4 v- ?0 m# b& `
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    : C  C1 C8 e! h1 z- j, w/ u
    $ L2 ?) D2 E" T/ b( d: i0 `例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 - q$ g* C3 g# f6 m& ]! r  n( u- S# _
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    4 X+ `2 t! D, k9 I" d; N∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    7 P3 D, T3 A! `7 C- G由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。% ]( d+ l4 A% o* t( d: d7 G
    / r' @8 }! |7 G, s+ B
    代码:
      F( S9 ^) D1 e$ a5 X+ F* m0 N" Q% O1 X# B8 {
    !旅行商问题;
    + M, m" q1 k& }2 |! m1 o3 ?model:
    ' W2 Y+ Z/ X% a7 R3 o6 r8 `sets:
    % p  A3 l9 o% `, `& R    city / 1.. 5/: u;
    ; i$ }4 W) I1 @0 H    link(city, city):
    4 k# b/ ], x6 P        dist, x; !距离矩阵;
    . A6 G9 p4 G( {) P% {8 f3 H  |endsets
    3 z; K0 j; y8 p5 _8 _( M- ]    n = @size(city);
    " U8 x7 @! P8 l! ]4 I. B. c" @$ c0 Fdata: !距离矩阵,它并不需要是对称的;
    : ?, A: k  ]" y, N- K7 Z- g% q    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    * W0 Z9 A' r* A9 K$ ]  K; j- Wenddata, e5 w7 W; i" c
        min = @sum(link:dist * x);0 G' p$ C+ O" V! B; w5 ]; y
        @FOR(city(K):& V  ?5 _7 o3 ~0 ^0 {3 x( k# K8 F: z
            @sum(city(I)|I #ne# K: x(I, K)) = 1;* s# J* q( }( Q
            !进入城市K;2 Z2 e6 }4 S% x6 e
            @sum(city(J)|J #ne# K: x(K, J)) = 1;7 Q1 K$ |* t( _0 O
        );4 ~( a" W3 r1 w7 o2 T9 K& m
        @for(city(I)|I #gt# 1:
    3 p4 S) d3 A/ O7 ^7 U        @for(city( J)| J#gt#1 #and# I #ne# J:8 ?# J6 {3 e; ?; W' A; l
                 u(I) - u(J) + n * x(I,J) <= n - 1);
    ( A( K. h1 s5 P2 z' i$ [    );* C$ ^% q( j; D2 H- J
    @for(city(I)|I #gt# 1: u(I) <= n - 2);) @; K; z+ E' \1 G
    @for(link: @bin(x));( \/ i: @+ Y4 [) H: g  Y
    end
    - o! w4 u- |" O; _& Z- O  e17 M1 V% ?- H0 [5 a2 ?; {( _8 H8 s
    2+ _0 u- g( C0 y& y$ h
    3
    / `5 V2 B; f6 Z/ l# G4
    , i% V" W" w1 Z$ j: f6 g; s5
    # n1 S: |5 b6 @# Z  }6
    ! h( P8 m( m% N+ V! {  o7
    % \9 _( S& \4 z89 c6 p1 b9 E5 F
    9
    # \5 o7 g1 j3 G' B& V$ Q10
    , r3 _' q# w* p% w) ]11  A0 r) d' e# r. R1 I0 b
    12/ Z, o5 g; d1 V/ B6 Y. `6 V( G
    13
    5 M/ X7 T+ N6 Z$ s1 \- h14# `! o) u, F, D8 C# o* D. p
    15" E0 Q/ m3 B) e' G% V( F
    16
    4 e3 [' e0 t  x, M, t" M* w. @17
    8 A( I: {+ D0 S18
    ( {8 H# m. d6 }" p0 l0 C19* s7 X- K! O, ]$ _( ]( J
    205 U$ W) M7 ~! N9 i
    21( Y" n/ n, x2 ^, K: x
    22
    : r; x1 N* y. R4 g23
    : V( {7 [4 G/ z245 Q2 |7 @. {9 x0 |5 L6 X, r/ X
    可以得到结果: / W5 E$ ]7 M( f4 c' _5 N
    3 v3 @7 Q: Q8 C. y1 ?
    ---------------------
    - G2 a! J) f  P7 Y" @
    6 p( @4 m! {/ _8 e1 _: M/ w0 P
    , B. b! c6 I% s! w
    8 o; X  W7 T, h9 R! U* o; k
    + u5 y8 S6 b9 w( n) r8 u1 O/ N, }( Y8 e- a
    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-1-1 15:24 , Processed in 0.481944 second(s), 50 queries .

    回顶部