QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 9831|回复: 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解法
    7 ~7 h' ]4 f# U* F( v一、 从规划问题引入
    / P& X4 e; y- D
    ; U2 ~. O* b. _6 t. D/ j# a* @6 |  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    $ O3 i- c! X' s7 v6 `7 ~1 ~# ]+ c0 O* Q2 M  U6 l
    二、 软件分析与选择
    " o% H1 `% \% _% q! m$ U, W/ @  Y& f* J0 P
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    $ T$ k0 Z% @3 s% l# X3 |
    5 n9 ]' I7 J, B  首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    ' y. S5 A  A( E2 t0 m% H+ D$ s' z8 j: Z  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    $ n" Z& L+ Y4 q" \https://www.zhihu.com/question/49319704/answer/165923451, u. R, V  L: L3 L* v
    0 F+ ?. S3 [( b$ D5 e/ o- i3 y" X
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    # U0 K" I* X: E6 k8 i7 N  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 ; g5 w/ R7 H% Z& B  [0 Y) _3 B& G
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。: y. J# }  S7 i7 ?
    0 [4 n  V' d# j! t7 F+ V: |
      那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。+ k2 h  Z6 X7 P  X

    5 r. i$ Q% ?4 [3 T  s三、 如何上手Lingo9 |& X5 r. E: {6 d
    ) Q' o' d: A, e# z$ n- j, m5 f
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 8 N; u0 q# {5 v* ]: L  A# I
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。& Q0 U" S+ ?) C# l. @# R
    & M5 y  N6 P4 ^( z5 N4 `" y
    四、 Lingo的基本语法规则
    3 r' g5 f  M: I  W5 B9 u3 P2 x" k; v" Y8 a8 _+ r' ?" _; d( S9 F4 T
    1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示; . p$ S# o, o: X+ q) {) T) Y0 ^4 I# g
    2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
    + w( O  C" H, o* u7 h/ J3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    0 C  i4 U" D) _4 i- ~- Q4、可以给语句加上标号;
    4 {% k# {' i+ z$ ]* N9 v5、注释以“!”开头以“;”结束;
    - G$ T0 {) @5 O) z* x! _6、默认所有的决策变量为非负数; ' W  I4 f* `( y( ~
    7、Lingo模型以“MODEL”开头以“END”结束。 ( [) k8 j+ v. P
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 3 k+ N8 H% ?- s+ u8 @: g7 i
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 9 C4 I5 n+ H% e/ z
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。! L6 _3 \9 h% c
    ) H3 ^% N+ n5 G" }, O
    五、 谈一谈例子  r9 J' z4 N3 {0 `5 C
    # K0 P9 R, b* M- K2 J7 z1 Q
      那么Lingo用起来到底有多简单呢,我们来看一个例子。6 W5 l0 z( x2 K. ^2 _7 j% K4 V9 R4 G. B

    6 c- ]* ^1 I# S0 W. W5 C例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    6 f/ e) G7 W2 X
    + [8 N7 w6 A; r1 G1 O         每个书桌        每个餐桌        每个椅子        现有资源总数
    1 S8 |8 u. K2 l2 b: h' I& S8 ~木料        8个单位        6个单位        1个单位        48个单位  K% E+ m, [9 X* V/ A9 A8 q3 m
    漆工        4个单位        2个单位        1.5个单位        20个单位2 x& C2 s1 _, R" y# l% j
    木工        2个单位        1.5个单位        0.5个单位        8个单位
    0 H% X) r. d! L0 v0 E) w$ F1 g  L3 Z# `成品单价        60个单位        30个单位        20个单位         0 y9 w: v/ u2 Q% C4 Z. t
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    7 L1 X) C# b' j& K* }1 f  H' N
    ! Q* K9 a5 T8 q' u解:代码
    $ d1 b. o' r# v# f  D4 @5 z1 D0 i
    max = 60 * desks + 30 * tables + 20 * chairs;
    % y4 A7 j/ a  m9 T# V" q/ e# j      8 * desks + 6 * tables + chairs <= 48;
    " G/ I. N, N. b/ s% i      4 * desks + 2 * tables + 1.5 * chairs <= 20;2 {6 n  W# D6 W0 l* U
          2 * desks + 1.5 * tables + .5 * chairs <= 8;
    ' k! N; Q  H& k4 B3 Atables <= 5;* m( Z) R! B" N) j" {& u
    1% W: v9 p6 i3 j$ E( S" q
    2
    ' U0 i% |' [7 P7 b32 z9 |1 `) x1 D  n" C
    4& _) D  J( t: x! u
    5
    " U  t; W+ H6 Y) k: n7 G! r  w  I6 o可以得到结果: 0 n5 w8 ~" P9 U
    # M6 a& l! x& z# m2 W
      这里的 Total solver iteration 表示一共迭代2次得到最优解。 + j- J$ y7 m- o8 W: D
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 1 }) E, C. K9 d/ \- I: ?
      可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。& A8 A& {( \  ~8 W: Y  E8 Q  G
    . n9 _/ m9 V4 W/ v% U5 K, X
    例2:给定一个直角三角形,求包含该三角形的最小正方形。0 J; r8 L3 I. r( l6 K

    / g, p- j% i8 j3 ?& }* K我们可以作出如下正方形: ! c9 p* j  K+ l  e  I  O% k; K

    5 }1 L- N: c$ Q2 T! O0 ~  X
    . u5 W9 B8 M0 f( I5 N  CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx6 ]$ `7 o  n* L+ y
      转化为了规划问题那么正方形面积最小的时候即为最优解。 1 k- K( U; b" }" @3 N6 v$ `
      代码:
    : U* s2 C! q9 j/ G- G6 }/ `6 W' b, T; R
    model:
    1 {" C: N- u0 ^2 M2 D9 Nsets:' k4 m7 S; W3 a% P
        object/1..3/:f;2 Z- e4 T- @2 v5 m5 k$ K
    endsets/ g, t" h9 C7 y/ P& z
    data:
    4 d, A$ D5 V! m6 |8 R" f* z% M" P5 `) b    a, b = 3, 4;' E' F! G( R0 ^% W
    enddata+ k3 L# Y  I. [1 q  y0 N- `, O, @
        f(1) = a * @sin(x);
    + D; G1 ^& s2 y8 I* s7 O) b$ i    f(2) = b * @cos(x);
    $ |# \2 l9 C9 e; G8 ]7 d9 a, U    f(3) = a * @cos(x) + b * @sin(x);( A& t6 `  i+ w2 A
        min = @smax(f(1), f(2), f(3));
    4 C+ g5 J! s6 N3 `" b% d% F9 x- o    @bnd(0, x, 1.57);8 m; |9 N3 X4 ~
    end
    . x! q+ s9 n: H5 C* u4 F1/ C) m% x. R; E6 W1 h
    27 ~% c+ j( u. V& N+ _. D4 n
    36 V0 `. Y' p' Z  V$ [1 ~; k' X( u+ }7 ^
    4
    : a. _& }( k. \8 q5
    6 A1 u; o: y* y& s+ R3 o9 o7 v6* m- Y4 i5 c; r: {" v0 n' k
    75 E3 {# E# w9 ^% t1 D7 E
    8$ d( _% H2 t1 S; R7 N  F0 V( e
    9) j% K. G' h! [
    10- H' o! U4 w& Z! O
    11
    ! a' y9 V* {+ _( k3 Y# W+ ]7 j12
    % y( j- b( {: ~! v8 ~# f13
    6 J4 }6 F+ D$ F  得到结果:
    # i* K5 F0 q; p4 K- F$ f
    / m! ?( `# @! w" T1 D
    $ ~0 F/ h* x. [  ]3 ]$ Q  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    ( Y2 [/ m( I/ u2 G1 [9 M  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    & i5 D5 ?- s& ]9 q4 n7 d6 a$ J8 n. G. ?: H/ [* i
    例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    , O. h1 Q6 w$ ~8 X0 h' F∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    7 F' V+ Q) Z$ S: z* j& `. l4 i4 e∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj& M$ n+ U, g) \  }' x4 ~. c
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
    , A. k6 _/ f2 d5 ?9 u# I) }. `
    ) ?7 d9 y1 i1 Y! ~( w7 r代码:
    0 L( D5 k3 _/ I1 D. _& o$ J7 f8 M6 y3 B9 N
    !旅行商问题;
      e, f# X/ ]4 w# A2 zmodel:
    % |: h6 a# E9 s4 f, ksets:
    8 c2 |2 I+ L7 v; e    city / 1.. 5/: u;' q" N$ e2 B3 g' f( n
        link(city, city):0 [( Y/ A; c: E/ K
            dist, x; !距离矩阵;
    : y" J5 Q$ L; q" Kendsets
    $ p  Y2 q( t& ?! }5 V) u    n = @size(city);
    6 h6 Y, N9 w4 L( K0 a# Hdata: !距离矩阵,它并不需要是对称的;! [( e" o8 }. |+ E& A8 F7 g
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;, l7 G1 C5 f1 I. ^% N2 b
    enddata
    0 j' h3 S' e) b$ R    min = @sum(link:dist * x);
    : F" l% @. @- u    @FOR(city(K):
      P+ ^* a1 e- L  k1 I* ~        @sum(city(I)|I #ne# K: x(I, K)) = 1;
    7 d- ]% C8 k) J- \  v! e        !进入城市K;
    1 L' I+ J: S$ P  T! }6 D1 W( {        @sum(city(J)|J #ne# K: x(K, J)) = 1;3 J; T1 q0 |8 O8 D  |+ f! F/ q6 k
        );4 A2 m" c# _  S/ u. ~: S
        @for(city(I)|I #gt# 1:
    6 i& l( \7 N( {. x: D        @for(city( J)| J#gt#1 #and# I #ne# J:
    3 x6 F* t. D5 P. w" y* E             u(I) - u(J) + n * x(I,J) <= n - 1);% S. z% L4 d1 c0 W! \
        );, X" I# D3 S% v3 U
    @for(city(I)|I #gt# 1: u(I) <= n - 2);
    4 H! d4 n, r- Z3 H; J* l" A+ ~@for(link: @bin(x));' h1 g7 D2 u- M
    end
    - Z# z$ g5 ?9 R3 ^1
    ' V1 u  m9 s  k8 F. m/ t2) k( W* w, A; u: u+ a" j9 {
    3
    4 j+ C  ]  L* {# f! m0 i: p4
    ) `) _; \2 J9 Z) c( \54 x: R8 j* }( q: s, A& Q
    6# F3 j: Z& L9 F1 {( O9 `, E
    7
    2 z: J. m& L$ x# e8 i2 e4 G8
    ) _: l8 a9 L  ?8 H  b; I2 y: c5 Z6 W' L9; G9 E; C8 [3 Z, q, X
    10$ h* {( {* U  U0 o" L) h3 A' |0 m  g
    11
    ! r* }, {! {& a: P12
    ) @$ T/ t, n! U1 y6 U: t& e0 r3 s13
    " z8 T6 A0 j( {6 Z142 C7 D! C- O3 c; y7 |: Z, {
    15
    / x; |+ Z% z+ a16; d2 i+ T0 ^0 Y6 C+ L
    17
    6 E7 N5 n, R1 B, @; B; ~5 z18
    ; i/ M. l0 A5 y+ h6 e19% t3 n6 J* p  w) o
    20
    8 z; `7 y5 j, A9 W6 r' d: C8 D1 @217 ]- z/ M+ L6 S2 ^
    22
    3 ~* e& c; I+ T& ~7 C/ ^/ S7 x" ~233 q# S( p, j, o; R2 S( w$ e
    240 E, w# f' }. m3 F* w  N. b: e
    可以得到结果: 9 `$ z# O* e0 _6 V1 @
    9 L6 ]6 q- {8 g0 m: g) p
    ---------------------
    $ M; ~5 i0 s  V* K$ I" Y$ A1 k3 @
    , w, H% P9 ]# V5 T- K, q3 C+ A6 D
    0 g" @4 p* I9 a) ~5 A

    - ]! y# R6 S! E/ D2 _" ^; j) f5 [& w! G% r6 s' G" G$ g
    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, 2025-10-17 23:50 , Processed in 0.636005 second(s), 51 queries .

    回顶部