QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10101|回复: 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解法6 x+ I1 E$ m2 }" T' ^5 Q
    一、 从规划问题引入
    - p) e5 P8 O% H- `) p3 X6 p
    4 r/ [7 U4 ]9 b* g. S2 [  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?6 p' x' N+ o: h/ F2 O) q0 p0 i

    9 G! I- V. G% r二、 软件分析与选择
      H- o" y0 F4 o- S) L4 E' D
    ' b) X) i1 o, M* ]6 w0 O/ ?  Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。/ {3 t0 e3 Z) X4 L* k
    6 e4 U1 o, Y  T0 a# p" Z5 o
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 4 p1 ?/ j: o$ h4 j
      而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    7 e9 i+ c* c$ X. c! a, Zhttps://www.zhihu.com/question/49319704/answer/1659234514 s( b' d7 ^0 o

    + x: V" E( y; U" h& ]! N3 b  用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    6 T! O) p' ?& h6 `; d$ A  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    9 Q& d' \8 o; l. G  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。! `! h: S; K- A& J

    $ G2 u' B& d7 Y, I+ u. a6 I% h  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。
    ( ?0 b6 m; ~+ h$ L7 P- j$ C
    # l4 ~! `4 k+ o三、 如何上手Lingo0 A# B+ b* Z! X& P- E8 u
    3 E0 l' f1 ^! Z9 ^7 a4 C
      有很多人对于Lingo的评价都是,非常简单的软件,很好上手。 % X; w8 k& L6 @& _
      “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。% l( z" F  D, c8 q, y. w

      C4 w* R9 C- \- |$ H3 j四、 Lingo的基本语法规则! {/ C( C; U. w  M$ p8 C

    4 ?0 F6 O  z. S1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    9 N0 d7 [- J0 V% }0 a! W1 n2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行;
    $ `5 `5 n2 A. \! j3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    2 ]# |( }; k+ u: ^) V% H. }& I! Q% c4、可以给语句加上标号;
    8 r* y1 h5 ]5 N& G. Z! [' y" D9 y5、注释以“!”开头以“;”结束; 2 Q( {" u# P6 J" }2 \! u  i) i  A
    6、默认所有的决策变量为非负数; 3 C' [6 H! n6 p, u
    7、Lingo模型以“MODEL”开头以“END”结束。
    & E+ |! t1 t  C; _  C8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。
    " ]! X1 c4 V7 X+ v. l* i6 L9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 * n% J! n" R2 w9 |. K' C
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。) D9 ~) m) u! u2 k# e

    ! `" n& _, t5 j) n五、 谈一谈例子3 a0 z& k. O5 O2 H$ }
    . `! w# v1 X4 A4 U8 u
      那么Lingo用起来到底有多简单呢,我们来看一个例子。
    1 V3 X1 S- `/ l3 ~- j+ `# b3 J+ |6 K- |& A  q" W2 [
    例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:0 u* R( i3 `, V9 C" H

      S$ `, P- C; U: Z) X( ]. U7 B         每个书桌        每个餐桌        每个椅子        现有资源总数+ T! D* f, L+ N" S
    木料        8个单位        6个单位        1个单位        48个单位
    3 |/ B% X+ b+ O- v漆工        4个单位        2个单位        1.5个单位        20个单位4 m* C( A: r, }& t. K/ }: }3 n4 m
    木工        2个单位        1.5个单位        0.5个单位        8个单位
    - Y- _. t, [8 E1 f( n& J成品单价        60个单位        30个单位        20个单位         
    3 Q+ O$ t+ d5 x% z& y2 d  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    1 V+ E! |& `4 a8 E! S9 V% T% P( N4 ]1 E: q
    解:代码' r* A/ `/ u+ r7 {" m+ m* R
    % p2 W" J, E) k  X- I
    max = 60 * desks + 30 * tables + 20 * chairs;
    + w) {' |5 Z" D) F) [; M      8 * desks + 6 * tables + chairs <= 48;
    # c: \3 l0 v! U2 X& e      4 * desks + 2 * tables + 1.5 * chairs <= 20;& Q  q  R6 w8 t) h6 m& T* X, E
          2 * desks + 1.5 * tables + .5 * chairs <= 8;. X# S) G* U* g$ q$ t  ]$ Q
    tables <= 5;- k# y% |( E! Z# j
    1$ @3 G5 G: N- e( f' R
    2
    4 f8 H# Y- Q9 |3 k: L8 l! K. [3
    ) f4 F6 C2 R; e5 m7 M; e4
    9 L8 X# p- R; e. }3 B3 m: H5 F5$ G6 y$ L: @8 V  f, _
    可以得到结果: 7 E  |# u! g0 F2 V" G% k

    1 C/ z; S+ F$ r, `- \) _, p$ Z4 N  这里的 Total solver iteration 表示一共迭代2次得到最优解。
    5 f: a; L! V, Q7 Q3 z( J" A2 r0 `  Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。 8 H4 {4 e: C9 E% W3 ~+ K5 L
      可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。$ m. Y% x* V2 z7 [4 B" z& T, ]8 g  k

    % ~4 Z2 ?: D  i" S7 I/ }8 b& l0 h例2:给定一个直角三角形,求包含该三角形的最小正方形。
    2 L/ [  H; q) }: ~- R4 f" F# d1 w; Z% B" s7 R" ~
    我们可以作出如下正方形: 1 W$ Q' ?( H* }. l. B
    5 b/ J5 O; N4 z9 \7 K/ ^& f
    1 G8 z  \% n( _, d- o! |- F5 y
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
    4 t# z" |! X5 t+ u% b2 }& u/ t  转化为了规划问题那么正方形面积最小的时候即为最优解。 6 [! h7 ]- O3 U) f8 O+ o' @
      代码:
    . \; X3 r  n6 d9 X$ `0 a( `
    & a+ _7 \1 m( q; Tmodel:: Q2 R0 g& `3 U% ^* F
    sets:
    2 ^  r' }# `/ L$ A" I2 \7 J& @+ r    object/1..3/:f;
    8 h. e5 d" V. u" N' Hendsets1 s3 A" U- a( W% E( x
    data:9 z' \- j5 c1 u
        a, b = 3, 4;
    1 e( U. F0 o: i) |enddata! p/ R3 ^3 @- K2 b
        f(1) = a * @sin(x);
    ' I. {; N' l1 a    f(2) = b * @cos(x);/ ~8 M: Y( G# f" m  |* ?
        f(3) = a * @cos(x) + b * @sin(x);. \4 F6 V  y5 B- f3 V  R
        min = @smax(f(1), f(2), f(3));
    6 b7 z% Q0 |8 w2 c. w( N( Z    @bnd(0, x, 1.57);
    : X' Y9 H; H: @0 j8 k! C) L9 ?+ Pend' k4 l) R, N* u
    1) _& M) W5 X' o! u: M/ B1 O9 K
    2" h7 k/ O, e; V/ m- E+ p
    3
    2 X/ l0 |- }' ~" G; q0 z- X4' ?! \3 I% w  ^8 w# c# x
    5
    ' C" v3 y2 g8 Q* ^* n, {6  U; e2 d" }# H" }3 D" W3 W" v
    7
    # H5 _: `' _1 j' j8
    2 c/ x/ ^6 {1 @9 i; N  R# B* g9( c" @, \5 \$ L) o
    10" k0 N. M/ j# B1 a* ], Y: G, _; a
    11  u6 M, E- w/ o8 p
    12
    0 g" ?* k/ X! Z$ ^2 q13! s4 K. Z& W" h& Q' V7 v
      得到结果: 9 {, h  j) H% E
    * M& v- }9 _; t8 F5 Q
    " K5 T4 I  @" F2 f+ B2 J* \/ \
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。# Z1 h. S; B* k# L* E7 Y$ _% ^3 Y
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    7 e. N: T2 ?4 Q  s: B/ P5 t/ r2 E, o" Q) N
    例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    ! |$ w' x. R' h3 ~  a9 s∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj! d& z5 p; y* z: B$ k2 R* }
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj8 ^0 _: a4 M( ]& ]- Q9 A  l& t- E
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。
    / W- m  V  e" r# B# {6 S; U* e8 ^$ L. P+ `/ u& I" A6 {/ V* N
    代码:7 c2 K, O6 w  Y/ ~3 m0 D

    + ]: |% Q7 y* i5 |* z4 T8 z9 ~!旅行商问题;4 Z$ i$ B! I; Q! M7 H, h" Y- Q! ~
    model:0 U& d' t9 |1 }0 C$ R
    sets:1 d) l: H3 d9 P% c
        city / 1.. 5/: u;2 z/ f% u& M% E
        link(city, city):
    6 r$ ?# V+ H2 t, }8 l5 I        dist, x; !距离矩阵;
    ) k' |) G6 n& pendsets
    ( P2 P9 W' k) A% c4 d0 r! j    n = @size(city);
    , x; x4 j) @. A$ v8 Q7 M+ vdata: !距离矩阵,它并不需要是对称的;
    2 N% _1 d: U* H4 G7 a    dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;% g- M& Z5 n( n2 u+ ~2 d" p
    enddata& {5 q8 d& a% H9 s( g% r: V
        min = @sum(link:dist * x);" s1 N1 w* {& ~+ I% g( P6 u9 A, X% K
        @FOR(city(K):
    6 Y8 d) }# U) R        @sum(city(I)|I #ne# K: x(I, K)) = 1;  [+ Y6 M+ o- u) m! R4 d! M& U
            !进入城市K;
    1 T9 B/ r/ y4 z- [2 I        @sum(city(J)|J #ne# K: x(K, J)) = 1;& L8 J3 }0 t9 o; g% q. C+ B
        );
    $ Y3 e( S' A" T/ i* o3 j1 x    @for(city(I)|I #gt# 1:
    4 `$ B1 G( U; g) G( Z        @for(city( J)| J#gt#1 #and# I #ne# J:* e0 Y( y7 W6 v7 w4 t
                 u(I) - u(J) + n * x(I,J) <= n - 1);1 a# |2 q( v8 j/ w8 Q
        );
    2 L" v) c8 p  T9 R@for(city(I)|I #gt# 1: u(I) <= n - 2);1 ]# w3 D- o: F+ b8 v; {& @
    @for(link: @bin(x));4 F( A; k5 x' T7 H, U0 ?
    end, ]$ U/ @7 u) U* `' o3 X" E1 N
    19 e( f/ T6 ]% s9 |# q( |4 R8 q+ R. L
    2
    ' r8 V- u+ ^+ y  U: m& h3
    . G9 ]8 N; H+ |4
    5 V6 t7 o# u$ {, m& U# p59 R0 v8 P3 Y) u' u$ P. l9 N: M# C
    66 {# ?# ?) x0 T4 q
    7. i' C  Q' R5 |% [7 L$ w
    82 G& x0 i5 G7 t
    93 k" K# g+ \/ \
    10
    % E8 |$ b3 j4 I: ^11
    8 a4 m, {/ |% ?7 }& t2 C4 d/ d12
    & j5 R: X. Q0 \3 {! u13
    ( ]8 o3 _. b  A& e5 I. ~5 F148 r4 c" p" T# n4 d$ j" k
    15
    + R' u! Z0 \; ~: z' X4 b3 f! j164 ~# g- @1 p" t! H4 n
    17
    7 |  v/ Y! ?9 C; E18
    : E1 j, c4 }0 u' H19% w' b' f9 j/ g9 T' p& W- i! E
    20) K" E. a5 H. }: g& F) g* s, P/ W% p
    21
    % a0 V# }9 c& h222 c: I7 `& o7 h* ]  W
    23
    - Z: Y2 {1 `, b" X% t/ o24
    & H1 S# V/ l9 I( h* S' J  P可以得到结果:
    , p$ |  t& D; U- x" S& q1 H6 H
    ---------------------
    6 h' u/ d. l. ^0 e9 L7 F5 Z
    7 B' k% y, W. B3 y" l" T2 F* p' L& ]( d4 o' Z5 t& A

    ! a, P5 ^$ j3 w8 P3 @6 J1 |  r7 @! |: k* C, E0 h' Z

      n3 w* F( E6 _6 M; t* v
    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-6-14 23:39 , Processed in 0.374995 second(s), 51 queries .

    回顶部