数学建模社区-数学中国

标题: 助力国赛 | 第3弹 规划问题(Lingo版) [打印本页]

作者: 杨利霞    时间: 2020-6-7 14:34
标题: 助力国赛 | 第3弹 规划问题(Lingo版)

# G/ w4 f9 Q& N! P: k4 a助力国赛 | 第3弹 规划问题(Lingo版)# ?# f1 y+ ]( T! p6 x
& a5 r% ~) p" ?' x/ O
" N) i1 ?8 ?! g2 P! {) M
前言
上次介绍了用MATLAB来求解规划问题,功能强大是强大,但总觉得有点不爽,函数里面的参数有点难记,万一输错了岂不玩完了。的确在可读性这方面,MATLAB做的差一点。正是基于此在此向各位推荐另一款软件——Lingo。Lingo在数学规划上也是大名鼎鼎的。本次首先会简单介绍下Lingo和其基本操作,齐次介绍些高级操作,最后还是回到实际问题中,在具体问题中一睹Lingo的强大。

/ n: z/ |$ x. O! e基本操作简介
Lingo是美国Lindo系统公司开发的一套专业的求解最优化问题的软件包,可以求解线性规划、二次规划、非线性规划、线性方程组、非线性方程组和整数规划等。LINGO软件有多种版本,如LINDO,GINO 和LINGO(包括LINGO NL)软件。在这些软件中关系最让人“头痛”的恐怕就时Lingo与Lindo的关系,其实可以这样简单的理解:Lindo是可以是这些软件集合的代名词,Lingo只是其中一种具体的软件而已。管他们什么关系,知道现在被广泛使用的是Lingo就行了。0 H' J# b% V* {9 r
Lingo是一款商业软件,使用是需要付费的,可以登录他们的官网:http://www.lindo.com 进行查看,但在天国获取的方法就不仅限于此了,具体可以访问某度,在此就不细说了。
1 r! `3 g% r9 e( _4 y" C

+ X" @- i5 T0 x/ z% z. ?4 R1 U/ W' |
下面“吹一吹”Lingo。
强大的求解整数规划功能是Lingo软件的最大特色,且求解速度非常快。Lingo还是最优化问题的一种数学建模语言,它包括许多常用的数学函数,这些函数可供使用者在建立最优化模型时调用。此外,Lingo提供与文本文件、Excel文件和数据库文件的接口,便于输入、求解和分析大规模最优化问题。

& B2 q" p2 O# m+ G% U6 ^2 p初印象
第一眼还是很重要的,下面就看一看Lingo。
: o% ^' _' i; V! W/ n建面如下:
, z8 _: N! A: a7 q# Y! H9 z. O% W% c
. ]' T1 x, |) _  q, f2 w" }
常用工具栏:
( R4 a' Z' P1 s8 P2 _
Lingo文件类型:
文件后缀名为“.lg4”保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息。
运算符
算数运算符: 用于数与数之间的数学运算。% M5 h1 {3 h! a- Z; ~3 p; x2 g
LINGO中的算术运算符有以下5种:
4 c) i" F' T$ z7 b3 F+(加法)2 t9 L7 d% G- n) v; m+ C. \9 a; P
-(减法或负号)3 T9 M0 P. y) X4 d" P0 I
*(乘法)
% s( }7 S# `: Z8 H1 d/(除法)
/ S3 v  S3 `1 X; ^7 p* {% f^ (求幂)
关系运算符:表示“数与数之间”的大小关系。
+ A( R9 Y$ v* i9 c! J1 ~LINGO中关系运算符有3种:
1 n2 a  d$ Q6 |. e  y7 t< (即<=,小于等于)/ z! @8 d# [, n2 z! Z& e$ H4 n
= (等于)) L3 J4 j& h2 o% S' {/ b
> (即>=,大于等于)
简单程序编写
求解如下问题:
* }( s7 d* D/ F+ w. R

. }* R+ m, w7 F0 l0 x2 b
编写程序:

8 j" s" W( k6 s* d
点击求解按钮:

5 [+ f  |& v& R0 P
分析结果:

  |, k; D/ b! E$ X6 r  {$ R$ K7 x
所以当x1 = 0,x2 = 5时,取得目标函数的最优值15。
高级操作
下面详细介绍Lingo的用法。
基本语法
在LINGO语句中通常以MODEL开始,END结束(MODEL和END行也可以删除),目标函数表达式前需要加“MAX=”或“MIN=”. 在写LINGO模型中,注意:
段
LINGO中建立的优化模型可以由六个部分组成,或称为六“段”。
有了这些我们就可以,不必把表达式全都列举出来了,下面这个表达方式:' o- N6 J+ x; t' s  N5 T
# _% j, B' o3 G/ u2 ?
code:
sets:!集合段;s/1..100/:x;!基本集合, 集合名与属性变量;endsets!目标与约束段;@sum(s(i):x(i))<90;!循环求和函数;
  V( e6 Y) [  Y9 X  q' B! S
# j! N4 G1 U! ]9 O! \! P0 l" E
code:
sets:!集合段;ss/1..10/:b;endsetsdata:! 数据段;b=1 0 1 2 3 5 2 6 1 2;enddata
' `5 z6 T( y  Y( g/ S) A% d
: g/ H: y3 r- m9 C* p0 s$ K
code:
sets:!集合段;a/1..100/:x;b/1..200/:y;Endsets!目标与约束段;@for(b(j):@gin(y(j)));@for(a(i):@bin(x(i));# H! h) g6 s5 Z6 q, R* L4 P
派生集合
派生集合就是派生出来的集合,看几个例子就懂了。0 ]9 d; c9 m4 z2 w( n8 X
/ C2 q) B) y4 P/ d+ P7 a
code:
sets:a/1..100/:;b/1..200/:;C(a,b):x;!派生集合;Endsets!目标与约束段;@sum(c(i,j):x(i,j))=280;# X: R7 C) I& G8 z+ T7 j

