数学建模社区-数学中国

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

作者: 佛自业障    时间: 2018-10-29 11:14
标题: 数学建模(11)——Lingo使用&数学规划
注意事项Lingo中默认所有的变量都是非负的,在程序中不需要写出相应的约束
3 O5 ?7 y, @+ L+ }4 a! R/ h) O使用集合的方式定义向量,必须先定义,而标量不需要定义,直接使用即可4 ~0 P4 w- x2 }! L! y3 c: {
三个要素条件:目标函数、决策变量、约束条件/ M( N9 y+ C+ G6 v8 }2 y
一个语句可以分几行输入,但必须使用英文分号结束
% b. n0 \: i6 \/ o9 f注释使用!开始,英文分号结束
! C, u( u+ @; V# N4 Q# E9 c变量不区分大小写7 |/ c- e$ {+ x
所有函数以@开头
+ W' |0 b4 k% `! Y! a2 Q5 M$ B0 K, ~8 `函数与运算符Lingo具有9种逻辑运算符
  ~6 Y0 W5 r* b+ S: O4 ^4 k; N5 U. z! y* m
‘#not#’ 否定该操作数的逻辑值,’#not#’是一个一元运算符。   }8 @5 j0 f- }
‘#eq# ’ 若两个运算数相等,则为 true;否则为 false。
; T. j" k0 d, ]' ~) G7 p‘#ne#’ 若两个运算符不相等,则为 true;否则为 false。 - F4 H( x1 B! u# _7 w) c  O* I: e
‘#gt#’ 若左边的运算符严格大于右边的运算符,则为 true;否则为 false。
6 L, E$ B" F% n; [( A4 l! h& ^‘#ge#’ 若左边的运算符大于或等于右边的运算符,则为 true;否则为 false。
  ]& P! v. ?1 K, n‘#lt#’ 若左边的运算符严格小于右边的运算符,则为 true;否则为 false。
0 C4 {( m. m0 K‘#le#’ 若左边的运算符小于或等于右边的运算符,则为 true;否则为 false。 ' L, g0 U/ N: N8 c, D, p
‘#and# ’ 仅当两个参数都为 true 时,结果为 true;否则为 false。
! w6 D, }, P) y' s‘#or#’ 仅当两个参数都为 false 时,结果为 false;否则为 true。9 x7 O% [+ {; @7 X; C- }- D) X
' F% Q8 t/ u2 z+ \
集循环函数. K- W# w! @; W

# n% c. t! R8 F! z; s@for:该函数用来产生对集成员的约束。
# P4 d% s! l. |- W@sum:该函数返回遍历指定的集成员的一个表达式的和。
( Y% [& o# m6 r  `$ F@min和@max:返回指定的集成员的一个表达式的最小值或最大值。6 }- u4 U! D# x& w' G; [

8 f. ~# ^! ~' H* O% f0 {/ H2 A1 l; NLingo提供了大量的标准数学函数
+ S  d& x! D9 K! {" |2 u8 Y3 t/ Y- Z  G0 z
@abs(x)返回 x 的绝对值。 ! |9 k' c7 G/ c5 v9 I
@sin(x)返回 x 的正弦值,x 采用弧度制。
/ X0 g1 n8 K; R$ J8 D$ ]5 I6 B@cos(x)返回 x 的余弦值。 + k8 s" m( R; `
@tan(x)返回 x 的正切值。   F. e& R2 R! w1 _0 o' w% D
@exp(x)返回常数 e 的 x 次方。
7 ]: f% I7 T8 E# b2 K# c@log(x)返回 x 的自然对数。 " z1 ~' V, P( y" G* T- }" w
@lgm(x)返回 x 的 gamma 函数的自然对数。 5 ~) A" m* M$ s
@mod(x,y)返回 x 除以 y的余数。
) |6 M, `& ?) ~6 a5 S@sign(x)如果 x<0 返回-1;否则,返回 1。 , @. z. x" F  a  z% b( M: D% F/ ~
@floor(x)返回 x的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回 不低于 x 的最大整数。 & V4 m8 H- x' F  {  w( A) n6 w( t& z) _
@smax(x1,x2,…,xn)返回 x1,x2,…,xn中的最大值。
3 ?7 \9 u) V' Z+ @: d; x  B+ c1 W@smin(x1,x2,…,xn)返回 x1,x2,…,xn中的最小值。- o$ r3 x8 ~8 D" r& m9 B
5 N( I" n$ V2 o) N# i" h
变量界定函数实现对变量取值范围的附加限制,共 4种8 ]' J" P, {2 m6 V/ b; P6 A. S
& o3 j# g0 _' u8 W! `* Z
@bin(x)限制 x 为 0 或1;
0 [/ f4 u) N! j4 }& r@bnd(L,x,U)限制 L≤x≤U;
6 T4 i; E, P* e: T9 ^5 H@free(x)取消对变量 x的默认下界为 0 的限制,即x可以取任意实数;
4 _/ j# V3 r+ H) T  @, c7 q& D@gin(x)限制 x 为整数。& K9 f9 w( ~0 H# [# _, w& Z
# q; ]$ c0 Z7 E& r
代码格式model:# O0 S: P, ?7 P

