你想看完一篇文章就学会Lingo吗?在这篇文章中可以让你做到
Lingo编程简介
很多人会问Lingo是干什么用的?Lingo可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,求解优化模型算法比MATLAB要简单,是求解优化模型的最佳选择。
(一)Lingo编程语言介绍
Lingo模型以MODEL开始以END结束,中间分为集合部分(SETS)、目标与约束部分、数据部分(DATA)、初始化部分(INIT)。
MODEL:
SETS:
!此处输入集合部分内容
ENDSETS
DATA:
!此处输入数据部分内容
ENDDATA
INIT:
!此处输入初始化部分内容
ENDINIT
!此处输入目标与约束部分内容
END
(1)集合部分(以SETS开始,ENDSETS结束):这部分作用是定义变量,Lingo中集合分为两类,一种是原始集合,另一种是导出集合。
原始集合定义格式:
SETNAME/member/:attribute,attrubute,atc;
导出集合定义格式:
SETSNAME(set1,set2,etc):attribute,attribute,atc;
!set1表示的是所对应原始集合的名字
二者关系:如果在程序中需要定义多维数组则需要定义导出集合,原始集合可以看做是导出集合的一个维度
eg:定义一个二维数组mark:
person/1..5/:a;
test/1..5/:b;
mark(person,test):x;
(2)目标与约束:该部分定义目标函数和约束条件。
(3)数据部分(以DATA开始,ENDDATA结束):该部分是对集合属性输入必要的数值。
attrubute=1,2,3,4,5;
(4)初始化部分(以INIT开始,ENDINIT结束):该部分的作用是对集合的属性定义初始值。
attrubute=1,2,3,4,5;
(二)Lingo常用的内部函数介绍
(1)常用的数学函数:
@ABS(X):返回变量X的绝对值
@COS(X):返回变量X的余弦值,X为弧度
@SIN(X):返回变量X的正弦值,X为弧度
@TAN(X):返回变量X的正切值,X为弧度
@EXP(X):返回变量X的指数函数值
@SMAX(X1,X2,X3…XN):返回一组数值的最大值
@SMIX(X1,X2,X3…XN):返回一组数值的最小值
@SIGN(X):返回变量X的符号值
@LOG(X):返回变量X的自然对数
(2)常用的集合函数:
@FOR(setname:expression):对集合setname的每一个元素产生expression描述的约束
@MAX(setname:expression):返回集合中的每个元素在expression表达式中的最大值
@MIN(setname:expression):返回集合中的每个元素在expression表达式中的最小值
@SUM(setname:expression):返回expression表达式对集合中每个元素作用后的和
集合函数用法如下:
function_name(setname|condition:expression)
function:函数名
setname:集合名
|condition:条件
expression:表达式
注:条件中包含逻辑表达式,即有逻辑运算符和关系运算符
逻辑运算符:#AND#(与)、#OR#(或)、#NOT#(非)
关系运算符:#EQ#(等于)、#NE#(不等于)、#GT#(大于)、#GE#(大于等于)、#LT#(小于)、#LE#(小于等于)
(3)常见的对变量取值范围增加限定的函数
@BND(A,X,B):限定变量X的范围为:A<=X<=B
@BIN(X):限定变量X是0或1,常用于0,1规划中
@GIN(X):限定变量X为整数
(三)Lingo实例:
注:Lingo不区分字母的大小写
MODEL:
SETS:
person/1..5/;
test/1..5/;
mark(person,test):x,y;
ENDSETS
DATA:
x=85,96,53,63,78,
96,100,56,47,81,
59,32,99,77,75,
92,80,76,55,95,
80,42,36,96,50;
ENDDATA
min=@SUM(mark:x*y);
@FOR(person(i):@sum(test(j):y(i,j))=1);
@FOR(test(j):@sum(person(i):y(i,j))=1);
@FOR(mark(i,j):@BIN(x(i,j)));
END
运行结果: