数学建模社区-数学中国

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

作者: 佛自业障    时间: 2018-10-29 11:14
标题: 数学建模(11)——Lingo使用&数学规划
注意事项Lingo中默认所有的变量都是非负的,在程序中不需要写出相应的约束
1 D: V7 U, G/ R使用集合的方式定义向量,必须先定义,而标量不需要定义,直接使用即可
0 S$ D. i. {/ N. b) S三个要素条件:目标函数、决策变量、约束条件+ a- a+ {# k9 z. ]2 A* E
一个语句可以分几行输入,但必须使用英文分号结束$ b! d. [3 G" z+ X  v7 _2 x
注释使用!开始,英文分号结束
5 T( L/ ^8 D: q8 M7 k: |( P变量不区分大小写
7 s& G9 H1 A/ j所有函数以@开头2 [4 Y  k. U9 o4 \9 X& E
函数与运算符Lingo具有9种逻辑运算符. o0 o8 J+ A6 \' Z& J9 v& P
- E7 b" x. G# u2 J
‘#not#’ 否定该操作数的逻辑值,’#not#’是一个一元运算符。
7 H7 t# b- V- f# p6 w% t‘#eq# ’ 若两个运算数相等,则为 true;否则为 false。
7 U0 D; V. W' S; J6 @‘#ne#’ 若两个运算符不相等,则为 true;否则为 false。 - k6 b& ^! _) A
‘#gt#’ 若左边的运算符严格大于右边的运算符,则为 true;否则为 false。 " N) r; m& m2 F0 G$ ]& \
‘#ge#’ 若左边的运算符大于或等于右边的运算符,则为 true;否则为 false。 - T9 ]- c& v* Q" V: w; n7 a
‘#lt#’ 若左边的运算符严格小于右边的运算符,则为 true;否则为 false。 , O/ W- j5 n" W+ q* G+ {  L6 w
‘#le#’ 若左边的运算符小于或等于右边的运算符,则为 true;否则为 false。 8 \5 A/ @* t2 T! u
‘#and# ’ 仅当两个参数都为 true 时,结果为 true;否则为 false。
& [. y1 N% e% V5 `‘#or#’ 仅当两个参数都为 false 时,结果为 false;否则为 true。3 L# E- h8 \8 p9 f) e
; b6 {2 F1 |1 W9 Y4 V% u
集循环函数9 L. _  L3 p7 ~8 C7 d  ~

3 p5 B# m! w+ A* q: _( t! o@for:该函数用来产生对集成员的约束。
" m; c3 C2 P% ~  o6 F@sum:该函数返回遍历指定的集成员的一个表达式的和。 - N) A2 n5 _' B* m3 N
@min和@max:返回指定的集成员的一个表达式的最小值或最大值。3 X3 n3 ?& @( l

! j" B/ ~8 d$ j4 s6 s  g0 hLingo提供了大量的标准数学函数
2 X3 ~! ^& O' x; `- k5 ~( e6 G& _! W. ~; L
@abs(x)返回 x 的绝对值。 0 B' |$ `! K4 B
@sin(x)返回 x 的正弦值,x 采用弧度制。
. X) A, N8 K9 X9 A% Y@cos(x)返回 x 的余弦值。 5 x. ~8 F" j" `9 R8 C* J6 F: W
@tan(x)返回 x 的正切值。 ' Y5 r% L. S9 Y; v0 A
@exp(x)返回常数 e 的 x 次方。 4 H1 X) {; W8 D$ \, Q
@log(x)返回 x 的自然对数。
+ J0 o+ n4 N. _: }! I& O@lgm(x)返回 x 的 gamma 函数的自然对数。
2 w, o6 q- Z% e" k5 K@mod(x,y)返回 x 除以 y的余数。
/ C$ Z3 q" P3 i# Y8 ]4 U* T* n8 U0 K@sign(x)如果 x<0 返回-1;否则,返回 1。 ! j7 h. j& s; o! B6 r- q6 S; c) G
@floor(x)返回 x的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回 不低于 x 的最大整数。
; K* e3 _5 D, R5 Z0 |@smax(x1,x2,…,xn)返回 x1,x2,…,xn中的最大值。 1 J( Q6 f5 j" ^8 ]( L5 j. j$ P' w
@smin(x1,x2,…,xn)返回 x1,x2,…,xn中的最小值。8 i8 R8 b8 K5 Y* u- r* Y6 X: o
6 `" }$ ~3 q, a0 U6 K
变量界定函数实现对变量取值范围的附加限制,共 4种  d2 I- |$ E1 d. V
* z, s5 h0 _5 |- G8 u
@bin(x)限制 x 为 0 或1;
7 f. z% Z( w8 q% P% Q$ E@bnd(L,x,U)限制 L≤x≤U;
( q, ]/ ]0 f3 ?6 n! E2 u  }4 d% y@free(x)取消对变量 x的默认下界为 0 的限制,即x可以取任意实数; 6 ], }7 M( f/ N! A) Q& m
@gin(x)限制 x 为整数。2 }( K  y" E1 ?/ S( e' p
4 K2 P. a0 z; h( o( Q
代码格式model:. t3 k# }8 q, N' b1 l" P0 Y
( o8 F% `1 p1 R9 V) i' N% V
sets:
' B% H  B8 w: D- I& V!此处为集合定义;
& @6 d6 |  N( Sendsets6 R( p* y9 X6 c4 X) x, e
8 [- d& S* A3 J
data:
) L& z; h5 m$ f$ k! j; \& }!此处为数据导入;
" L! n9 q. Z, {+ A3 k0 E5 aenddata: i: L' c( L6 Z  ?  Z/ G- v

* D/ ]0 X; Y3 |8 e% b3 G4 J4 J, Vcalc:
# V9 T( s/ r# G7 h) u; S!此处为计算段,专职已知数据的计算处理,不能含有变量;6 q" h' ~9 a5 X* U! B+ P
endcalc
: H4 A$ v; X) D" j: g4 L$ m9 }7 L1 k9 Z
min\max=....;  !目标函数;
+ G$ r# g6 e8 ?. r/ a: D4 d@for(....);   !约束条件;2 O4 j& p! d4 u0 t
...
& W- z$ {( }% n+ a. O5 a6 u$ E. X2 W/ Q8 l) y1 S; ]( k$ K
end2 o" l  m' _3 E( w
5 y1 i4 n, d. y0 w! U% q" i* S
实例线性规划 1.jpg
# q7 S; a) C% x, n( v) Z
7 W. [+ E$ D2 Y8 f/ b% ~ 2.jpg
8 A+ J$ ^6 E' o% E$ g7 Dmodel:% r: s2 i! ^, A4 g
sets:
+ {/ V& [8 j# P3 Y- I6 F!集合名称/成员变量/属性;  S9 q6 Q- I; O. K
    warehouse/1..6/:e;
, [6 n, x" k' `  I5 b    vendors/1..8/:d;
: F# a: P7 A& L2 Y/ t5 Z. T/ n!派生集合名称(集合名称1、2):属性;
, U. O  X) ]# \; S    links(warehouse,vendors):c,x;; L% s1 D2 }3 [2 X
endsets
9 a: d6 k' g! L. t" J. P2 ]( S7 O, T) m3 P  C. y& m6 V
data:+ E' s% J# q  p4 L! H$ B
!属性=数据列表;
$ P1 i7 W& I, q" T- b3 v: i- h!程序与数据在同一文件 / S4 P6 d5 h1 q, O) v
    e=60 55 51 43 41 52  B2 \5 l; K8 }4 ?9 A
    d=35 37 22 32 41 32 43 38# s$ M% ?, m" i" ~2 _, W
    c=6 2 6 7 4 2 9 50 s& C) o7 y* |5 ?
      4 9 5 3 8 5 8 2# {, T2 `6 ^  a# U; w( v& O
      5 2 1 9 7 4 3 3* \% B$ N$ X1 d# Q0 X" T& G
      7 6 7 3 9 2 7 1
7 h) i" g2 ?: _  b      2 3 9 5 7 2 6 5* P) t, ?) q" P1 P
      5 5 2 2 8 1 4 3;; U1 Z# n! U: b2 {/ w6 J# E6 Y7 X

. [! t. H# d' z$ g0 R. F!通过纯文本文件传递数据;  O( Y  u- S) u6 m. m' @" s- l
e=@file(sdata.txt);0 {( D5 N) r3 |7 P6 r
e=@file(sdata.txt);
0 G5 `! T; e8 W& |; Ye=@file(sdata.txt);
( t: s5 C- N( z% V8 m# C@text(sdata2.txt)=@table(x);!将计算结果以表格形式输出文本文件;
0 u1 u( [. c( ]$ p+ Q% J/ U!sdata.txt文本文件内容* l  j6 n" A0 U9 N! G
60 55 51 43 41 52~   
0 Y9 v( b" D4 W" Q" _ 35 37 22 32 41 32 43 38~
' L. H: ^0 e0 K1 T" ~+ A7 ?6 F: q 6 2 6 7 4 2 9 5
- M# V* Y* Q  h" V0 _, W* e  ~ 4 9 5 3 8 5 8 2
" l$ o9 O; I5 F4 X; W1 u4 y6 @ 5 2 1 9 7 4 3 3
5 c, h2 J8 e# R( T4 B 7 6 7 3 9 2 7 1
4 y/ p! W" W6 h" u  f4 g/ K 2 3 9 5 7 2 6 5+ }  n6 S# z, Z
5 5 2 2 8 1 4 3;!~是记录分隔符;
9 J6 ^: l, a( J$ W. b/ g6 w1 `' Penddata
+ e2 _0 S2 [% A& a) H, \
/ V+ i3 B8 V, _4 Y6 v!目标函数;
, f$ r& ^- N; x; m! ?* T3 t1 P; G    min=@sum(links:c*x);, d1 {  u% {) e
!需求约束;
* C- H6 g9 a5 D/ F; c) H    @for(vendors(J)sum(warehouse(I):x(I,J))=d(J));0 r7 C5 p& j) N2 s: l. d
!产量约束;4 K2 k, I! d/ Z
    @for(warehouse(I)sum(vendors(J):x(I,J))<=e(I));
. w+ C+ r4 f$ A& R* [- ?7 q!数据;
# E/ i2 t5 X, Q/ N6 [+ a6 \- }( [5 C9 p4 r! w
end" Q& p$ b* g  h( j+ [) q& e
0-1整数规划
: M2 W1 I6 N0 e  o, ~0 l$ G! G 11.jpg
# I1 N/ C" h3 ?$ q# d, j( R
5 _1 n, B' X/ z. P6 i: k; q- e 22.jpg
6 U' J2 @# ^+ S8 Y2 C" jmodel: 6 X! [; A3 O! k6 l# c$ N5 z' o
sets: 1 E* k* V! ~6 I1 [% j
num/1..10/:x0,y0,x;3 i8 N1 O( e; i) ^, L7 l
link(num,num):y,d;
; i* _$ w+ b0 j: p7 C) ^/ nendsets
. I) t7 k' w- [- G3 h- qdata:
& N4 Y( i' q5 Z  G$ q+ xx0=9.4888 8.7928 11.5960 11.5643 5.6756 9.8497 9.1756 13.1385 15.4663 15.5464; ' P8 M# b; q$ V! i
y0=5.6817 10.3868 3.9294 4.4325 9.9658 17.6632 6.1517 11.8569 8.8721 15.5868;
2 K  |$ F  p4 Uenddata # C' F( I3 i" @; q, K  o

4 R3 Q2 w6 v) y& _2 ucalc:- N, E1 h* C& a" r
@for(link(i,j):d(i,j)=@sqrt((x0(i)-x0(j))^2+(y0(i)-y0(j))^2));
/ \6 l  f+ |5 o. k" _endcalc- {, p( K' G( _2 q9 s

' S7 W, }0 T% w$ `) E' Bmin=@sum(num:x);1 B( q( t" i1 w, w* f) _4 D" J
@for(num(j)sum(num(i):y(i,j))>=1);
/ `/ b% A  H8 R, o3 G' B8 n0 C@for(link(i,j):d(i,j)*y(i,j)<=10*x(i));% H! |  x( A2 E7 l, Q! B
@for(link(i,j):x(i)>=y(i,j));
& U- N, j& o. A& t( C* a@for(num(i)sum(num(j):y(i,j))<=5);: J4 h7 M1 S" B0 S; Q4 K
@for(link(i,j)bin(y(i,j)));
1 I$ H+ [, O  A* h@for(num(i)bin(x(i)));/ s& I" U  J' X; N" J) Z: ^% i
end * d' A0 k) Y- ^: U' i9 f/ ?1 X; t
非线性拟合(最小二乘法)+ ]1 k/ E# @: |4 ~; j( a- s. u
  [' B+ {5 L+ R+ F" w

1 k" w6 ?6 ^+ Z3 g2 C, mmodel:
2 T% ~5 l3 i8 d6 ], z& d1 {( {sets:
8 ^. t$ ]% @) j9 B+ Jnum/1..8/:x0,y0;. B6 l  l5 y: d: {* Y6 v8 F5 W( e6 k( q1 v
8 D6 |5 V2 [9 ?) f. G
endsets 3 D3 p& D5 n' D3 V4 Y- Z
data: 1 i6 Y' j" \$ V
x0=6 2 6 7 4 2 5 9; ( s( C6 j7 B* ]. o; K  I
y0=4 9 5 3 8 5 8 2; 2 f7 H- W4 ]% b7 D2 e: j
enddata 6 q- l+ L0 \+ T2 N7 [. F

( C. m! c" o3 xmin=@sum(numy0-a/(@exp(b*x0)+c))^2);
3 W' x6 t# m" \: Y/ c4 I@free(a);@free(b);@free(c);% t9 B, ?( q# E( X# s# ~+ R7 ~$ m
end
( b! k  s/ R8 K$ [Lingo基本使用方法
, i, r! K4 M  f& e/ t' bLP模型在Lingo中的一个典型输入方式: ' D9 `4 R  \1 F0 k( V& {
1.以“MODEL:”开。 ; A6 Z* r# M- ^& `, S
2.集合定义部分从(“SETS:”到”ENDSETS”)定义集合及其属性。 4 ?0 E) y2 S, f& W8 I, H
3.给出优化目标和约束。
. E6 O$ b& }' M" v4.集合定义部分从(“DATA:”到”ENDDATA”)。 ) ^! `9 F9 U. e! ]" o1 T7 B
5.以”END”结束。( O( x+ D3 J7 B$ Q5 B: Z

/ \8 g. |' S# V  r) i" b, _目标函数的定义方法
2 S/ D2 @# v2 g" l@SUM(集合(下标):关于集合的属性的表达式)
( p5 X: O/ g) v1 B5 e8 a+ H
8 r7 E" e% y# w2 J$ E5 W5 [约束的定义方法
6 k4 R2 d* F3 s$ `循环函数:@FOR(集合(下标):关于集合属性的约数关系式) ) X5 M7 J/ G& P8 m( N& Q
如果有对集合下标有限制,需加一个”|”分开
0 n- q1 y- n3 L
: u5 ?9 m0 Y2 g3 D) _* G" U5 y逻辑运算符+ A5 t& c3 ~+ O7 V9 m( T
1为TRUE, 0为FALSE
& N7 a; U6 j3 t  h) X2 `#AND#(与) 、#OR#(或) 、#NOT#(非):逻辑值之间的运算,它们操作的对象本身已经是逻辑值或逻辑表达式,计算结果也是逻辑值。 % M0 A1 M5 ^+ N  A
#EQ#(等于) 、#NE#(不等于) 、#GT#(大于) 、#GE#(大于等于) 、#LT#(小于) 、#LE#(小于等于):是“数与数之间”比较,也就是它们操作的对象本身必须是两个数,计算得到的结果是逻辑值。
3 ?, ~, w9 h0 z' ?6 }. B! T0 O6 h+ k$ u' _3 U/ O4 y1 f
集合循环函数
! v- R3 _. r( n) q. [3 p9 b@FOR(集合元素的循环函数)
8 l2 Y' N* c0 Q1 |@MAX(集合属性的最大值函数)! L4 ?# t9 [% y  X- g/ A( d
@MIN(集合属性的最小值函数)' p+ d& o4 {1 ^& T  S) i$ B  @$ V
@PROD(集合属性的乘积函数)7 ]: @. {8 e) W- e- Y: s! f. }
@SUM(集合属性的求和函数); ]  I# v, f# k# f
变量定界函数) J5 J- y7 Y4 V, f% V" H% J
@BND(L, X, U):限制L<=x<=U。8 c' T) a: O% F1 B9 @
@BIN(X):限制为X为0或1。
" R/ o2 W9 h! C! P- d/ g@FREE(X):取消对X的符号限制。
8 x8 X, z1 R7 Z3 P/ M@GIN(X):限制X为整数。" [; `& J- B1 F; {" h. \
文件输入函数
6 l5 I3 w) o) n$ b: R7 J( B  p@FILE(filename):当前模型引用其他ASCII码文件中的数据或文本时可以采用此函数。用 ‘~’来隔开数据。5 A* l& z4 B6 |) P# W
@OLE(filename,区间):打开excel,输入数据0 t# K; \: w9 `! s

* P$ h* R/ y2 w) K
& O( U7 y5 d" d$ L6 b5 U  W: ?7 d* N6 Z! C4 Y

8 t: c$ s" ?# q0 Q




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