QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10056|回复: 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解法0 b2 j% I* S, t- p! C& a9 ]
    一、 从规划问题引入% S6 J3 a& l4 I) L8 u6 e

    * G9 F1 p4 _0 v% s( J  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    $ B& \( O# v  n1 i# O! A7 u( V& K' c0 G  n( ]
    二、 软件分析与选择
    : m2 G+ X4 p9 H4 T
    5 b" Z- X8 Z4 d5 \( ]0 q4 ]% I  Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。$ r# h( |: Z3 `" R
    7 n; b2 m" T8 L( p, x3 v1 h
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 9 w, q, t/ h& z% E& C, l, W& t
      而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 $ f# X% p; i+ [9 |& f( Y- D
    https://www.zhihu.com/question/49319704/answer/165923451- Y6 S& ^0 O2 q
    " |% I# d( H$ t1 k: D8 L# t4 }
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 * a; A) c2 x  d7 ]* d
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 4 Z7 p( X2 R! m& [: [$ T8 y
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。
    + s0 m% ?; A: i1 R( u
    . K8 d& ^4 H1 N. e# X2 f  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。5 q, {+ |; L3 x" Z& G5 P% l/ j

    ; D2 }5 N+ e7 {. K) g$ D三、 如何上手Lingo5 e& b+ u2 [* K6 \
    2 d1 d% C; h; P
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 ! L" @' t& ~# a$ A  b( W6 @
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
    ' O. d! a: \/ {) Z9 M
    - Y0 F" p! Y) [5 _1 i四、 Lingo的基本语法规则7 t% D8 Z. e  B) q5 C
    : }! y- L8 X( S, L( p. x7 q: N& ~4 O
    1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    3 ^0 b4 Z4 i* O2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
    ' t" a7 a" K5 s* y2 W/ G3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    8 {2 K" a& l/ r4、可以给语句加上标号;
    * _1 ~( O( {" b; S! O7 T5、注释以“!”开头以“;”结束; ; q( ~- l1 i4 G; o
    6、默认所有的决策变量为非负数;
    8 i+ ]8 S$ z& ^5 Z$ ]7 |7、Lingo模型以“MODEL”开头以“END”结束。 , P7 S* H: K6 p
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 3 N- e2 ~( h/ `3 N1 R) N% a
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 + |' y) W7 X: b- c: Z& t+ k  ~  J* T
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
    ( n' H" }$ A8 x8 D" D
    " p, x- M6 Z$ ^" G- h% S# p5 N* V/ o五、 谈一谈例子1 C4 V8 x- k; S/ Q! {, k

    3 u2 ?3 w6 W- L& n  那么Lingo用起来到底有多简单呢,我们来看一个例子。- Y, X7 s4 ?1 ]$ c( R& w' g
    * J" T9 W3 O8 w8 \  g% p+ J2 h
    例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    * K+ s( U/ I! `0 x, T& `5 M- ~1 ^4 o7 p' p+ o
             每个书桌        每个餐桌        每个椅子        现有资源总数
    4 W% a0 U; B, _+ k  c- C5 a木料        8个单位        6个单位        1个单位        48个单位8 h- W! _2 }. W3 [: M
    漆工        4个单位        2个单位        1.5个单位        20个单位
    + K2 b' p7 j& m" u9 S5 Q6 {木工        2个单位        1.5个单位        0.5个单位        8个单位
    + Y/ [# a4 [5 T' t* C+ v成品单价        60个单位        30个单位        20个单位         ! D7 l6 c- o1 _( ~, R4 i
      若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    , ^  A% h" I3 R0 l6 I+ i# \: p) ~8 d7 U( ^# b
    解:代码
    ' ?6 T: a. d7 y7 k' j
    6 F+ U- r" R5 V) Bmax = 60 * desks + 30 * tables + 20 * chairs;5 S; ]& A# z0 [, g9 ~$ w7 A& @
          8 * desks + 6 * tables + chairs <= 48;7 U. t/ G$ ?5 f  D5 {9 w6 U' B) H  c
          4 * desks + 2 * tables + 1.5 * chairs <= 20;
    & ~# O+ c. R# [+ ~7 g      2 * desks + 1.5 * tables + .5 * chairs <= 8;
    ! X( n, v* `* \1 ]8 t) _; Otables <= 5;& J# ]% ]; j: O- ^7 f
    1
    5 z  j' E' A) {6 q& x7 J, G# U3 e2! m. O, I! K1 m5 _% }# Z
    3! [+ S1 f. s( z
    4
    % g. N  x; n2 d, Y( V5% ]; \2 v) K; N7 }9 t1 s
    可以得到结果: ( v" N1 {% G* X9 f
    4 R9 }6 W* n5 w
      这里的 Total solver iteration 表示一共迭代2次得到最优解。 ' }; z7 v/ j4 R2 c  m
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 " |$ q- @! x4 P6 s6 R
      可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。% p, K8 P$ J' J) D: O
    7 p8 L' M7 j+ d4 m' D
    例2:给定一个直角三角形,求包含该三角形的最小正方形。
    $ F2 P1 w! v- p- W) G9 q
    ! {/ W2 e5 N/ z- [我们可以作出如下正方形: ' V8 R3 Z% S# u* S+ w

    ) z2 r5 T4 p1 |& j0 |2 I" k) X9 w
    9 @/ a4 |) G( e  CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx) _5 t* \+ t/ ~2 ]
      转化为了规划问题那么正方形面积最小的时候即为最优解。 ! H+ H( f* R6 M7 \$ V; m1 o
      代码:
    0 M9 ~: ?6 g6 t5 U- Y
    1 c$ ]/ ]& y2 n, P2 |3 X3 g" dmodel:
    1 ~$ r8 t9 w# k- d4 [5 ^! Y0 t8 o( Isets:
    0 v9 }5 }2 B5 k" h! s* N% `" @7 n    object/1..3/:f;. G* l  t( @' U
    endsets$ @" a! T: C) z% L1 L1 p6 U0 Z* Z' j
    data:. Z0 D0 Y" M9 U: v/ Z# `8 a  a
        a, b = 3, 4;
    3 \* x4 }  M6 _, Z7 ienddata
    2 B  e  ]6 c8 i* \    f(1) = a * @sin(x);
    4 H7 e7 j$ _* U1 R2 w* j    f(2) = b * @cos(x);: h( i7 i% ~* j+ @+ @% E
        f(3) = a * @cos(x) + b * @sin(x);5 ?9 ?' Y- {' ~7 V) n0 d; P
        min = @smax(f(1), f(2), f(3));
    3 @- X# g, [( U- Y+ X7 ^    @bnd(0, x, 1.57);3 p* z/ h; V1 `8 s3 T$ V
    end
    1 b+ g) V- E7 w( D8 V) k1 ]6 R1, p. L* o9 q. u2 Q8 |
    20 I* \) e& e% @4 d* i. h4 ^! k
    31 ]( I$ h2 ?) V6 x! d1 _
    4& |2 N" w6 j' A/ E# a4 ]
    5  l4 T1 h) c/ r& ?
    6
    # {% o: D, Q6 O  w, f) F  Q7
    " m! f9 O. k) x. A8
    ( @4 H8 X) w) L% A. g9% m2 L6 X5 g5 W% |' L8 i3 S) Z  P
    105 [( s- L! U8 @+ ~: x6 N
    114 |2 E# ?3 B+ Y2 V
    12" e, N0 T  _3 y( i7 m( c# B0 I  E
    137 E$ W# Y8 E3 @1 a1 o% z9 g# S
      得到结果: - J7 y. p7 I4 @

    % w8 E# Y. k% y0 |6 D7 A/ Q) I8 l6 u  K9 i
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。) P0 p- ^( C- u5 p0 K/ ~
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?: X" u9 x. Q+ d4 ~) j6 l! W6 ^) ]- T

    3 z% {* N* y; D+ O# }1 L, ^例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    % V5 Z7 y- R: S2 t% M& i5 e∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj  J+ h* `" _" |
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj, S6 t3 n5 X/ P: v" \
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。/ \- |1 e$ z& j- s9 E  Y

    ( h9 y  b1 ]; I! x' T0 W8 _代码:, t$ k4 J! S. {4 Q# v
    $ R2 p+ `' U  x( |! u# i
    !旅行商问题;
    ( A6 a* ?1 b2 lmodel:
    2 W' `3 X0 _% N( w* e& i; X3 j. Qsets:4 }% b" T& W9 t$ q. n9 Z) h9 w
        city / 1.. 5/: u;
    ( j0 y; V$ K. v9 N" i    link(city, city):- n- I' e0 D1 i4 j1 N6 \' _
            dist, x; !距离矩阵;# n  B' _: r. [" l0 l  n- x" ]
    endsets
    + _8 `! y7 k- O& F- E    n = @size(city);, p/ f2 t8 I" C& o( @* b5 ~
    data: !距离矩阵,它并不需要是对称的;6 N! E" C: z3 f8 Q) ?
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    ! n$ w/ p. O0 ]& o7 d7 U  A# Senddata6 n: k  U2 K6 U5 }0 y
        min = @sum(link:dist * x);
    ! O  P* {  z7 o9 X, E6 U    @FOR(city(K):: J1 X6 C5 ^) m/ W  k8 N9 }
            @sum(city(I)|I #ne# K: x(I, K)) = 1;
    0 [3 ~+ b* S4 a) E        !进入城市K;* Y7 q4 E- Q* `  ^
            @sum(city(J)|J #ne# K: x(K, J)) = 1;
    : Z1 [  B/ p% [    );( N3 l7 [7 D7 X0 ?, k0 Z
        @for(city(I)|I #gt# 1:
    . F$ ]$ n7 R' n6 Z3 m  w6 L        @for(city( J)| J#gt#1 #and# I #ne# J:
    # |7 c8 V4 `. E1 ^             u(I) - u(J) + n * x(I,J) <= n - 1);
    : `+ @& M% G- Y! c( c- a7 |' }* D3 w7 [    );* u' s% L; A6 \6 l/ T; w  G, m
    @for(city(I)|I #gt# 1: u(I) <= n - 2);
    8 J3 h$ v9 N! @) y0 j$ l@for(link: @bin(x));
    / o4 q+ V& U# send
    2 G- e+ J: ~( M/ M$ P( c5 a1( j; N0 G* D1 L
    2
    8 h: [+ T0 Q1 u* m3
    4 u4 g: D# F( M0 s: {4
    6 T5 z( y" J: Y9 `5
    ! X) ]6 l7 U! v  P5 |- |; d8 N6$ d! S( q9 v5 n+ w1 P& [
    72 ], }3 X: K1 B1 O" t* _$ `
    8) l) k; ?) h2 {. x; h) k5 r, K* ?1 f/ \
    9
    ' g0 ]% s7 {2 r: n6 l, Y10: G, `, r/ x# O. T' C+ @
    119 B$ {! [% |, U/ m' L
    12
    " ?7 [, m( W$ q# |8 b- p' @13
    # {% Z8 {4 {/ r* d8 |0 S' }$ g+ ?14' D1 K( T/ M  }. t+ V
    15
    9 S- h" {* l0 M0 T8 I  U% p16
    ( y, g3 C8 U4 V6 A: r17
    ' c# f+ |, a) L/ _+ ~3 p' V- I18
    5 V: y# R4 p! L% r7 x19
    : r; N: C/ Y5 D5 ~6 d* O20, K6 L9 n) f, T6 L3 P
    21! h+ T. \5 x, v( b5 K& w
    22
    % A" t! I* h) S23
    5 ]" ]( }0 v1 H" Y24
    ' f0 `5 S4 P! z, H5 ^; W可以得到结果:
    * W. a& S2 K0 f/ ]7 q6 A* y' t+ q9 m" O. B/ p- v5 b- t
    ---------------------
    9 ]& y% P: ~8 P- {/ F. P+ Z0 P' _  j; {* G! g
    8 M' [% Q- \' A3 O+ i( _+ L/ k6 G0 f
    2 i0 C+ x7 y# m

    1 x! D# _; ?( F7 z/ Z( h0 Q0 b6 R6 f
    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-21 14:17 , Processed in 0.435584 second(s), 51 queries .

    回顶部