. r7 ^& Z, Z2 F3 G: [! G( p2 ]- Ssets:$ f2 a8 o- f$ w% l. g) w
!此处为集合定义;
! U1 [7 z! k" C& b4 Kendsets* V8 k0 g- X" `" p& r% e3 P+ w

# B: I1 t/ V/ H, H$ ydata:2 L- W# q4 ]. M7 x6 V+ c
!此处为数据导入;
; m+ ]/ R! \! w$ ^enddata
" D- t, G/ r1 q' j. P( X$ d# w7 e& r$ V" M( J
calc:
, Q- F6 R& M' K+ y) H  F" r!此处为计算段,专职已知数据的计算处理,不能含有变量;8 o2 g/ L% U, \* v: N6 _
endcalc
1 s- S5 U2 |+ o/ H* M( q( a+ I* a  G' o8 b0 L  [7 C
min\max=....;  !目标函数;
2 Q4 N3 c8 h$ ~% t/ ^" f0 d" N8 m@for(....);   !约束条件;! a2 S2 H7 b9 T5 z+ Q" ?: u' _
...4 U# `& g9 |# w6 N. A  C' Z

$ Q) G4 a/ S  E* H+ _! Zend
2 I. n4 u2 @( W& _- z  ]( |9 [8 o- U/ Q( p" h3 c# B8 T9 [
实例线性规划 1.jpg # Q; B7 ]* B  T2 j
0 ^0 F  N5 u7 o6 |1 P* M' {. X
2.jpg 8 F" z: e7 N6 t) E+ H
model:" G- r- }" a9 V, F8 v5 ?- {0 Q
sets:
- _$ q( p1 g- N$ P# z6 |!集合名称/成员变量/属性;
3 Y; r% ~. F* M+ X( H    warehouse/1..6/:e; $ y9 e3 H. d! F. U1 T/ F+ v2 q9 c. g
    vendors/1..8/:d;' p( m) T$ L  t7 ?( s5 C
!派生集合名称(集合名称1、2):属性;
& S. C+ V; s6 @! N) }# E- e4 b# o6 d" j    links(warehouse,vendors):c,x;' ]0 t, M4 x% N- b7 _4 n9 V
endsets- H3 D1 }2 C7 Q- ~
( t' {: }+ c  u. F9 {
data:
4 y; T8 k' B6 [' t1 _!属性=数据列表;% I7 I! p8 X! z' m/ b- e2 Y) ~
!程序与数据在同一文件 ' ^% B# N7 F2 M3 {9 p
    e=60 55 51 43 41 52' }( ~( K) W4 K6 v6 E
    d=35 37 22 32 41 32 43 38
9 n6 ]$ @5 v% H/ q# {    c=6 2 6 7 4 2 9 59 \6 e+ h- G/ m6 u2 ]
      4 9 5 3 8 5 8 2+ n4 d3 p+ @; R3 ^& l  W
      5 2 1 9 7 4 3 33 U4 T5 l, @( }+ ~
      7 6 7 3 9 2 7 1! z2 }% U+ d: Q) ~+ ?  c
      2 3 9 5 7 2 6 5" h1 M" ?' x7 W6 M2 `
      5 5 2 2 8 1 4 3;
& U$ q6 c8 S+ F! k  e) Z+ Q& X$ W  @' r' }
!通过纯文本文件传递数据;1 E, ^6 T' J5 r/ }6 b2 f
e=@file(sdata.txt);
( L+ E! k0 [0 P) F: N' Ee=@file(sdata.txt);% H6 F6 E0 R. O/ z" Z) S* F
e=@file(sdata.txt);( z* c4 Q. k$ w0 n: i- d
@text(sdata2.txt)=@table(x);!将计算结果以表格形式输出文本文件;
! d6 L3 u& Z1 x6 V) a7 A3 S9 H!sdata.txt文本文件内容1 k/ Q5 n7 X; a
60 55 51 43 41 52~   
$ f; T- z" W8 @- q& r  z 35 37 22 32 41 32 43 38~
, P& k2 Q8 \2 |! `' y+ d) f 6 2 6 7 4 2 9 5: F% n# W: H. M) q2 L, m, d
4 9 5 3 8 5 8 2
4 I0 h+ V( f0 p6 P4 \4 n. B 5 2 1 9 7 4 3 3
; I5 W) O; e5 }, Q 7 6 7 3 9 2 7 11 H1 K6 N0 u( h+ M! f
2 3 9 5 7 2 6 5
" N& c- P- b2 W2 S# c! S! f2 P 5 5 2 2 8 1 4 3;!~是记录分隔符;
* h/ ^& t7 o8 x  G5 Denddata
$ K# g3 r0 K# \
( p1 a8 p% C# b" E+ B!目标函数;
; \# m* d2 r# R) j5 D    min=@sum(links:c*x);' U) D/ p0 v/ A
!需求约束;
* h6 Z: T% F$ F/ h! x: m    @for(vendors(J)sum(warehouse(I):x(I,J))=d(J));
3 b& S9 d- g3 H; S!产量约束;
% `6 J1 e, }( t+ `- i1 K    @for(warehouse(I)sum(vendors(J):x(I,J))<=e(I));
1 E+ V* t% J0 U3 D' a3 l8 i$ O!数据;1 u6 V0 S9 N" E0 }4 _

3 f5 N  t* g5 f( Y4 I1 [# jend% ~: r6 y* g4 M; }
0-1整数规划
- ]0 D; g7 p: ~) m 11.jpg
3 I* p' K) ?. G* B, T! w2 X+ l* ~8 t" E
22.jpg
9 F! s0 i. W% o4 C, nmodel: $ ~! \* Y# O- G' ^! v, _( g
sets:
3 b( C% L' v1 |* @" o* _num/1..10/:x0,y0,x;8 L* }( P" s  G0 z! H9 V
link(num,num):y,d;" M* K3 b  ~5 @1 ~  ], r
endsets , @( B/ x! j3 V
data: ! ~6 t5 a/ \; P7 P3 K7 x7 w5 r4 x
x0=9.4888 8.7928 11.5960 11.5643 5.6756 9.8497 9.1756 13.1385 15.4663 15.5464; 2 B/ Z% v6 p' e: F7 M% K3 o
y0=5.6817 10.3868 3.9294 4.4325 9.9658 17.6632 6.1517 11.8569 8.8721 15.5868;
+ T& p: M' T: N! s7 M" yenddata % J# X% d- {+ v, N7 b) l

& `3 }. L" v+ v/ V& _* M- h/ Tcalc:
+ i4 Z% }  i- y@for(link(i,j):d(i,j)=@sqrt((x0(i)-x0(j))^2+(y0(i)-y0(j))^2));7 m7 I. r; C- {8 B* p$ w
endcalc
; ^$ U! _! v. S; t# k+ Q
6 I" u$ R! O: _+ d( d# Dmin=@sum(num:x);
$ W. J8 M$ M2 L! J$ o) Z+ z@for(num(j)sum(num(i):y(i,j))>=1);
3 l, `" o- o5 g) k( R$ W@for(link(i,j):d(i,j)*y(i,j)<=10*x(i));6 }. {# A  Q* A5 ~1 l/ j5 W" x0 i
@for(link(i,j):x(i)>=y(i,j));
7 l( ?% l- m5 A/ E0 i& v5 H. T& {, J% q@for(num(i)sum(num(j):y(i,j))<=5);8 d9 D% r  \: c; L' F
@for(link(i,j)bin(y(i,j)));3 c: H5 V0 J4 w7 z3 t& d
@for(num(i)bin(x(i)));
9 z) I. V0 z/ E- P9 ~( G6 F7 Wend   K4 A0 P5 F8 G6 j/ o# a& q1 [
非线性拟合(最小二乘法)% C4 e* y0 S+ _  z9 n* A5 L$ \! I

+ Y! R# |' B' V1 V5 T! T8 _9 P. P+ U% [0 Z
model:
) k" E* n( L* R8 g5 Ksets: ! m4 B. ?: ]! R! M
num/1..8/:x0,y0;
: D! Q' @8 e5 [* @8 M+ O
% Q. Q- ~8 i/ R% H- \endsets
* x7 M5 p3 f% `9 O. Mdata: 1 t3 Q& s% {5 }* c% _! G
x0=6 2 6 7 4 2 5 9;
# y$ Z& w4 ^3 Z  {" e, |y0=4 9 5 3 8 5 8 2;
( _: R" F) o3 i  z2 A3 Z% b' X# zenddata ' w# r& h" p5 C2 U1 g
5 D5 r- e$ @+ [. j5 A  P& ^
min=@sum(numy0-a/(@exp(b*x0)+c))^2);
; G% o2 d! E/ t# |2 U1 O% C* m, `. p@free(a);@free(b);@free(c);
  o+ ?6 c, X2 h* ]end ' D2 Z3 D. C, S: }
