数学建模社区-数学中国

标题: 数学建模(11)——Lingo使用&数学规划 [打印本页]

作者: 佛自业障    时间: 2018-10-29 11:14
标题: 数学建模(11)——Lingo使用&数学规划
注意事项Lingo中默认所有的变量都是非负的,在程序中不需要写出相应的约束, y& Y3 s! f- k% l& ]- Y- J: [8 I5 c
使用集合的方式定义向量,必须先定义,而标量不需要定义,直接使用即可( I8 i0 T# {' M/ R  u& K9 w
三个要素条件:目标函数、决策变量、约束条件
. o" O* i: f) x$ C: X8 ~8 Z0 |一个语句可以分几行输入,但必须使用英文分号结束/ ~7 G' u9 U# Y- ~/ W4 ~- x6 j* w
注释使用!开始,英文分号结束
- J0 S5 x. t' y  p+ K9 E8 F变量不区分大小写( G( ?' n5 T7 W3 Y5 M' `
所有函数以@开头* H. b8 r: G9 E. ~- i# S) a! z- S8 p3 [
函数与运算符Lingo具有9种逻辑运算符
1 j" }8 {) p! k& {6 ?6 d6 l! c" B
‘#not#’ 否定该操作数的逻辑值,’#not#’是一个一元运算符。
5 a, f2 A7 H$ M6 v: x& C' p‘#eq# ’ 若两个运算数相等,则为 true;否则为 false。 ! G4 q$ k( R3 Z: ?$ b
‘#ne#’ 若两个运算符不相等,则为 true;否则为 false。 # X5 y2 @0 B  k3 s2 r# \. Z5 Z
‘#gt#’ 若左边的运算符严格大于右边的运算符,则为 true;否则为 false。 ; E' T1 o: y1 g
‘#ge#’ 若左边的运算符大于或等于右边的运算符,则为 true;否则为 false。
9 Z% S* f& u8 s3 s6 k0 q: \‘#lt#’ 若左边的运算符严格小于右边的运算符,则为 true;否则为 false。
1 _  e- h0 x" R* v, j$ k‘#le#’ 若左边的运算符小于或等于右边的运算符,则为 true;否则为 false。
2 c/ {) G" U: h! u% H‘#and# ’ 仅当两个参数都为 true 时,结果为 true;否则为 false。
) p8 {( _$ w, t+ \‘#or#’ 仅当两个参数都为 false 时,结果为 false;否则为 true。
3 F/ `$ C3 m3 q; O; R( a4 N4 J# y
# Z  a9 Z6 X3 @7 P: I% _6 R集循环函数9 n! I1 F& _. |; `

6 }$ o7 m( t1 J2 ?% A7 J2 }8 h1 Z+ ?" q@for:该函数用来产生对集成员的约束。
% Z4 y  i2 u6 R; t  K@sum:该函数返回遍历指定的集成员的一个表达式的和。
, j  C+ |; \. y. M  `@min和@max:返回指定的集成员的一个表达式的最小值或最大值。
' S9 p' g* C8 o5 A  X$ E
6 _: r' s6 r4 G5 q2 |, M. |Lingo提供了大量的标准数学函数
3 L' e& h% q! v6 Y& H( n5 p4 V! h& s2 ~0 E0 w3 p, i
@abs(x)返回 x 的绝对值。 - X; r! H9 C; ?3 Q
@sin(x)返回 x 的正弦值,x 采用弧度制。 4 K! ^. }+ d! w
@cos(x)返回 x 的余弦值。
5 \1 W( @7 C% t$ l* a# h@tan(x)返回 x 的正切值。
% P" t! i1 A$ s" l2 j, x+ m* ^' j; t@exp(x)返回常数 e 的 x 次方。
  C' |. R# k4 e9 M6 ^( e! }@log(x)返回 x 的自然对数。
  M( P' E7 p0 L  n# M( L& t@lgm(x)返回 x 的 gamma 函数的自然对数。
; J, N* R( [; v2 ]@mod(x,y)返回 x 除以 y的余数。
. ~2 E( T% D6 w@sign(x)如果 x<0 返回-1;否则,返回 1。 . Z$ N9 r" U1 p3 C8 X
@floor(x)返回 x的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回 不低于 x 的最大整数。
8 }* W& f* G7 V* }% M: q@smax(x1,x2,…,xn)返回 x1,x2,…,xn中的最大值。
9 l0 A) `1 V& l$ C5 N1 L/ s@smin(x1,x2,…,xn)返回 x1,x2,…,xn中的最小值。( o% k, Y" x. @. V' M- ]+ o% g

# d' e- A3 y+ K  w# J  S变量界定函数实现对变量取值范围的附加限制,共 4种; B6 c% Y2 n$ t  }4 H& t8 N* A

! {. P0 r# M- a9 }3 B' I@bin(x)限制 x 为 0 或1;
! X5 N: Z( S) c@bnd(L,x,U)限制 L≤x≤U; ) K% ?: U% k7 n3 b
@free(x)取消对变量 x的默认下界为 0 的限制,即x可以取任意实数; 8 M# n9 u. R9 I* @4 w
@gin(x)限制 x 为整数。
  `7 ]/ x% m1 ^+ }
7 W$ f1 A! t# n# S' d代码格式model:4 m! B: ]+ J( ]+ C! \* U

1 e  ^) j+ e  n. @sets:6 O9 R8 z* \* M$ Q9 P
!此处为集合定义;* Y5 p$ _6 x, }7 {" r5 ^
endsets
$ l* N) X$ s& A' O2 ]) `
/ c9 k6 j. k0 ^& N3 X+ D9 ydata:) |8 R  [7 g4 z0 Z
!此处为数据导入;
( a  L8 a# @/ [$ b$ denddata) z6 W+ R  M1 D) G* }  V

4 i$ E% o( F) Pcalc:# J5 Q7 }) D; d$ N9 l: b% k
!此处为计算段,专职已知数据的计算处理,不能含有变量;
/ j0 A9 I) z! b" ^% wendcalc
# F1 h, b: S7 @- O! f4 ^4 S, N5 E* k/ K" R" N
min\max=....;  !目标函数;- H. @9 I! U! y  B- [% d. V
@for(....);   !约束条件;
' R* `' g* Z+ }# Y...8 P2 {2 a- r1 `
2 ~5 D" ]0 ?+ q5 B
end
' R* ?, q1 Y. j% A
2 I% j; v1 ~: H6 x" \, w# ^实例线性规划 1.jpg - H" Y: }1 S0 D" V% B
, t% k+ }" w7 V0 a+ i9 u$ L! [& i; D
2.jpg
9 z; J0 p3 F1 H3 pmodel:* b; ^% y! ?4 N( C2 c7 p# @
sets:
6 C8 L/ o4 T; K, M. K! N( c* s!集合名称/成员变量/属性;6 U, v5 ^$ I9 V7 n7 Q
    warehouse/1..6/:e;
5 d: E# G% M0 d% G    vendors/1..8/:d;
4 O% y, b& q& Y/ D, J& x!派生集合名称(集合名称1、2):属性;
1 O. R1 W5 B/ F7 t; C    links(warehouse,vendors):c,x;+ }3 v+ j5 T' `: j
endsets1 E) x: M" c' G& {' B
! |4 f2 t- K. L: \) \& X, k8 X) O9 ]
data:
9 H$ v. @$ h& r9 `! {" T' i6 d9 U' H. \!属性=数据列表;
5 Q8 B$ n1 l3 O; \. d6 J# m!程序与数据在同一文件 . F! R: Z& D; r) [5 T, l; R
    e=60 55 51 43 41 52! j/ x* D0 W; q  N* o2 F
    d=35 37 22 32 41 32 43 389 O& @: x) Q' v$ E
    c=6 2 6 7 4 2 9 5
& k& u' [$ b" v; h( z3 y$ ~$ W6 Y9 R      4 9 5 3 8 5 8 2
5 a+ Q- i% d+ o, w# e      5 2 1 9 7 4 3 3
# n7 ]0 y1 H. ~9 ]      7 6 7 3 9 2 7 12 d# h* b0 R0 f9 H$ V7 k+ o
      2 3 9 5 7 2 6 5
$ B$ W4 P" U+ N, y: r      5 5 2 2 8 1 4 3;
; C! {! P& d( J3 X  q$ R" A/ ?) i: \: m7 F4 c' {, E
!通过纯文本文件传递数据;9 h0 p6 }% R7 x2 f& B( Z$ f( Z1 \# e
e=@file(sdata.txt);
' w0 I) `7 V& `2 d$ L' }# se=@file(sdata.txt);
' I- g% ]% D* I8 ^  H. M5 b8 S9 Te=@file(sdata.txt);
4 \5 }1 n4 Y! a5 u! m6 x3 w@text(sdata2.txt)=@table(x);!将计算结果以表格形式输出文本文件;
2 `7 z$ U+ C( x# t; l/ G0 ~1 f!sdata.txt文本文件内容- ^2 p3 L% `- f" p: T: O( j2 n  ?
60 55 51 43 41 52~    2 |4 k7 C, y4 @& G7 i
35 37 22 32 41 32 43 38~+ W- b$ B- }, e/ b7 s9 q
6 2 6 7 4 2 9 5
* a6 ~$ L3 K9 @- O3 ^6 T 4 9 5 3 8 5 8 26 i# z4 P! r3 o  Y
5 2 1 9 7 4 3 3
) ]# }* r0 w( r' p* R 7 6 7 3 9 2 7 18 E  m  ^) |8 N  b. H# z  Z
2 3 9 5 7 2 6 5
& M: W6 P2 o4 k. e% ]$ v9 l% G 5 5 2 2 8 1 4 3;!~是记录分隔符;& k2 g  Z/ v: O' R9 c7 l, M& K
enddata) V/ B( [+ o! U) l
! o% H9 E) Z7 u
!目标函数;
$ `4 m0 f( L1 o/ @! Y' H1 F    min=@sum(links:c*x);6 N2 J3 E1 a0 _8 `5 _0 P
!需求约束;
8 }# }$ k. s: n* p. t: m. }    @for(vendors(J)sum(warehouse(I):x(I,J))=d(J));- d$ [- ^, @. L& ?# G' }' t
!产量约束;
/ v6 o# j% y2 A. x    @for(warehouse(I)sum(vendors(J):x(I,J))<=e(I));1 p4 f, p/ r% {2 _) d* c
!数据;
- D& k+ K+ u" f; f. }5 o
" r: y  G, b. a+ e, iend1 {, x6 ]( Y. q
0-1整数规划: K" V/ j4 Q7 P/ I1 ]4 e; l' F
11.jpg % k2 X$ c7 x8 r( k. r+ z  O% r

/ J. l+ A2 Q5 D1 B1 m( p2 L% A 22.jpg 3 F" U' y4 S& U2 a6 o
model:
/ S, Q! F2 A: z& O  u7 _- H5 R0 {sets:
7 l- _  y5 `  A4 Inum/1..10/:x0,y0,x;# M% R3 W' g, S, {( q
link(num,num):y,d;
& i; s+ ^) i8 Yendsets 5 P& g- Y) Q% W- }1 M# |
data:
& q9 L7 x5 r/ z# N8 Z& f1 ^6 q9 Ix0=9.4888 8.7928 11.5960 11.5643 5.6756 9.8497 9.1756 13.1385 15.4663 15.5464;
) _  K; ~2 F; ]( H0 K0 w3 Fy0=5.6817 10.3868 3.9294 4.4325 9.9658 17.6632 6.1517 11.8569 8.8721 15.5868; , _6 L- w) I' J% w5 c
enddata 2 @) L  {. n; ?2 {0 r& s# H
4 c6 K2 i# Y4 o" |1 G
calc:
& i9 W% h( n- V, c- ~/ B! H@for(link(i,j):d(i,j)=@sqrt((x0(i)-x0(j))^2+(y0(i)-y0(j))^2));' U* H" O/ J! a! n' a/ `
endcalc+ C6 W$ }0 |7 y# x" i- x

4 \5 [: G! k) Q2 _3 u/ S% Jmin=@sum(num:x);7 e3 C, M& L; N2 y  f0 ^9 w4 ~
@for(num(j)sum(num(i):y(i,j))>=1);
  `  R- P5 V! f* }% E; E@for(link(i,j):d(i,j)*y(i,j)<=10*x(i));
+ u0 B' v; S8 y@for(link(i,j):x(i)>=y(i,j));
$ D- j/ {  L7 {$ L! [  \@for(num(i)sum(num(j):y(i,j))<=5);
* w* F  f8 }' a" {0 T4 ~@for(link(i,j)bin(y(i,j)));
3 `3 @0 ^  b# n@for(num(i)bin(x(i)));
: U, U+ _, v) Z& dend 7 o- c, L8 g+ N; K! t8 x' a; u
非线性拟合(最小二乘法)! h8 U5 Y& t7 P: U
6 [! K' ^  L/ m4 _& q3 p
8 O* R, d+ E5 n+ V& G
model: 3 z) d9 k7 g" I* g5 M( k
sets:
& D# o& o# z. t: j: X4 }num/1..8/:x0,y0;: V9 Y- i+ C) ]8 E* z: N
) @) I% C! W& M+ K' x. ~
endsets
( a8 ]& ~/ b7 Rdata:
' m+ E5 v6 b  j% s2 _( zx0=6 2 6 7 4 2 5 9;
1 c8 X. [# K7 ~4 ny0=4 9 5 3 8 5 8 2; , F0 m3 _' {4 X) q* B
enddata
6 @: Y! T8 _- G3 _5 U# C8 B) ~1 h4 ?; g- X5 k9 O, [# j, K
min=@sum(numy0-a/(@exp(b*x0)+c))^2);+ M/ }! N& o4 {; [; ]& F, A+ `
@free(a);@free(b);@free(c);
& t. G8 X# C$ vend 1 Z& Y0 }9 t4 J! O8 }
Lingo基本使用方法
/ k8 S$ \6 {1 U6 D  }LP模型在Lingo中的一个典型输入方式: . e3 R& l4 Q, j) R/ v
1.以“MODEL:”开。 6 ^. C/ u# g. h  N1 ^1 Z' q/ ]8 t
2.集合定义部分从(“SETS:”到”ENDSETS”)定义集合及其属性。 3 M4 P+ s! Z, y8 K1 D8 |
3.给出优化目标和约束。
2 N/ w. C7 Y1 }$ |4 {4.集合定义部分从(“DATA:”到”ENDDATA”)。
2 J! Q6 u2 _1 W1 c0 s. ]5.以”END”结束。% _2 E6 U. n' `) G. b

