QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10048|回复: 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 }0 m/ T, I8 N/ r一、 从规划问题引入# U8 m1 u1 J, W" r4 R

    " B* j/ ^9 t& W$ l6 q  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?$ U+ K0 M. e6 Y4 |: i5 H+ m. D* k

    6 O+ Q7 Z7 w8 n! Q, Z6 c二、 软件分析与选择
    7 _. e0 n2 r6 A, E, l' [: x+ O" I, b8 d+ s7 x# F
      Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。
    % s$ W8 j  K- B' p) v* P
    7 ]" n( A1 N/ C, s  首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。 & V# e: Y8 B2 G* K. Z* B. g
      而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答 ( b. H4 E( `9 @" ]2 u# T# `
    https://www.zhihu.com/question/49319704/answer/165923451
    3 j6 q. G! F( p# ?# f, \
    7 ~2 S7 T; Z9 G' a! U- ?, J" ^  用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。 ; d9 @! ^% E$ K- Z6 Z/ H
      然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。 . ^6 e6 S" G3 B
      而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。' ?: U$ _4 x9 |, }  R- t( g
    9 I* W& o" v+ p; p- n: z* X
      那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。5 L' b- Q# P, m: a( O" G" I

    4 Z% k0 V' O* t8 o+ G( O三、 如何上手Lingo
    * ^5 O# e* d; [2 F
    : t8 [1 j4 p7 _8 P- ~  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
    8 u& b$ t7 z, |3 y- u1 s  “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。, {& O$ K$ d9 Y
    , R! g9 [# r) g- S3 w
    四、 Lingo的基本语法规则! Y9 \* u+ V7 {/ O6 t
    . b/ ]: @' b- j" `. ~
    1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    $ [0 w9 H$ s3 p6 p& d/ q" s5 o( D2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; 2 W; ]$ ]* C; P" h
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    6 H' s/ j5 x* H% C9 C4、可以给语句加上标号;
    ; L$ i7 L) Y6 P7 b5、注释以“!”开头以“;”结束;
      g) [/ [5 u$ N0 N; e  L6、默认所有的决策变量为非负数; " I3 b$ q8 h, e4 v- Q. @
    7、Lingo模型以“MODEL”开头以“END”结束。 + s1 S/ r, b" M0 N
    8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 & c, h/ F6 Y' C0 ^% j' h0 N- G
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。 1 {7 p$ V$ x" M1 C# q4 d
    10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。
    0 K1 [" I; }( ^+ f# X) _0 s
    4 e# s3 Z; Y* @& W% p* ~" ^五、 谈一谈例子
    % o: d% ?) V) J+ |6 J6 E
    & E/ p0 m! d: R: c  那么Lingo用起来到底有多简单呢,我们来看一个例子。
    $ J! o- j& ?# `- _- _) S4 e
    - g/ A6 S) @. {/ I0 |( h+ R例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:
    # Y) l8 y8 m" V: X, b- M  Z; S* l9 ^
             每个书桌        每个餐桌        每个椅子        现有资源总数* k# q" s  a' I9 R" D" N
    木料        8个单位        6个单位        1个单位        48个单位
    " L0 _3 t# Q- t) F: b8 `漆工        4个单位        2个单位        1.5个单位        20个单位
    7 j( w  b, E) X% Y木工        2个单位        1.5个单位        0.5个单位        8个单位
    ) w0 k, l  B( U! k成品单价        60个单位        30个单位        20个单位         
    5 }6 r7 O5 G8 z+ h8 L; n: Q1 f  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
    7 @" U4 m! C& R+ j" r% u. e
    7 v6 E4 q! D# _# j  b1 f: S解:代码9 q- O7 Q4 x4 P% h
    0 k: h, ^$ w" T: z0 F
    max = 60 * desks + 30 * tables + 20 * chairs;* r9 F! \* ~$ B! `- F. H: c6 j& G
          8 * desks + 6 * tables + chairs <= 48;
    4 y1 t; s  e; [+ V- z      4 * desks + 2 * tables + 1.5 * chairs <= 20;: N+ _9 T( w4 p& j/ ?
          2 * desks + 1.5 * tables + .5 * chairs <= 8;' `9 W) c* |8 J: q
    tables <= 5;9 Z, Y0 }! U1 H% }' _3 R; X( N) K
    1; ^; ?9 b: w- c7 F4 ]% _2 E4 f
    2
    $ g7 N9 Z- S4 h* P" }3
    2 l3 {' }9 P' q4
      B9 t/ m# e( @9 U/ {! A4 P4 j1 K& P5$ x: f3 i* d2 ?
    可以得到结果:
    $ g- ?0 j7 }4 I  l/ d6 ~6 M  L
    8 V: r) V+ I9 h% u  这里的 Total solver iteration 表示一共迭代2次得到最优解。 ) w1 b7 h# _! \' v# c
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    1 S2 O. v8 F& _% {  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。7 m, W( F* N( `) T" w
    ) ?5 N# a% o/ t5 y$ [
    例2:给定一个直角三角形,求包含该三角形的最小正方形。1 p$ O, ^' y3 M1 O- n, ~, r

    . s$ U: M2 w; V" r我们可以作出如下正方形:
      F9 e! D3 }( Y1 N/ [0 @+ R1 y7 v& g" `
    ' F5 s$ I1 h! p% E* E
      CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx7 Y& w! o2 m, q6 @
      转化为了规划问题那么正方形面积最小的时候即为最优解。 3 S; u' ]4 j$ L7 q& R/ X7 l
      代码:
    % o' W4 s. f7 L0 R0 ~) o6 k9 `( _: t" T% H7 o) X5 P6 M' Q
    model:' l7 a1 l* F- R: e5 Z
    sets:0 L- n. o$ O9 Y0 T* s7 X4 r+ v
        object/1..3/:f;
    " f' I8 B3 I1 c9 K* [endsets
    2 Y+ \% |- ~* S+ q1 ?7 `: cdata:
    ; L7 @" W) g. B3 t- k. `    a, b = 3, 4;2 z/ u: P  S2 Z4 f3 ?/ L
    enddata! o! n9 k- r/ O9 U& h4 U% a
        f(1) = a * @sin(x);3 w* h" ?# m8 X5 q6 K
        f(2) = b * @cos(x);7 Q4 A" j, G5 J) K) K
        f(3) = a * @cos(x) + b * @sin(x);
    5 L( z% U8 ]; Q5 R2 a/ ~0 c    min = @smax(f(1), f(2), f(3));6 Y) c$ @7 U, G- Q, p
        @bnd(0, x, 1.57);
    5 {, K$ U* F2 Xend
    ' i5 Y% h  ^: U- v. f7 c1
    4 k' N; c. _9 L: {' e2; Q5 h- {6 P& e1 X8 r
    38 b; b+ ^; S; K1 N& i2 I7 e, q, `
    46 P7 O: F& ^6 E, P+ G8 x
    5% x$ @9 v2 f0 c/ b4 M) F( S
    6
    7 b8 s: Z/ r. i8 G& D  q7
    & i! b8 ~0 D5 V0 }2 {84 t% P6 F& Q- n% @+ }& h1 \! X
    9  E0 g& p/ k5 y1 c% G7 c
    10
    . Y/ ]. J: O6 e6 M8 ~4 z11, c- ^5 ^: x6 R' J1 Y0 y
    12& b! O$ P$ r! u+ a% L
    130 H( ?9 A5 B5 f) W
      得到结果:
    & D1 x6 b' f6 r+ R9 `8 ]: a
    - P4 O! y/ X& n& t/ D7 Z2 G6 ?  d; x# R8 m6 J! Z
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。
    , a0 N7 E2 N2 h. B  那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    + ~. }# v& x$ I
    5 b: S: T  c- L7 m6 f( s例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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    , \$ U) p5 Y3 D3 K∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj$ J( Z" K4 ^" [  ]  p9 g: B
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj7 U. O- ?- m5 O. `7 ^' ?5 D$ x
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。# r% D- b2 `1 T$ V% q
    ! C/ O  t* Q, p& B4 K' |
    代码:
    4 F) C2 P8 O+ o
    ' d0 [. Z- c* `" b- h! [* v+ P!旅行商问题;* s% d5 p1 C9 z: G
    model:! [5 T# T% M! R& Q1 ?9 ^
    sets:
    2 o" B" u+ h/ E    city / 1.. 5/: u;: R5 Q7 d( L' N8 N; y
        link(city, city):
    + \  q" T/ j$ \        dist, x; !距离矩阵;& e5 _- T9 v2 x, ?9 U8 \% Z
    endsets# |: D/ p, ?7 p5 j. }& B
        n = @size(city);( ]2 Y1 q6 U- a2 d4 Y' y1 a; M
    data: !距离矩阵,它并不需要是对称的;. F0 [4 W3 v3 I( x
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;
    6 x( C$ A6 h: W# C0 r# Oenddata
    % [; v5 T% p7 V- J; {    min = @sum(link:dist * x);
    " C$ r0 i# m8 @: j) R    @FOR(city(K):
    - t+ o( L. X9 L$ B# @$ s5 j        @sum(city(I)|I #ne# K: x(I, K)) = 1;1 y; W$ z; v  W* k
            !进入城市K;) f) ]0 U# s* j+ X" h' x, a8 l
            @sum(city(J)|J #ne# K: x(K, J)) = 1;& r9 p2 C2 }' ~+ O; `" {6 }! ~
        );( x! m; J1 R0 {
        @for(city(I)|I #gt# 1:: Z- [6 w! w0 @! s) K0 ~# M
            @for(city( J)| J#gt#1 #and# I #ne# J:
    ! d( r: @' D* g- v4 t+ Y. w             u(I) - u(J) + n * x(I,J) <= n - 1);
    7 v: Q/ m2 G) Z* F! M    );+ U+ p# ?7 A5 N( U  I( ^1 S7 k
    @for(city(I)|I #gt# 1: u(I) <= n - 2);4 \: d2 F: J3 f
    @for(link: @bin(x));' J. e4 [1 V& n; p$ V& C8 C
    end
    / y$ r' L! v0 _2 y6 ^0 i4 a1! H+ U7 u. K# r* d8 b
    2+ E2 b: v5 R: {" `) l
    36 r# F7 b, Q" g) U$ G. P
    46 w1 k# m+ ^0 G' O$ f; p9 j4 x
    5
    0 F3 f9 Z4 M+ e6
    0 v. E. L' E3 h" I) L7 g! f! H4 v7
    5 n, V& W' n) D1 D0 D8! p+ Q2 r  P- ?2 Y' X
    9; t5 V- }& e0 E9 z& E# E4 i
    10- ^) L8 Q6 B4 H3 H; u1 L
    11
    1 s* V( t) ~3 X4 J: b# x# R12* h- F# W5 z: ]
    13
    - B8 ?6 W$ t, ?14
    ; _- \1 M4 O; x' `. K* u) u9 e151 J+ y/ H8 w% ]8 d- m
    16
    3 A1 y+ X! ?" U0 u17. x) N8 d* ^2 ^& m7 y
    18
    1 V2 Z: `; P" l$ d- S+ Z6 E19" }1 h: A0 W+ B6 C) j
    206 w% ^! S+ w' A! Y5 R+ Z
    21
    ' l+ X, R' r+ A22" T( s& t( H4 r# N7 d. y4 M
    23
    4 v, D0 Y0 L0 m2 k8 r7 V# |249 a5 i3 ]% v3 ]- `) G- h; o
    可以得到结果:
    5 k, O. ]; [- {$ Q- B6 l- X. t4 U+ y; i7 }$ H+ G
    --------------------- ' z% l( e- S, N
    # |  Y( ]/ _" F0 Z6 F, f
    8 R; C5 Z. @% Z6 ]# d: H' R

    6 E8 |2 o$ G. C- J2 o) ~' }0 H7 v- W: ~  G/ j) T/ g& h
    8 Y( j( d1 t% I" u" d- S
    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-14 18:58 , Processed in 0.598285 second(s), 51 queries .

    回顶部