QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10294|回复: 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解法
    2 |: @. j2 o: x2 G- K/ f( R" J( q" z一、 从规划问题引入: c5 f+ h& H; o9 X: {7 ?6 U

    & {0 O0 k2 e& L: J  在我们学习探索的各个领域,规划问题都是无处不在的。通过列出约束条件及目标函数,再画出约束条件所表示的可行域,就能在可行域内求得目标函数的最优解以及最优值。当然我们在高中就已经学习过线性规划的相关知识,对于理科同学来说,大多数同学应该感觉难度不大,或者说是送分考点。然而到了大学阶段,一些规划问题的求解已经不是人力可以轻松算出来的了,必须借助于计算机来进行计算。那么对于规划问题的软件选择,又应当如何进行呢?
    # j, \$ ]2 W1 ?, \. m6 f3 E4 G, k  k) M3 D+ S8 O/ p
    二、 软件分析与选择2 v! Z8 g: j- ^( c

    ) J5 m  @2 U& m$ ?7 A1 g  Matlab相比之下是一个面面俱到的编程软件,也可用于求解规划问题。但是如果一定要去和某些“针对特定功能而开发的软件”去比的话,Matlab有时也会稍显逊色。就好比一款顶级的耳机能通吃高中低音,但是去和另一款顶级的为高音而设计的耳机去比较的话,也难免会被比下去。这也就是为什么在规划问题上,很多人会去使用Lingo进行求解。& E: F% d1 A8 d# `/ Y4 U
    * r) p1 i, n9 F6 W7 o: b+ u5 a
      首先我们来区分一下Lindo和Lingo这两款软件。Lingo是在Lindo基础之上做成的软件,处理解线性规划问题之外还加了非线性的求解器,更关键的是还追加了集的概念。可以更方便的解决复杂的问题。所以本文只对Lingo进行讲解。
    1 k' d3 M& u$ X& ]  而对于Matlab与Lingo的区别,就好比手动挡与自动挡的区别,有针对性的专业软件会对用户做很多的优化。这里引用知乎上大佬 花开花落 的回答
    9 ?! `3 U" P) o4 }7 z& @: X- H/ Rhttps://www.zhihu.com/question/49319704/answer/165923451
    ) P% T% K1 V: N; z  `$ |2 T0 c/ n: Y/ o/ S: h* z/ S
      用MATLAB求解线性规划和整数规划问题,需要先将问题转化成如下标准型,其中X只能是向量,也就是单下标变量,然后用向量和矩阵来表达目标函数和约束条件。
    2 \/ Y+ e# S2 l4 v. J  然而,许多问题(如指派问题和运输问题)由于参数和决策变量是双下标变量,必须在基本的数学模型的基础上进行变换才能求解,这样得到的等式约束和不等式约束的系数矩阵规模就非常庞大,当然由MATLAB计算问题不大,但转换工作完全要由人工完成,工作量大而且容易出错,因此在这一块效率不高。
    1 d1 c- V. u( ?  而LINGO有自己的建模语言,在建立了集合的基础上,能够高效表达目标函数和各种约束条件。所写的模型基本上可以看作是对数学模型的翻译,不需要太多的转换。6 E% e7 M# F9 Y, p

    # _: A8 w  V3 T* M' B- _  那么现在我们基本上对LINGO和MATLAB对规划问题的处理方面有了初步认识与了解,至于是执着于MATLAB还是选择开辟LINGO这片新的领域,取决于队伍自身了。9 I2 _0 `$ [% J
    6 K6 x# c) Q$ X( [- j2 H7 z
    三、 如何上手Lingo' L0 ?: ~* R6 ^2 P. U( `0 E

      n6 Y8 v/ M7 X$ _) s  有很多人对于Lingo的评价都是,非常简单的软件,很好上手。
    ' S! B( t/ _6 @; T! O. l  “简单”一词我觉得还比较恰当。Lingo的各种版本几乎全部都是免安装版本的,界面很简单,功能用法很简单,处理问题的方式简单快捷。确实是跟“简单”一词挂钩的。但是任何一款软件想要精通,都是有一定难度的。如果你只需要用Lingo处理一些简单的线性问题,那么2个小时不到,0编程基础的朋友就能上手。如果你认准了Lingo就是你处理各类规划问题的御用软件,那么还是有很长一段路要走的。当然这也取决于用户的编程基础。如果学习过面向对象的程序设计课程的朋友,对于类与对象概念有所了解,那么对于集这一概念也能快速理解上手,学习起来更加轻松。
    ( }: a4 I. u+ j+ o! X! v
    7 w7 c  P2 ?/ E) T/ G四、 Lingo的基本语法规则& _4 ~3 c* K7 n9 E0 T

    . O: j. u9 D( q. v0 k$ m+ b8 t1、求目标函数的最大最小值用 MAX=MAX= 和 MIN=MIN= 来表示;
    ) Y. U2 X" T( D1 J2、每个语句必须用分号“;”结束,每行可以有许多语句,一个语句可以跨行; ! t4 Y# W$ s% v! h
    3、变量名必须以字母A-Z开头,由字母、数字0-9和下划线组成,长度不超过32个字符,不区分大小写;
    " Y3 p6 r4 Q7 C5 a; j5 |- g* ]* @4、可以给语句加上标号; % V0 R# M" _0 G; t& ^+ Y0 z7 [
    5、注释以“!”开头以“;”结束; : ^5 j) K( d8 ?7 Z) H& [
    6、默认所有的决策变量为非负数; + t; k. W, S; R7 c! g/ H6 S
    7、Lingo模型以“MODEL”开头以“END”结束。
    6 c$ ?4 j% m: @- a7 J) K1 F* _8、Lingo把相联系的对象聚合成集,借助集,就能够用一个单一的长的简明的公式表示一系列相应的约束。 7 s. \/ {" B* I' g0 t3 C4 y
    9、Lingo程序会包含集合段,数据输入段,优化目标和约束段,初始段和数据预处理部分。
    ; d2 V1 i# u0 h8 s10、Lingo函数包括有数学函数,金融函数,概率函数,变量界定义函数,集操作函数,集循环函数,输入输出函数,辅助函数等等。, `1 K( a2 c% H
    , N- o3 i; s" n) m0 J( _
    五、 谈一谈例子
    $ d" s9 G5 H5 M3 O3 n* \0 v7 y  }, v9 z! h
      那么Lingo用起来到底有多简单呢,我们来看一个例子。0 Z6 h  a9 R" P) I1 \  Z% h" c

    . {0 H3 I) R. d* v2 n6 Q' ]例1:某家公诉制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:: C5 r8 G2 ?! b9 d. m- H0 ?
    5 D% Z% Z# G0 i. F; w
             每个书桌        每个餐桌        每个椅子        现有资源总数
    0 `4 s9 z3 j4 w% I8 \木料        8个单位        6个单位        1个单位        48个单位1 e. |1 J' R2 O. w
    漆工        4个单位        2个单位        1.5个单位        20个单位
    8 t% _: T4 @8 Y. E- f2 c( V木工        2个单位        1.5个单位        0.5个单位        8个单位
    ; j2 c1 u! r! S) v. y! A: }1 {' b成品单价        60个单位        30个单位        20个单位         
    5 P2 q" n$ E% d3 ~  若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?
      u7 J" H4 `$ [1 [$ A) F& L4 l' P/ i, h: v1 F/ @
    解:代码
    * C" l. j& g+ f- ~
    0 _/ _- Z3 m6 ?* X9 N8 i! lmax = 60 * desks + 30 * tables + 20 * chairs;$ n9 U8 [& r8 a0 E& m. i# H* P
          8 * desks + 6 * tables + chairs <= 48;
    3 U! x8 ~1 v' l2 \7 \. A      4 * desks + 2 * tables + 1.5 * chairs <= 20;  V; {, O/ F# O+ Q3 E, {3 z0 k
          2 * desks + 1.5 * tables + .5 * chairs <= 8;- j; F# g! S) a$ i+ }
    tables <= 5;( l% t( E3 \. N! W9 o0 b' Z
    1& z% O& a4 y3 D4 m4 c
    2
    ( A# d- z: K* W' g) {36 M  i! `% j. {: V7 A8 P
    4
    + @8 v7 N! A8 @: ~4 ?5( v7 Y  E" q$ W/ h4 }
    可以得到结果:
    $ L$ S% Q) }, ^5 v! ]' b  z' U7 j; p/ N& B) W$ m
      这里的 Total solver iteration 表示一共迭代2次得到最优解。 ( g1 Z$ k) T: R
      Objective value 表示最优值为280,而取280的时候各个变量取多少呢,底下的表格给出了答案。
    . |$ H" u8 T! V% V6 L, I9 e( Q9 m  可以看到,没有定义变量,简简单单一个函数一个约束条件,迅速计算出了答案。Lingo看上去就像是为了非编程人员量身定制的一样。
    " u9 f1 O; N6 v  _# i/ p; r1 E5 r  l% H* c
    例2:给定一个直角三角形,求包含该三角形的最小正方形。9 l8 z# E: a4 X; n# `
    6 p' I, L/ B* Q  ^  T
    我们可以作出如下正方形:
    $ F0 P* x" t  U2 I8 z) e: U
    # e; C! e5 D) S7 n. M. v/ |, q
    * k8 C9 G% u4 U# D  CE=asinx,AD=bcosx,DE=acosx+bsinxCE=asinx,AD=bcosx,DE=acosx+bsinx
    3 l: i: ^8 ~5 \- t9 G  \  H  转化为了规划问题那么正方形面积最小的时候即为最优解。
    ; }9 j; ?1 u+ ]( L. Y+ w  代码:
    1 \$ ?% ^& f1 c. ^7 ~) Z5 G3 g7 V4 v" K8 w% x
    model:2 M% B" F3 l; {
    sets:) ]6 h+ M% M; S3 G8 Y) F; z
        object/1..3/:f;4 i1 I8 s7 E# o. r! w" F( d
    endsets
    " ~( \. V9 D& y9 E- F( zdata:
    - O4 V8 Y1 o* r9 L9 v8 C" _% X    a, b = 3, 4;
      S' B* S; b2 U3 J! p3 Benddata
    1 V  f( M3 E6 c" v6 x' u& c; @/ x    f(1) = a * @sin(x);
    2 ]5 n& V8 j5 J" Q" h    f(2) = b * @cos(x);3 Y' \$ [, Q" P' ]
        f(3) = a * @cos(x) + b * @sin(x);
    ! J4 a7 Y# p$ K& [0 G* x7 c+ c    min = @smax(f(1), f(2), f(3));
    8 t0 i4 m( \- k, G+ q- r- H; e    @bnd(0, x, 1.57);
    ! e* }/ K7 L! r5 `4 P- i  `+ ^1 Oend/ d& ?2 X% c# t( b* L/ f+ r
    1
    9 `  F' W7 W% p6 A- f2
    4 u. X5 b0 N3 u3& J: t" Y$ a8 I& g) [: g4 m
    4/ g3 u  R! i8 V2 w& b9 k
    5
    # F% ^) D* \/ Z$ Y% }6$ p7 ^6 s" i: C. w
    7
    6 p* g: x$ Q" m  F+ F8
    , o. e6 d6 g8 N! y; t, o9
    ; @# g/ x& s# B9 [1 b. V# T10
      E% e+ K4 E( A11  Y' h; d3 ]$ Z1 ]! G
    12
    % H1 ^& W$ q8 g2 T( U2 O7 s6 S138 {  o. x* ~/ A( h" B
      得到结果:
    $ B5 R) ^! E2 p- A. j/ D* a* I2 H5 q
    / ~* ]1 s# {& o8 |
      这里需要注意,lingo中如果没有代码说明,是默认 xx 的值大于0的。代码中用 bndbnd 函数限制了 xx 的范围。* b# \( |0 K  \' a: z
      那么再进阶一下,Lingo在处理TSP问题的时候表现如何呢?
    8 p, G7 ^- F/ n+ V6 h% b, r+ H
    % G7 m) |4 O. 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 的一个圈置换 ππ 就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为
    $ _2 x4 C5 c; k6 w5 i∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj) o' d5 K3 P! k# Y2 g
    ∑i=0n(ciπ(i)+piπ(i))=∑i=0nciπ(i)+∑j=0npj9 Q' A" F" B0 ~1 q1 a: ]
    由于 ∑nj=0pj∑j=0npj 是一个常数,故该零件的加工顺序问题变成TSP。4 r+ j5 X# m: ~. @0 h+ K) o

    ' ]: G3 U) T) |. f5 r6 a8 R5 `1 i代码:
    ) S7 p9 W) f9 F3 J7 j+ S6 v, c6 p; p6 ~
    !旅行商问题;% L2 D, \4 w5 |8 [9 K
    model:5 O% P3 Z& m5 ^% b0 s
    sets:
    6 \& B8 h. Z5 C' E2 p* H6 L) a- g  x    city / 1.. 5/: u;
    . n0 k# N/ p8 h; E8 X2 g    link(city, city):( V. ?0 H) h. c: Y( M2 o
            dist, x; !距离矩阵;
    8 U  p: Y" n7 }9 ?' j+ `+ Mendsets
    8 Q4 X+ A" C" U( M5 H4 M    n = @size(city);; j$ j5 |: p( ]$ p7 Z
    data: !距离矩阵,它并不需要是对称的;# }6 B. Z  p- V
        dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据;7 g/ `, _9 ]8 L
    enddata
    - G0 g9 r) Y) ?* j# Z- R    min = @sum(link:dist * x);
    - B/ h3 B$ a7 _6 N- W    @FOR(city(K):  j- A- J4 }: A9 y) D( i/ {; J) f
            @sum(city(I)|I #ne# K: x(I, K)) = 1;9 c* w4 s) i. v, i& H( c9 K+ U
            !进入城市K;/ H% ^  }# p% f" U  L# j* {
            @sum(city(J)|J #ne# K: x(K, J)) = 1;9 n' q; h  c+ @
        );0 N- l% I  \& ^
        @for(city(I)|I #gt# 1:, v2 s. E1 ]* f# d
            @for(city( J)| J#gt#1 #and# I #ne# J:
    & l9 H( _, D$ w1 J3 d             u(I) - u(J) + n * x(I,J) <= n - 1);  _& l5 ?& o& j7 l2 m; x
        );
    ' M9 D6 c( Y# R+ X7 O2 V6 Z@for(city(I)|I #gt# 1: u(I) <= n - 2);
    + Q' \0 c; ^/ {5 c, c/ `@for(link: @bin(x));
    7 ?( B* m" C: k' N' G; i. _% Tend
    # O( {3 B3 B+ L1 s7 T: l0 e1
    ' v5 ]* z& [7 a$ Z1 O+ w/ \4 G2# E% T3 G  e8 I) f; L# E
    3
    / `) N! `9 i5 A% W# z$ ~4 x6 `% v4) k" j" J: G$ Y  v. o
    5
    1 B% `2 ^& h- R, N& I6
    , O; L  M8 D/ w1 H8 b5 j7: V! j: e5 [, N, t: |4 K% E/ i& R
    8
    : r6 I" }' F$ u; w+ w0 n/ ?9
    3 j' a; _% j! `) @+ d  Q10
    & r( `. W+ k) R" a11/ {, c- @' ]1 E3 d
    12
    5 y- J. L5 k) Q6 n8 u136 ]9 M! _, A$ X* X% `/ u
    14
    - u7 ^  \/ H, N8 f" h5 X& o152 k% m3 O! y/ a
    16
    3 u/ b9 I1 m* Q4 o172 p1 I5 Z1 E* O0 c& F
    18
    / h3 {. A" L  R% s19
    ( i* Q2 A$ b- }2 n" ^5 W8 A" c202 e# N6 e" r0 y" I3 y3 }) u7 l
    219 J$ S/ k% }, ^, y
    22  n7 d: E/ b% d1 M* I8 Y4 Y6 N- [
    23
    ! y, }8 x4 v) g) @6 q' i24
    4 m0 f/ @2 G$ [/ A) q. B可以得到结果: ) t' z( u- C0 x" C& F
    # J/ c- W8 D8 x$ Q
    --------------------- 0 p: a  I' o- N: b2 D

      e7 L, b' P1 D* m5 F) h; U8 l
    7 z% t8 K- n1 w: @4 {$ s' B
    . E, u* G# S. s+ }4 z" l2 _( M, ?
    , N. B: j3 R% }: o/ H
    1 b3 @$ }0 m: L, L$ A$ J) J5 j
    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-9-30 01:45 , Processed in 1.424599 second(s), 52 queries .

    回顶部