lingo基础入门Day 9
文章目录
lingo模型的构成
用lingo可以写两种模型:
- 简单模型
- 基于集合的专业模型
多数专业模型由三段构成:
- 结合定义段,简称集合段
- 数据定义段,简称数据段
- 目标函数与约束条件段,简称约束段
完整的专业模型构成
在一个模型中只有约束段是必须的,其他部分包括(标题、model:和end)都是可选的
各个段的位置是任意的,没有先后之分。
标题
语法格式:
MODEL:
TITLE 生产计划;
END
- 标题没有固定的位置,可以输入约束条件的地方都可以输入标题。
- 一般将标题放在第二行
- 模型的标题必须以关键字title开始,以分号结束
- title和分号之间的所以文字都被看做是模型的标题。
集合段
语法格式:
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的整体组成,包括标题、集合段、数据段、初始段、计算段、约束段的使用方法以及使用场景。