数学建模社区-数学中国

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

作者: 佛自业障    时间: 2018-10-29 11:14
标题: 数学建模(11)——Lingo使用&数学规划
注意事项Lingo中默认所有的变量都是非负的,在程序中不需要写出相应的约束
4 f% J8 x. @0 T, g: u: t1 J使用集合的方式定义向量,必须先定义,而标量不需要定义,直接使用即可
+ o' n: B3 Y, K/ ?8 X三个要素条件:目标函数、决策变量、约束条件, p+ n* ^' z6 Z+ B# `
一个语句可以分几行输入,但必须使用英文分号结束
  h8 s8 a/ K% F( b' s0 T( k6 z% d7 g注释使用!开始,英文分号结束
. T. F4 ~0 z% e4 j变量不区分大小写8 V6 A& G) M; e- H7 N$ E% _
所有函数以@开头
; ^+ G& g4 A) V) Y6 F函数与运算符Lingo具有9种逻辑运算符5 T- n$ a* P! z- o+ ]

9 v: u. a, Z, {‘#not#’ 否定该操作数的逻辑值,’#not#’是一个一元运算符。 ( x) y7 b4 n3 q9 c; @
‘#eq# ’ 若两个运算数相等,则为 true;否则为 false。
2 q1 [/ w9 U& I( ]# D& h0 J. Z‘#ne#’ 若两个运算符不相等,则为 true;否则为 false。 0 v4 V2 w4 t" y3 P$ l
‘#gt#’ 若左边的运算符严格大于右边的运算符,则为 true;否则为 false。
, h) V; q9 D& l0 o, h  a" h* u‘#ge#’ 若左边的运算符大于或等于右边的运算符,则为 true;否则为 false。
" N+ K# w# j& G9 r. W, n3 h‘#lt#’ 若左边的运算符严格小于右边的运算符,则为 true;否则为 false。
  o2 ?0 [2 n4 y0 Z1 W; a. s7 Y‘#le#’ 若左边的运算符小于或等于右边的运算符,则为 true;否则为 false。 " @! C% j, @: r  F0 d5 E8 s
‘#and# ’ 仅当两个参数都为 true 时,结果为 true;否则为 false。
; ^8 u$ v7 L- @6 ~$ Q# E‘#or#’ 仅当两个参数都为 false 时,结果为 false;否则为 true。$ {7 x& T% ?4 [* {; h1 f1 y7 C& O9 z
2 m4 i+ J0 H+ ^8 C1 z" q1 e$ i5 ~
集循环函数
* r* e- k% U6 g, @. }
+ z: B/ f# U$ a' ^8 m@for:该函数用来产生对集成员的约束。
- S  Z2 D- @6 D. c( W  S( X3 _@sum:该函数返回遍历指定的集成员的一个表达式的和。
4 j. Z! O3 S# H: f7 g@min和@max:返回指定的集成员的一个表达式的最小值或最大值。
$ H$ v0 R9 O0 H5 P# m7 m6 G. D9 Z
8 L# `+ Y7 H9 z. GLingo提供了大量的标准数学函数
) B' r5 r8 l' @! E* Y4 X$ A( ?# D/ @, {
@abs(x)返回 x 的绝对值。
: R: X& Y9 M! ~; S( p) |@sin(x)返回 x 的正弦值,x 采用弧度制。
; `# z- M4 q$ |@cos(x)返回 x 的余弦值。
- ^7 W/ s1 @. e6 C' K@tan(x)返回 x 的正切值。 6 \. x; P# p& H
@exp(x)返回常数 e 的 x 次方。 0 B: h- z3 S  a" c
@log(x)返回 x 的自然对数。
! R- t; w/ m5 t' ]: W@lgm(x)返回 x 的 gamma 函数的自然对数。
* N6 m8 t! X+ M1 V8 w@mod(x,y)返回 x 除以 y的余数。 * o# K9 h8 n+ k0 s' f
@sign(x)如果 x<0 返回-1;否则,返回 1。 4 m* V" u& v. |  f  A
@floor(x)返回 x的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回 不低于 x 的最大整数。 & o, F( t! T+ U( k9 H- `9 {# V
@smax(x1,x2,…,xn)返回 x1,x2,…,xn中的最大值。 ( i% a+ q6 P3 j( x( ]
@smin(x1,x2,…,xn)返回 x1,x2,…,xn中的最小值。# h8 Z" H5 W8 C
) D# E/ ?, g- M1 f/ E& _' |
变量界定函数实现对变量取值范围的附加限制,共 4种
+ [8 a" Q6 c, F% F0 F
) X) p( a3 D0 A9 J, a; Y@bin(x)限制 x 为 0 或1;
3 S9 }. g6 b, N0 |4 I3 H, p@bnd(L,x,U)限制 L≤x≤U;
+ v( z6 S" X2 I2 T- z# v( D( \@free(x)取消对变量 x的默认下界为 0 的限制,即x可以取任意实数; ) ^  G; l/ u' h, U7 v+ n
@gin(x)限制 x 为整数。( D( s. l; w: ^$ p$ b

: W( s8 a, [/ n; D8 E6 G6 h代码格式model:" P+ K0 O; L" K

2 V' k0 {* J1 u: r. [. v6 Msets:
4 P, H" K3 W5 ?# D- t, w4 \!此处为集合定义;& m* f& V; J+ m% ^2 \
endsets
  B  ~; h8 f, b, @
- I" D" o4 t; K! ~data:1 C  V8 x1 S: b9 S& K& N! C* T
!此处为数据导入;0 Z/ j7 C$ _0 W, o8 I  ]
enddata
8 J( U% t/ v, A! _, L- f
; p8 k3 H8 b6 B, A- ~* I5 D2 rcalc:
; C* d' ^1 W  m9 Q!此处为计算段,专职已知数据的计算处理,不能含有变量;+ L! O1 O1 n3 e. J- j
endcalc/ V& n/ n. B0 Y! Z" ~5 L) h$ }

9 g# b  s+ Q, Y3 T/ imin\max=....;  !目标函数;
' x3 ^* ?; u8 e8 G3 h@for(....);   !约束条件;8 [3 {3 {6 G- h+ D3 |
...
! w6 g* @+ c' K
" B$ w0 Z) n) v1 h6 s3 Uend" P" P1 C( \# `$ w( M3 E
8 @6 H2 _6 |: d: ?# c
实例线性规划 1.jpg 0 b3 J% Y! a3 d8 J; y% Z" F
1 l6 ^3 G; V1 C0 z
2.jpg
5 P; H* M( U2 U/ v- I5 j8 ]: ]model:
6 Y  p4 f8 P: V% h+ z0 X5 b1 _sets:
5 O! l8 |* K7 i% [- D) y!集合名称/成员变量/属性;- r0 o7 }- x/ S% ?" f. N
    warehouse/1..6/:e; / o6 R9 S8 Z  P$ T
    vendors/1..8/:d;
; |, Y9 q( b# `1 i9 U' {. H!派生集合名称(集合名称1、2):属性;- N! u& m" Y$ }( Q2 B% V
    links(warehouse,vendors):c,x;0 k6 {9 N5 Q& C
endsets( l9 {, o! x" G* ~

4 L( Z2 K; T. R  G" `& {data:
% I/ O6 n9 d# L# R# J4 b* v2 w!属性=数据列表;- ]  L/ `$ G$ O- a' C
!程序与数据在同一文件
4 {6 n4 g+ }: t+ u$ @* G) h    e=60 55 51 43 41 52
1 F: F2 O* B. h7 c$ D    d=35 37 22 32 41 32 43 383 W" I9 q8 x0 T$ F2 c
    c=6 2 6 7 4 2 9 5' x+ s/ K- Z! b& m, l
      4 9 5 3 8 5 8 2- C* q% G( _' o
      5 2 1 9 7 4 3 3# a& e  M" L& }7 U& A4 C
      7 6 7 3 9 2 7 1
; F! z% ~8 j: g& R% B      2 3 9 5 7 2 6 5
' X2 I( D1 H) |4 a$ I" m* p      5 5 2 2 8 1 4 3;3 `, z3 ?" m9 w3 w% x
0 A. y. ?8 |- p9 w& `; t6 Q  m
!通过纯文本文件传递数据;* {- S' i1 o3 [8 E2 i: H4 m' Q3 @6 P
e=@file(sdata.txt);: E4 R$ B; e, {7 W! L- |* {4 r7 u
e=@file(sdata.txt);
( p! r  u8 R7 h/ ne=@file(sdata.txt);4 K9 _' M* B1 f: n  P3 C2 \* v
@text(sdata2.txt)=@table(x);!将计算结果以表格形式输出文本文件;8 p) N  k1 M9 H4 j* d. r
!sdata.txt文本文件内容
$ @$ V0 H7 G/ T, ^ 60 55 51 43 41 52~    2 }, y$ P, @' E
35 37 22 32 41 32 43 38~! ]* s0 j* f9 c) K
6 2 6 7 4 2 9 52 x  O! j4 D: {& I5 ~
4 9 5 3 8 5 8 2
; k3 z. ~* _5 M- Y 5 2 1 9 7 4 3 35 W5 i. |, y, U4 m& c3 ]8 J7 E* T
7 6 7 3 9 2 7 1$ `& s+ k3 t2 `7 ~9 K' M$ n5 _/ a
2 3 9 5 7 2 6 5; G% Q7 Y  l# j6 Z5 C
5 5 2 2 8 1 4 3;!~是记录分隔符;
6 V4 ]; I3 J5 D) S9 @enddata! p( R9 c% f1 r- r0 F
( |. P/ n  O8 P/ e% |) X. W
!目标函数;/ n( f* K6 T6 B2 I8 f+ h0 i4 \
    min=@sum(links:c*x);) O3 h& |( w- z% k
!需求约束;# T3 N# G9 ?  M, y# x( m4 ^6 ?, o
    @for(vendors(J)sum(warehouse(I):x(I,J))=d(J));
* e1 v' ^& I5 J!产量约束;
- b2 b1 L6 T" A& w& _( y/ }    @for(warehouse(I)sum(vendors(J):x(I,J))<=e(I));
: i: Y" g! O3 B& V, L: e3 y* W!数据;
. b1 G6 V6 f: l
/ w; d1 C, @: j2 `$ c% H. S& L: Fend
# T& M+ l0 o4 ]4 B/ n9 N0-1整数规划; `; H" x6 F# Z6 w/ e: x) m
11.jpg 3 _& N1 J( e5 C/ `( j

* m  r% v) [2 C, @ 22.jpg
- r) a+ c1 H- O% xmodel:
5 u6 f* d6 m, O  xsets: / G1 _9 w1 v0 ^6 l$ s: I- d8 \7 f
num/1..10/:x0,y0,x;5 I' y- F! Z5 N2 O- y
link(num,num):y,d;& L4 m3 H/ v. T4 b: P0 k* \% w
endsets 4 r: P' [; ^+ `6 k, `
data:
7 T$ {0 s1 A/ q7 N: F* d6 @x0=9.4888 8.7928 11.5960 11.5643 5.6756 9.8497 9.1756 13.1385 15.4663 15.5464; & T, V7 b1 h% E
y0=5.6817 10.3868 3.9294 4.4325 9.9658 17.6632 6.1517 11.8569 8.8721 15.5868; 8 p& ]% m5 p# o9 h5 X2 j8 E( {3 X
enddata ( c! R3 Q0 f- X' `: C+ Q7 x" v

$ c% A' w0 g! |8 q  |- bcalc:! b5 T3 q/ ?; s7 ^" g6 \; G; ]" a
@for(link(i,j):d(i,j)=@sqrt((x0(i)-x0(j))^2+(y0(i)-y0(j))^2));
- `" T" x+ }8 a! |endcalc3 D  m5 o: m& U9 v6 s* G
4 Q3 r$ r9 Y) m* V: ?$ x
min=@sum(num:x);; W) p% Z% |5 @% y  `. ]2 E
@for(num(j)sum(num(i):y(i,j))>=1);
4 f1 s# _2 C' Z8 U- W; X* W4 h8 K@for(link(i,j):d(i,j)*y(i,j)<=10*x(i));" D# e# }5 q* d8 B; \; h% u
@for(link(i,j):x(i)>=y(i,j));. R. T+ @, C6 h0 M+ i5 S
@for(num(i)sum(num(j):y(i,j))<=5);
: I) ]# F( ~+ m@for(link(i,j)bin(y(i,j)));
6 _' B9 w* u, z& j@for(num(i)bin(x(i)));7 ?2 L4 Z: k6 C/ W& o! V2 o
end % x7 y! m2 _; A9 T3 F
非线性拟合(最小二乘法)
: K2 \6 L( }' j% ]9 e- x
/ h* v7 n( \5 q' u! M
  P4 i$ u! c/ V4 o1 imodel:
: r1 k+ ^; g+ q/ V1 `6 x$ |sets: 8 Z; C. T7 o: `7 ]& z/ t# K) `/ y
num/1..8/:x0,y0;
4 p0 A  @% F$ J3 g
/ F+ {' m$ Y% e/ @% @endsets 7 t+ M6 ?2 Q8 }# x7 M: W9 d! O( G
data:
7 A  o6 z+ W6 ]x0=6 2 6 7 4 2 5 9;
0 U9 A7 @6 ]' ]8 V  }7 d5 \y0=4 9 5 3 8 5 8 2;
, @6 A2 X8 C2 fenddata
3 a: a# `9 C/ K( L+ M; g" D/ D+ J* |& R! Q/ W; k1 ]
min=@sum(numy0-a/(@exp(b*x0)+c))^2);
: a. u6 P/ N! ?) H@free(a);@free(b);@free(c);
3 s1 L) m0 R1 D2 e, q3 \end . v, h1 \1 N' n0 i
Lingo基本使用方法/ G1 P+ `# h1 E( u* v
LP模型在Lingo中的一个典型输入方式: 1 A+ b6 G0 ^/ a
1.以“MODEL:”开。 3 ^# u; ^" \; G1 Y! Y4 M/ d+ K
2.集合定义部分从(“SETS:”到”ENDSETS”)定义集合及其属性。 6 ^/ q2 I2 [" E" J6 i* t/ @
3.给出优化目标和约束。   }/ D( V- ~1 W$ {( a
4.集合定义部分从(“DATA:”到”ENDDATA”)。
+ {  s9 N4 g. O) a1 _  k5.以”END”结束。
0 ~! f6 Y  r' e6 H' J2 e+ [( H' M
5 X, J- P( c6 H; j* m: k目标函数的定义方法 - e" G# h1 |/ ~
@SUM(集合(下标):关于集合的属性的表达式)
' u1 U4 f% H2 v9 x+ B1 D% l
( y" n0 A  m8 ]5 N) I( l7 c* {" h约束的定义方法
5 ?( p- Y* }1 H, }. _- \5 [循环函数:@FOR(集合(下标):关于集合属性的约数关系式)
4 R  ?( F  n6 `9 \) Z- b$ @如果有对集合下标有限制,需加一个”|”分开' f, B7 ^0 Z: j. ?7 @  z

, ?9 a0 P% n) C* f2 N9 l8 M9 m3 H逻辑运算符
' s2 G; a# Y) K, D; p" @8 A1为TRUE, 0为FALSE
( e4 V- u! W  O/ B1 R#AND#(与) 、#OR#(或) 、#NOT#(非):逻辑值之间的运算,它们操作的对象本身已经是逻辑值或逻辑表达式,计算结果也是逻辑值。
, B; [3 x) F5 Z, N2 r#EQ#(等于) 、#NE#(不等于) 、#GT#(大于) 、#GE#(大于等于) 、#LT#(小于) 、#LE#(小于等于):是“数与数之间”比较,也就是它们操作的对象本身必须是两个数,计算得到的结果是逻辑值。
; A8 Q( v. t7 _
, ~: r* E$ P4 w3 N集合循环函数: [3 {( Y% Q& L0 A# z$ E
@FOR(集合元素的循环函数)
" u$ @/ Y. [+ S; P, J9 y@MAX(集合属性的最大值函数)( P  I3 o) _: a, X9 a2 @
@MIN(集合属性的最小值函数)
: Y" Z# A4 O8 ^# b6 a9 x  k@PROD(集合属性的乘积函数)7 D3 a* m  G: l- |/ U! t
@SUM(集合属性的求和函数)) c* F4 v5 P( M1 E. A7 |( Y
变量定界函数( @* F4 v% ]' R2 a+ t
@BND(L, X, U):限制L<=x<=U。$ c) D' S7 s; e' b  g, k- x  J, b
@BIN(X):限制为X为0或1。
, g* ~6 Z, Q/ `! S/ P@FREE(X):取消对X的符号限制。
5 M, z6 x2 D# s6 i' K@GIN(X):限制X为整数。
8 w, }) o5 ^% _# }- m2 [. D文件输入函数
% {& \" x/ P! D@FILE(filename):当前模型引用其他ASCII码文件中的数据或文本时可以采用此函数。用 ‘~’来隔开数据。- I1 \. ]" {5 y* g6 y
@OLE(filename,区间):打开excel,输入数据+ C7 I$ G7 G! o
/ I) i. E/ i  Z6 t6 ^6 a
% S& Z- ]4 K& g" I. Z% A  ?* p+ C

: J4 @2 X& S- d9 x/ H+ N- J6 d





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