在一个模型中只有约束段是必须的,其他部分包括(标题、model:和end)都是可选的
各个段的位置是任意的,没有先后之分。
MODEL:
TITLE 生产计划;
END
SETS:
ENDSETS
DATA:
ENDDATA
赋值语句统一格式:
DATA:
PIRCE = 2.68;
A B C=8 3.75 6.4;
X,Y,Z=1,2,300;
ENDDATA
给一个向量赋值:
MODEL:
SETS:
ITEM/1..5/:A,B;
ENDSETS
DATA:
A=10 20 30 40 50;
B=2 4 6 8 10;
ENDDATA
END
给同一个集合上的多个向量赋值:
SETS:
ITEM/1..5/:A,B;
ENDSETS
DATA:
A B =
10 2
20 4
30 6
40 8
50 10
ENDDATA
给集合及其属性同时赋值:
在等号左边的对象列表中最多只能有一个是集合,此时对象列表中的其他对象必须是定义在该集合上的属性。
如果模型中的参数在建模时候不确定,希望在求解模型是从键盘输入,那么你可以采用下面的格式:
变量 = ?;
DATA:
RATE = ?;
ENDDATA
只给向量部分分量赋值:
SETS:
ITEM/1..5/:A;
ENDSETS
DATA:
A= 10, , , , ;
ENDDATA
此时一个逗号都不能省略,否则lingo认为给向量输入数据的格式不正确。
未赋值的分量由lingo在求解模型的时候自行确定。
INIT;
ENDINIT
举例demo:
MODEL:
INIT:
X=0.99;
Y=0.06;
ENDINIT
X^2+Y^2<=1;
Y <= @LOG(X);
END
CALC:
ENDCALC
如果在建模时所得到的数据还需要进一步处理才能用于建模,则可以在计算段进行处理
lingo先执行计算段中的语句,再求解模型。
MODEL:
DATA:
X,Y,Z = 8, 2, 5;
ENDDATA
CALC:
AVG = X+Y+Z;
AVG = AVG/3;
ENDCALC
END
举例:
在一个有10个城市的TSP问题中,原始数据只有各城市在地图上的坐标,而模型计算时需要各个城市之间的距离矩阵。这就需要用到计算段来进行处理。
MODEL:
SETS:
CITY/1..10/:U,A,B;
LINK(CITY,CITY):DIST,X;
ENDSETS
DATA:
A B=
1304 2312
3639 1315
4177 1399
3488 1535
3362 1561
6425 5166
9122 6161
6164 2535;
ENDDATA
CALC:
@FOR(CITY(I)):
@FOR(CITY(J):DIST(I,J)=
@SQPT(
@SQR(A(I)-A(J))
+
@SQR(B(I)-B(J)))
)
);
@SUM(ROAD(I,J)|I #EQ# A: X(I,J))=1;
@SUM(ROAD(I,J)|J #EQ# G: X(I,J))=1;
@FOR(CITY(I)|I #NE# A #AND# I #NE# G:
@SUM(ROAD(I,J):X(I,J))=@SUM(ROAD(K,J):X(K,I))
);
@FOR(ROAD: @BIN(X));
END
MODEL:
END
约束段是模型的默认组成部分,没有起始标志,也没有结束标志。
目标函数被lingo看作是一个约束条件
模型可以没有目标函数,遇到这种情况,lingo将会求出满足全部约束条件的可行解,所以可以用来求解方程组。
本小节主要讲了lingo的整体组成,包括标题、集合段、数据段、初始段、计算段、约束段的使用方法以及使用场景。