Lingo基本使用方法
. L  @0 e$ y6 h, ?  K0 l" tLP模型在Lingo中的一个典型输入方式:
: q9 R8 d! g. t1.以“MODEL:”开。
: W5 v2 G8 m5 D' U9 \4 o2.集合定义部分从(“SETS:”到”ENDSETS”)定义集合及其属性。   R3 _- E9 g9 }9 q
3.给出优化目标和约束。
  R. }) q( H4 G! s- B4.集合定义部分从(“DATA:”到”ENDDATA”)。
5 F4 |4 P0 |3 l/ H) I: o2 E2 X2 b* J5.以”END”结束。( ]5 c. A; X  M, e

3 J2 ^% W- u6 e6 v6 d' h  o目标函数的定义方法 ; t2 G' @; w6 h; p! u( S* ~
@SUM(集合(下标):关于集合的属性的表达式)9 d/ g8 o& o& A/ L0 i2 @' j
: @! h6 y" o1 p5 `% N: U
约束的定义方法 , k/ ^9 ?$ [" S' I
循环函数:@FOR(集合(下标):关于集合属性的约数关系式)
! r% L  X% I: ?3 e如果有对集合下标有限制,需加一个”|”分开/ S% K( Q1 ~" x  L

. m7 ^8 L4 W; f' {逻辑运算符6 F/ k) d6 Y1 P1 p1 ^2 U. E8 K
1为TRUE, 0为FALSE
: o; u5 c2 g. \5 ^, d( d#AND#(与) 、#OR#(或) 、#NOT#(非):逻辑值之间的运算,它们操作的对象本身已经是逻辑值或逻辑表达式,计算结果也是逻辑值。 % Q, ~4 H$ _' [$ F+ |9 ?4 g4 a# S
#EQ#(等于) 、#NE#(不等于) 、#GT#(大于) 、#GE#(大于等于) 、#LT#(小于) 、#LE#(小于等于):是“数与数之间”比较,也就是它们操作的对象本身必须是两个数,计算得到的结果是逻辑值。( G+ q; B8 G, [* `" Z4 I

2 i( {( x0 ]; X$ `, o集合循环函数: V' u, h) c' l! N4 n7 [9 `
@FOR(集合元素的循环函数)& J2 T" p" z) \* y) l; x3 G
@MAX(集合属性的最大值函数)
! j. f; E* l) R- ?  d6 s6 F8 ^@MIN(集合属性的最小值函数)
9 E/ m3 X# N& r# Q9 j! Q) D- Z@PROD(集合属性的乘积函数)
5 k" w7 p: P3 `, h@SUM(集合属性的求和函数)
* N9 X6 D! ?+ [. n变量定界函数# b' c- M1 O# o' W0 Z" E
@BND(L, X, U):限制L<=x<=U。1 p3 h3 z7 G' [; w% l! g
@BIN(X):限制为X为0或1。' b# {$ R* Q9 l9 z
@FREE(X):取消对X的符号限制。8 f* u3 S8 }5 O9 s& ?" Y# h7 z
@GIN(X):限制X为整数。
+ t: U8 v5 V- u( w文件输入函数' X9 [( }" I  x8 U9 H9 d8 z
@FILE(filename):当前模型引用其他ASCII码文件中的数据或文本时可以采用此函数。用 ‘~’来隔开数据。
7 |* _# C7 i7 }$ q$ D@OLE(filename,区间):打开excel,输入数据
7 s' X3 \0 t4 b! T# Y  v: b$ j  L) O; I# Y2 Q( ]

# h% x1 {* |; O& }  ^: y0 `3 M/ [. k1 w$ @5 w# j4 G1 F' x/ Q$ n

3 C( A0 _8 ~! L' h$ V; r




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