QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10045|回复: 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解法
    $ ]$ W" r3 j: v% h* F一、 从规划问题引入
    , x1 W, q1 }5 T* |8 W+ r$ R1 G' W# t- w) ?0 l+ q- i7 P& \6 V, q
      在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?! ^3 D8 ?- x- q

      k, t0 S3 L6 f" [0 K" M" v二、 软件分析与选择
    5 u& `; A$ T9 X+ U# N2 A8 L) A' x1 ?  e! Q
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    2 r1 K/ Z. m$ U' U- O
    9 }1 N9 @- h$ S6 P  首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    / S6 i/ S3 R7 y8 }  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    3 C4 X+ K; e! f* f, Mhttps://www.zhihu.com/question/49319704/answer/165923451
    % w8 b- ], E) K, c8 I& M1 T' C5 T. N3 Q+ }. L- a2 c
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 % n, h% f3 D$ d
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 1 c! g/ M# [0 g8 W7 }* t
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
    $ a' r# x* B% D3 f2 [
    $ I5 ?7 w: X$ R" ]$ ]0 |  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
    ) Y' q* D& C- }9 @7 E/ S
    # H6 h; J, {0 {1 l( K( y, [三、 如何上手Lingo
    ' H: a5 n+ V3 w' z9 d# S) Q$ `3 Y; {4 W" X; E: b. H
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
    & i2 }3 Z# u( ]( {  “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。9 g5 C/ o$ X0 `% Q$ X
    4 v1 _8 `8 C( O6 W# _
    四、 Lingo的基本语法规则: I' p9 s; G+ m, K/ D; n

    ) l: j) x8 k# E! R2 v% o- G1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    ) J% l+ F! B& t+ L% x  x* g' b* R$ s2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
    7 c$ }4 T% E' z; y' c  g) M3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    ! ~+ X7 o5 h. `* H# S4、可以给语句加上标号;
    5 E/ o5 o9 }2 t/ e% H6 @5、注释以“!”开头以“;”结束;
    / y& T) B* f7 Y# p6、默认所有的决策变量为非负数;
    4 ~( Q1 p: \) g+ U+ Y7、Lingo模型以“MODEL”开头以“END”结束。 * d% B: P4 _9 A- k/ M
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 2 C( O* u6 C% w8 o6 Y: P2 `/ Z
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 8 |! \5 v5 H4 a( H0 K- f' B
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
    / k: _! Z' g  }( S. ^0 O5 \; P& F: h* w8 ?. u, ]
    五、 谈一谈例子
    7 K& g& y' D" x$ {' k; L' L8 g6 a% {/ Q) o, z& }# ^, U0 ~+ q" y
      那么Lingo用起来到底有多简单呢,我们来看一个例子。
    3 ^3 A& r3 u! w1 G; o" o. v
    9 O( O, |, E# [7 g: \) N例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:) {! h/ l! W& l, P0 G

    ) [# m$ m( k! c( C         每个书桌        每个餐桌        每个椅子        现有资源总数
    ) }$ L- c4 h3 b; B, W" z% p4 m6 ^木料        8个单位        6个单位        1个单位        48个单位
    + K* K; S5 z1 ^7 }* E0 [漆工        4个单位        2个单位        1.5个单位        20个单位
    : B- f+ y% U( K木工        2个单位        1.5个单位        0.5个单位        8个单位
    2 O1 _' b" G; Z. P: v成品单价        60个单位        30个单位        20个单位         3 m9 g1 D2 }+ v5 S7 z" Y; y
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    1 F  i' o, q: [4 U- A$ l8 m, V3 c" F' m  h2 f7 W' _) r! q& W
    解:代码
    ( R# ]5 Z# Q' m$ g5 K) V* E
    5 Y# I5 \8 E' t7 O( q6 K8 v/ E: {4 omax = 60 * desks + 30 * tables + 20 * chairs;
    2 C, M* l1 v4 Q* j      8 * desks + 6 * tables + chairs <= 48;
    , }2 z) O% F( G2 K5 i1 u9 j9 m      4 * desks + 2 * tables + 1.5 * chairs <= 20;
    , E$ @6 a0 P9 W6 D2 A& \      2 * desks + 1.5 * tables + .5 * chairs <= 8;: }3 r* D9 P5 g, w. H
    tables <= 5;
    8 N0 b, P* J" y) z0 Q; B1% \0 v; ^8 ~' i. c
    2- @/ a1 P# b8 X
    3
    0 h9 S; D: [, k8 a% k  t0 A4
    : ^+ e  a1 j: q4 h5$ {* H: \$ N: ?9 ]6 V4 f$ C
    可以得到结果: $ |8 ~5 _" n( ?8 P) C1 A' d4 X

    8 M2 v4 @# S& h" M3 C; H/ z  这里的 Total solver iteration 表示一共迭代2次得到最优解。
    ( i) ~, u# F6 l; C5 ]( Y0 m6 j  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    : q# }! |" T- R5 L# L  F, |  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。5 [( a1 m4 I& c+ l
    ( I% J' t7 V9 ^6 w" J' q
    例2:给定一个直角三角形,求包含该三角形的最小正方形。( ^' L1 T8 a2 B- Z
      N& F9 c" \4 H+ _5 T
    我们可以作出如下正方形: 5 d2 `( s2 Q5 E  W
    % h8 p  U& K4 h0 h' L4 K
    . P  g9 }& n5 X  `9 ~5 N8 k
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
    $ e+ B4 R1 I- E9 D8 Q) W  转化为了规划问题那么正方形面积最小的时候即为最优解。 % v# z" _+ }& |3 P9 N; x
      代码:; l. d/ S& Z1 f8 h& L% B

    3 T) R5 |9 w( [1 v: ?7 ~model:
    . r" g0 |/ D+ M/ W$ c) dsets:# O) {0 b- C% P2 s( ~- }3 W
        object/1..3/:f;
    5 O! }2 X6 b6 \: a) N7 {: ?endsets2 H/ U, Q7 b0 h# h/ D# M2 {/ T
    data:
    3 H$ m: [* [. y  y' {    a, b = 3, 4;
    2 b1 S  F, N) x8 H0 G3 Q: U  W' denddata: a+ p7 R& o% ]4 c$ G4 y/ h
        f(1) = a * @sin(x);
    : t" {; C. e7 g+ ]& m7 P    f(2) = b * @cos(x);5 L  ?: q( z: X6 v; l. @
        f(3) = a * @cos(x) + b * @sin(x);
    2 p4 C1 V  H' g. U! q" b    min = @smax(f(1), f(2), f(3));# Z" k. f$ C" d+ _, x3 \
        @bnd(0, x, 1.57);
    ! ~" q4 p" q7 mend7 w! h% V/ Z  r
    1
    / b- h+ h  Z. T7 D1 W6 {5 N1 w, J2
      Q& l( v3 n" ^$ g3 \7 ?3  a, Y, z( n# F% g* _1 j
    4: e8 q) \# N) U( z1 i
    5/ c/ E: I3 U4 M3 E& Y8 B
    6% n* s9 e9 S+ X! \2 j0 o
    78 k5 a  f; i3 b; p3 z' [9 J7 T
    8+ P& ]' V+ ?( P! W! `7 f1 B1 |
    9: d# C% A! Z7 |% M2 ^
    10
    # V  L5 h8 r9 m2 j+ l11
    2 ?9 k, O, _, ?. U* }12
    9 \9 R% _  B, R, w* c137 F! D6 Q6 M; k. u. w* q' P
      得到结果:
    4 ]' M. C: i: H- \  k) S
    1 _; K$ u. n4 T( S7 p/ N$ h* @
    - a6 c6 o2 ?# j8 h) e' R  这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    ! q6 I; l! |" o6 q6 T  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?+ ~! {; ~1 U- }7 U" c# I: p  G% Q3 u

    : R3 D9 D- G% L9 p* 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 * {6 C/ P5 S4 u7 k/ i. Y" y3 \
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    0 C( n" \( s. j9 v; `# U$ j∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj
    $ @' `3 C: i+ ]9 Z由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
    ) D& i3 T) X& A: l% o- P8 S6 V  T# q" V# k, l
    代码:
    & X# C: b4 h3 R. ?2 Y5 u  \7 s+ _2 @% B  T* D2 W
    !旅行商问题;
    1 r3 V2 a; p1 m- q( [4 Qmodel:
    & a) \% F2 h: Z, Z1 ksets:
    * `* j6 `% K& c3 g% z2 r  O    city / 1.. 5/: u;, D- \: L( n5 k7 a# E: |
        link(city, city):4 n8 {8 {- e1 `) e5 b6 `7 A
            dist, x; !距离矩阵;# b0 a1 R1 X, m' v! W) F  q+ o, V" |( s
    endsets
    + }; p% j# S. r    n = @size(city);' Z9 A4 ~/ X+ @& Y/ v  H( H
    data: !距离矩阵,它并不需要是对称的;
    ' K/ c  M9 a0 f  x) u5 @4 V0 @' G    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;$ h: o: c+ j* k4 ^4 v* _( o
    enddata
    . P, n* u8 n$ |% W# _4 r  r+ C    min = @sum(link:dist * x);
    3 E3 W& w, G) |  z0 `- {    @FOR(city(K):. e, e' P( q$ \& T6 @1 Y# j
            @sum(city(I)|I #ne# K: x(I, K)) = 1;; N: Q, T  w! N  U
            !进入城市K;
    : a7 R, w& f" u3 q5 X8 w4 l        @sum(city(J)|J #ne# K: x(K, J)) = 1;& N, B& j! C( R, \* `
        );
    7 N( |# ^9 r0 k  P" v* j    @for(city(I)|I #gt# 1:
    6 E" a6 Y) h, I! Z4 ?2 R' y3 a7 E        @for(city( J)| J#gt#1 #and# I #ne# J:
    , w- @* B7 q7 _: G             u(I) - u(J) + n * x(I,J) <= n - 1);
    8 a. K3 Q9 J; U) n8 c$ s    );
      |" l: L- U+ y1 r1 o$ J@for(city(I)|I #gt# 1: u(I) <= n - 2);
    * j& ?( y1 G' Y: g0 h@for(link: @bin(x));4 J& D% u& p/ B) M( m# T* Z3 l: T
    end* ^( J6 L+ H' T% i, N! Y7 ?
    1
    7 u: `( O  ]$ d7 f3 ~2
    # r" Y0 e- Q# L+ X/ }6 h9 M38 X2 V5 ~! E2 ^$ |+ l% Y
    4
    7 o  ^: o- z% A) q- D- s55 ~. H+ V9 R1 S1 ?" K1 I; N
    6( i. Y) o( j& K8 H  g
    7" L8 p. D0 `3 \3 e1 _" w  Q/ [
    8
    4 O; b) m9 g* U7 ~% x% L9
    4 |& \/ u5 `9 u7 \+ A- b6 T10+ U+ o$ I/ C- q0 l! K' o- @6 g& \2 J
    11! q* Q, i; N  @+ K# J7 W" a) K
    12
    1 C3 z" i! c; M137 c6 U& d( f7 P
    14
    : M% v6 d5 `* `+ }4 E15
    + W. H1 G$ P  K' a9 Q% i16$ z$ ^5 B: X1 q( G! e8 D$ w
    17
    ; e2 l! B$ w" d# P9 b+ s' q18
    ! S- S( G- w7 S19
    6 ]' x* u4 G" w4 e# |9 a! h20
    - l% R# B$ I& f% m# V2 F21$ }3 y$ b6 }+ D0 ]' f$ R! h4 @
    22
    - @( g; I5 s" O# E) t23
    ) C! I, h! J% \$ v3 k0 H24
    2 r# O. @- K2 c+ F. K. Z3 X! x9 v! {% L可以得到结果:
    ) V2 @. Y6 v( C4 @9 Z! j
    7 N8 Q# J% w& O( i7 p--------------------- 9 |. U  F" X2 {5 G, J

    # g0 Y& Q: [* d7 [5 i: z
    7 }( ~3 q8 W4 e4 M8 l- e& ?/ A
    $ }4 k' Q5 V; Y. W" ~! i
    : K1 j- S: m6 v2 T
    9 n9 j2 @) p  S( w& {5 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 20:43 , Processed in 0.428091 second(s), 51 queries .

    回顶部