1 q3 t, Q: C% E4 Q/ H" |* n
code:
sets:a/1..100/:;b/1..200/:;C(a,b):x;Endsets!目标与约束段;@for(b(j):@sum(a(i):x(i,j))>150.001);!集合元素的循环函数;5 [4 l) ~8 b) z- e4 i. Y" t6 C

8 E$ }3 U  v1 x
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));
5 ]# ^) |! `* Y" O; K; F8 x0 `# ~逻辑运算符与过滤条件
这个前面提到过,再罗列一次:
' A; h, t+ N$ d& m) W3 ^. d' GLINGO逻辑运算符有9种:6 ^0 D! W" X+ @5 B! {( T3 z
#AND#(与),#OR#(或),#NOT#(非):
& U4 G& @6 G1 Q. Q  t3 A2 r#EQ#(等于),#NE#(不等于),
- _: g+ i7 ^8 i! I- J# R5 x' s. G4 O#GT#(大于),#GE#(大于等于),, ~' A9 E2 _8 B, I' m! T" z
#LT#(小于),#LE#(小于等于)! X* M& I# c3 j  L0 q$ u4 A
看下面一个例子:
9 Z, ?, N; L7 p! O: \
3 D. C( h  @- Z) M+ {" j; E
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));!过滤条件;4 v0 x$ n1 k7 _
如果我们表示一个分段函数时,就可以是if函数
@IF(logical_condition, true_result, false_result)
8 f" Q+ y# G" a* P
当逻辑表达式logical_condition的结果为真时,返回true_result,否则返回false_result。

, T, O% [9 c( D- r) Z& m
code:
f=@IF(X#LE#500,4*X,@IF(X#LE#1000,500+3*X,1500+2*X));( @6 |# l7 Q, ~. p# I' S
掌握上述方法,可以解决掉大部分规划问题,如果还想进一步了解,可以去查阅相关书籍。
实际应用线性规划
1 d1 `+ S5 N# T8 i& Q. {1 u! A
原运输问题变量更换为:
4 f; X$ J$ A7 o, A# n: }6 s* _
建立模型为:
# v; e2 {. n( q8 t3 `7 T2 Z. Z% S
模型进一步转化为:
1 U7 [( J) [/ v; }6 `; @/ B6 j8 r0 F
程序编写:
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
' P. ?- W9 o6 B" ]# t! c
运行程序即可得到结果。
非线性规划
CUMCM2004C请你参考下面给出的数据(或自己收集资料)建立饮酒后血液中酒精含量的数学模型,并讨论以下问题:
参考数据
$ M. a+ U$ X7 D% y4 F) V8 V0 }9 s
分析:把人体内酒精的吸收,代谢,排除过程分成两个“室”,胃是第一个室,血液为第二室,酒精先进入胃,然后被吸收进入血液,由循环到达体液内,再通过代谢,分解及排泄,出汗,呼气等方式排除。# B8 [, g) l& Z6 M7 e) Q
假设胃里的酒精被吸收进入血液的速度与胃中的酒量x(t)成正比,比例常数为k1,血液中的酒被排除的速度与血液的酒量y(t)成正比,比例系数为k2,G0为短时间内喝入胃的酒精总量,则可以建立微分方程:# Q; v- c, a$ ^8 ]
求解得:
) \3 w2 Z+ i2 b( _
变换为:
1 K8 N$ X' h/ p: t6 `
7 ]( o0 ^; }5 w$ p0 r
因而问题就可以转化为:

8 O5 @. S: v# M" G% D
编写程序:
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);END
0 _4 o  \% V- u* z" D. W2 M5 R# X
运行程序,即可获得结果。
整数规划:
对上次最后一个题目,用Lingo进行求解。3 d" R9 E' ?9 J+ Y4 _  I
编写程序:
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
% L& T+ C1 \9 j+ c/ C2 ~
运行即可求出结果,还是满精确的。

4 [% X% {* T, X0 M( B7 m: l4 ^
+ Y1 e, y8 p6 A; L: o




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5