QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3374|回复: 0
打印 上一主题 下一主题

助力国赛 | 第3弹 规划问题(Lingo版)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组: 2018美赛大象算法课程

    群组: 2018美赛护航培训课程

    群组: 2019年 数学中国站长建

    群组: 2019年数据分析师课程

    群组: 2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-6-7 14:34 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    6 g: f( e1 ^0 b
    助力国赛 | 第3弹 规划问题(Lingo版)
    ! s2 j! k& t% t) I5 j& U* S7 t' `9 z

    7 S2 c1 G/ Z/ |1 U" j) Z/ m! p4 N2 h+ t
    前言
    上次介绍了用MATLAB来求解规划问题,功能强大是强大,但总觉得有点不爽,函数里面的参数有点难记,万一输错了岂不玩完了。的确在可读性这方面,MATLAB做的差一点。正是基于此在此向各位推荐另一款软件——Lingo。Lingo在数学规划上也是大名鼎鼎的。本次首先会简单介绍下Lingo和其基本操作,齐次介绍些高级操作,最后还是回到实际问题中,在具体问题中一睹Lingo的强大。
    • 基本操作
    • 高级操作
    • 实际应用
      1 K% q: N) r6 f7 y, J
    ) E- M& _3 G$ X5 [
    基本操作简介
    Lingo是美国Lindo系统公司开发的一套专业的求解最优化问题的软件包,可以求解线性规划、二次规划、非线性规划、线性方程组、非线性方程组和整数规划等。LINGO软件有多种版本,如LINDO,GINO 和LINGO(包括LINGO NL)软件。在这些软件中关系最让人“头痛”的恐怕就时Lingo与Lindo的关系,其实可以这样简单的理解:Lindo是可以是这些软件集合的代名词,Lingo只是其中一种具体的软件而已。管他们什么关系,知道现在被广泛使用的是Lingo就行了。) ?* c2 \- A2 f
    Lingo是一款商业软件,使用是需要付费的,可以登录他们的官网:http://www.lindo.com 进行查看,但在天国获取的方法就不仅限于此了,具体可以访问某度,在此就不细说了。
    7 m4 S( x+ Y. z
    ( m/ `# o3 [; _/ r* t. w+ E' F+ n% N( g
    下面“吹一吹”Lingo。
    强大的求解整数规划功能是Lingo软件的最大特色,且求解速度非常快。Lingo还是最优化问题的一种数学建模语言,它包括许多常用的数学函数,这些函数可供使用者在建立最优化模型时调用。此外,Lingo提供与文本文件、Excel文件和数据库文件的接口,便于输入、求解和分析大规模最优化问题。
    : f" G" C9 z: t1 \0 ]% f
    初印象
    第一眼还是很重要的,下面就看一看Lingo。
    & N  n# ]+ L. p- V; m" l7 S建面如下:
    , c3 t5 g7 a6 @" [. {( u8 N

    2 K; ~5 T7 `3 ~) l0 w
    常用工具栏:
    & k. T* d! {3 `( }3 H8 G; x
    Lingo文件类型:
    文件后缀名为“.lg4”保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息。
    运算符
    算数运算符: 用于数与数之间的数学运算。
    7 d! ^& v4 |1 g" i/ Q2 N2 aLINGO中的算术运算符有以下5种:
    0 {! w' x) ]7 v, Z( E+(加法)
    1 n  M- W, G0 {; m  |-(减法或负号)" R0 H# {% ~% ~/ m
    *(乘法), I* o# H7 O6 Y+ D2 b/ ?% _
    /(除法)
    ; p2 k, p* M) y0 J^ (求幂)
    关系运算符:表示“数与数之间”的大小关系。
    8 @: P$ Z8 n1 A% x+ ~4 l* \LINGO中关系运算符有3种:9 J2 w* \  z! ^4 `( p" k( B: q
    < (即<=,小于等于)
    4 j! R$ ~" Z: [= (等于), T' O6 P% t- \0 @# F  r3 C
    > (即>=,大于等于)
    简单程序编写
    求解如下问题:
    ; ]9 `4 M  [, H; J' o) y$ D
    + k$ @( h4 I' c" a* w
    编写程序:
    5 t( v& t, g( }$ D2 N
    点击求解按钮:

    : f& c- M; j/ V# _3 B- d
    分析结果:
    6 j) Z0 _4 d1 i2 u# I+ W* m
    所以当x1 = 0,x2 = 5时,取得目标函数的最优值15。
    高级操作
    下面详细介绍Lingo的用法。
    基本语法
    在LINGO语句中通常以MODEL开始,END结束(MODEL和END行也可以删除),目标函数表达式前需要加“MAX=”或“MIN=”. 在写LINGO模型中,注意:
    • LINGO模型已假设各个决策变量非负. 若变量无非负约束或有上下界,则可以考虑用@free、@sub、@slb或@bnd来定义.
    • 变量名不能超过32个字符,且必须以字母(A-Z)开头,其后可以是字母、数字(0-9)和下划线(_)的任意组合.
    • 变量名不区分大小写.
    • 在约束中“&gt;=”与“&gt;”等同,“&lt;=”与“&lt;”等同.
    • 在目标函数或约束条件中需要以“;”结束.
    • 标点符号等要在英文状态下输入.
    • “!”为注释符号,其后为注释内容,注释以“;”结束.
    • 逻辑运算主要包括:#EQ#(等于),#NE#(不等于),#GE#(大于等于),#LT#(小于),#LE#(小于等于).
      % L. t. |; J3 c7 W! P+ \- x, A
    段
    LINGO中建立的优化模型可以由六个部分组成,或称为六“段”。
    • 集合段:用于定义数组型性变量SETS: ……ENDSETS
    • 数据段:用于变量赋值与数据传递DATA: ……ENDDATA
    • 目标与约束段:用于列出目标与约束唯一一个没有段的开始和结束标记
    • 计算段:用于数据初始整理计算CALC: ……ENDCALC
    • 初始段:用于变量赋初值迭代寻优INIT: ……ENDINIT
    • 子模型段:用于表达子模型进行调用@SUBMODEL mymodel:可执行语句(约束+目标)ENDSUBMODEL
        e9 ^+ P  m& G2 U6 g8 D
    有了这些我们就可以,不必把表达式全都列举出来了,下面这个表达方式:% m  N* P/ j- I: x) Z; c) A! L
    3 y1 `. V# A+ O! w5 O2 S: C
    code:
    sets:!集合段;s/1..100/:x;!基本集合, 集合名与属性变量;endsets!目标与约束段;@sum(s(i):x(i))<90;!循环求和函数;
    1 Y! j4 ~' }* u& r- p$ l
    , q5 S7 R/ A( V( ]$ x7 E0 H3 e
    code:
    sets:!集合段;ss/1..10/:b;endsetsdata:! 数据段;b=1 0 1 2 3 5 2 6 1 2;enddata
    8 T) L4 n. z* B: e4 D2 ^
    ( P/ V# p6 @' q0 X1 @0 d
    code:
    sets:!集合段;a/1..100/:x;b/1..200/:y;Endsets!目标与约束段;@for(b(j):@gin(y(j)));@for(a(i):@bin(x(i));
    7 [: x! Q5 b4 s6 i. z3 \& Q派生集合
    派生集合就是派生出来的集合,看几个例子就懂了。2 S5 A4 _  ~' w4 T. t% w' z
    / S( M7 @1 W( j1 _7 S0 U( x
    code:
    sets:a/1..100/:;b/1..200/:;C(a,b):x;!派生集合;Endsets!目标与约束段;@sum(c(i,j):x(i,j))=280;0 l5 y! Y, I! }' l) B3 @. X" x  K
    ( z+ {7 h/ l  v8 U/ K4 q
    code:
    sets:a/1..100/:;b/1..200/:;C(a,b):x;Endsets!目标与约束段;@for(b(j):@sum(a(i):x(i,j))>150.001);!集合元素的循环函数;
    & |- `6 ?7 J8 m- w% Q7 u% U; E% k# L& a6 a
    code:
    sets:a/1..100/:;b/1..200/:y;C(a,b):x;Endsets!目标与约束段;@for(b(j):@gin(y(j)));@for(c(i,j):@bin(x(i,j));$ {1 D0 \3 M, \, \. j: T
    逻辑运算符与过滤条件
    这个前面提到过,再罗列一次:, `. H4 t2 l. T6 h/ y
    LINGO逻辑运算符有9种:
    3 T& L% i1 ^% ?0 g4 h#AND#(与),#OR#(或),#NOT#(非):
    : e  h) \% N* h7 @#EQ#(等于),#NE#(不等于),
    ; e3 B  P- I7 |3 J( z#GT#(大于),#GE#(大于等于),% D$ e) ~/ D3 P8 ]- K, s% ^4 v1 p# ?
    #LT#(小于),#LE#(小于等于)
    6 b7 j- _3 n$ o) e5 r9 w# `6 g看下面一个例子:- F# Y- J9 }  P# ]8 E. k" P

    7 g3 t: u; A2 t  Z; r
    code:
    sets:a/1..20/:;b/1..30/:;C/1..40/:;d(a,b,c):x;Endsets!目标与约束段;@for(a(i):@for(b(j):@sum(c(i,j,k)|k#gt#1#and#k#ne#10:x(i,j,k))=100));!过滤条件;$ |3 {3 |- t4 z$ q
    如果我们表示一个分段函数时,就可以是if函数
    @IF(logical_condition, true_result, false_result)
    0 H8 ~1 s) k7 o7 S9 ?9 `. R
    当逻辑表达式logical_condition的结果为真时,返回true_result,否则返回false_result。

    5 I4 j$ t( m$ b# M' j6 f! u
    code:
    f=@IF(X#LE#500,4*X,@IF(X#LE#1000,500+3*X,1500+2*X));  u$ t& z! u; V/ e) D7 J5 Y6 s
    掌握上述方法,可以解决掉大部分规划问题,如果还想进一步了解,可以去查阅相关书籍。
    实际应用线性规划
    ) j* ]+ a2 o$ Q$ o/ Q; f
    原运输问题变量更换为:

    ( _, l, {- M. Q$ G8 w+ |
    建立模型为:
    $ O, k5 `+ v9 _
    模型进一步转化为:

    - U3 q& p$ W; U) k  ]
    程序编写:
    MODEL:TITLE 调运大米的运输问题程序3;!定义集合段;SETSIANGKU/1..2/:A;!定义粮库的集合;LIANGZHAN/1..3/:B;!定义粮站的集合;YULIANG(LIANGKU,LIANGZHAN):X,C;!定义运量和距离;ENDSETSDATA:!粮库到粮站的距离;C=12 24 830 12 24;!粮库的限量;A=4 8 ;!粮站的限量;B=2 4 5;ENDDATAMIN=@SUM(YULIANG:C*X);!粮库上限的约束;@FOR(LIANGKU(I):@SUM(LIANGZHAN(J):X(I,J))<A(I));!粮站下限的约束;@FOR(LIANGZHAN(J):@SUM(LIANGKU(I):X(I,J))>B(J));END
    . m6 o" P( |' U  V6 G0 ]
    运行程序即可得到结果。
    非线性规划
    CUMCM2004C请你参考下面给出的数据(或自己收集资料)建立饮酒后血液中酒精含量的数学模型,并讨论以下问题:
    • 对大李碰到的情况做出解释;
    • 。。。
      * K6 _# ~4 e- B/ N$ A
    参考数据
    • 。。。
    • 体重约70kg的某人在短时间内喝下2瓶啤酒后,隔一定时间测量他的血液中酒精含量(毫克/百毫升),得到数据如下:. r9 W% g: C; h! T

    % D3 e0 {: M  L
    分析:把人体内酒精的吸收,代谢,排除过程分成两个“室”,胃是第一个室,血液为第二室,酒精先进入胃,然后被吸收进入血液,由循环到达体液内,再通过代谢,分解及排泄,出汗,呼气等方式排除。' K$ L9 J) R* v7 {6 C
    假设胃里的酒精被吸收进入血液的速度与胃中的酒量x(t)成正比,比例常数为k1,血液中的酒被排除的速度与血液的酒量y(t)成正比,比例系数为k2,G0为短时间内喝入胃的酒精总量,则可以建立微分方程:$ l9 u4 H+ `% Q/ w+ M6 w6 u
    求解得:! S. o+ i) K/ `3 a9 A8 O# R
    变换为:. n) \% Q% o% E' ^
    4 T, W, P) o: v/ S9 {8 ~9 l
    因而问题就可以转化为:
    & s$ `, p1 z9 Z3 Y9 ]
    编写程序:
    MODEL:SETS:BAC/R1..R23/:T,Y;ENDSETSDATA:T=0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 1415 16;Y=30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 18 15 12 10 77 4;ENDDATAMIN=@SUM(BACA1*(@EXP(-A2*T)-@EXP(-A3*T))-Y)^2);END8 \, p! c; q+ D9 W# s# Z
    运行程序,即可获得结果。
    整数规划:
    对上次最后一个题目,用Lingo进行求解。" H# ~0 k' V9 P0 t( q% J3 w
    编写程序:
    model:sets:row/1..4/:b;col/1..5/:c1,c2,x;link(row,col):a;endsetsdata:c1=1,1,3,4,2;c2=-8,-2,-3,-1,-2;a=1 1 1 1 11 2 2 1 62 1 6 0 00 0 1 1 5;b=400,800,200,200;enddatamax=@sum(col:c1*x^2+c2*x);@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));@for(col:@gin(x));@for(col:@bnd(0,x,99));end) H8 G$ J' s- M6 L& Y8 v9 s$ _
    运行即可求出结果,还是满精确的。

    7 h; i( E( _4 c5 B# S. s6 n
    $ u. x; C  a2 h0 K
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-1 04:34 , Processed in 0.425966 second(s), 51 queries .

    回顶部