$ `/ C0 c) \' ^" y( B* ]目标函数的定义方法
' b7 b; J$ ?! Y# w! p6 F2 ]6 I1 g2 R9 w@SUM(集合(下标):关于集合的属性的表达式)
. l, X! b/ r9 i% q1 [
$ P5 a, Q4 S; s0 z约束的定义方法
; \! |" b# b: Y$ j7 t$ T循环函数:@FOR(集合(下标):关于集合属性的约数关系式) % v. ~& I' u- [2 j; |. K/ G
如果有对集合下标有限制,需加一个”|”分开  X& M( U( P/ g: m1 A; W
) n4 N$ o$ r  y( `7 s* d
逻辑运算符
1 Y: {5 P) R2 B! G* n1为TRUE, 0为FALSE 7 H1 X$ `- S9 ?4 W5 w
#AND#(与) 、#OR#(或) 、#NOT#(非):逻辑值之间的运算,它们操作的对象本身已经是逻辑值或逻辑表达式,计算结果也是逻辑值。
* J% S& ~. W$ y( b/ S5 {#EQ#(等于) 、#NE#(不等于) 、#GT#(大于) 、#GE#(大于等于) 、#LT#(小于) 、#LE#(小于等于):是“数与数之间”比较,也就是它们操作的对象本身必须是两个数,计算得到的结果是逻辑值。
6 t% q$ D: S/ |4 m# R" M- c, I; c/ u" A- M
集合循环函数4 B0 a0 M. ~- ~* e' i& g8 \
@FOR(集合元素的循环函数)  y) L+ o1 `8 }  [: |
@MAX(集合属性的最大值函数)7 [5 F) _1 R/ X# y
@MIN(集合属性的最小值函数)
! _+ s3 b' g' t0 z4 ~6 G" y@PROD(集合属性的乘积函数); n) w! F& G  S) z% W
@SUM(集合属性的求和函数)3 N" ?% r1 t' h8 G! `
变量定界函数5 N( S1 Y3 b* Q4 a, B- n& v  o
@BND(L, X, U):限制L<=x<=U。. W2 ?6 D4 l8 W+ X6 {
@BIN(X):限制为X为0或1。
6 E+ N* j4 y7 V, X@FREE(X):取消对X的符号限制。
5 G5 f/ m  J! @% n$ G& ~% ]@GIN(X):限制X为整数。
: S- w( z* \0 G9 I7 W* U& W文件输入函数4 m: K$ P/ v! |6 l1 D  C3 o3 |  ^
@FILE(filename):当前模型引用其他ASCII码文件中的数据或文本时可以采用此函数。用 ‘~’来隔开数据。
8 a; \) F; e& k8 E@OLE(filename,区间):打开excel,输入数据! Q7 S/ X) C! `; U0 ?- h' n& z

* |: N6 `0 W& U+ m2 ]7 j% L
! m- S. W  l9 n" e
' N! Y% F- W% ?# A- W4 @; j- d# y, T! L





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