Lingo编程简介
很多人会问Lingo是干什么用的?Lingo可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,求解优化模型算法比MATLAB要简单,是求解优化模型的最佳选择。
(一)Lingo编程语言介绍
Lingo模型以model开始以end结束,中间分为集合部分、数据部分、初始化部分、目标与约束部分。
model:sets:!此处输入集合部分内容endsetsdata:!此处输入数据部分内容enddatainit:!此处输入初始化部分内容endinit!此处输入目标与约束部分内容end
(1)集合部分(以sets开始,endsets结束):这部分作用是定义集合
一维集合定义格式:
一维集合名称/集合元素/:属性;例如:set_1/1..10/:x;
多维集合定义格式:
多维集合名称(一维集合名称,一维集合名称,...,一维集合名称):属性;例如:setsset_3(set_1,set_2):z;endsets
二者关系:一维集合可以看做是多维集合的一个维度
eg:定义一个二维数组set_3:
sets:set_1/1..10/:x;set_2/1..10/:y;set_3(set_1,set_2):z;endsets
(2)数据部分(以data开始,enddata结束):该部分是对集合属性输入必要的数值。
例如:data:x=1,2,3,4,5,6,7,8,9,10;enddata注:如果x是多维的,例如x是2x3的,则可以将x的数据按照下示写法,可以更加容易理解:x=1,2,3,4,5,6;
(3)初始化部分(以init开始,endinit结束):该部分的作用是对集合的属性定义初始值。
例如:使用重心法时,需要对位置坐标初始化;init:x=0;y=0;endinit
(4)目标与约束:该部分定义目标函数和约束条件。
(二)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):返回一组数值的最大值
@smin(x1,x2,x3…xn):返回一组数值的最小值
@sqrt(x):返回x的平方根
@sqr(x):返回x的平方
(2)常用的集合函数:
@for(set:expression):该函数是对集合set的每一个元素进行表达式expression表达的约束(起到循环作用)
@max(set:expression):该函数是得到集合set中的每个元素在expression表达式中的最大值
@min(set:expression):该函数是得到集合set中的每个元素在expression表达式中的最小值
@sum(set:expression):该函数是求集合set中每个元素在expression表达式计算后得到的值的和
集合函数用法如下:
集合函数(集合名称|相关条件:表达式)例如: @sum(set_1(i)|i#ge#2#and#i#le#8:x(i)) !是求x中第二个元素到第八个元素的和
注:相关条件中包含逻辑表达式,即有逻辑运算符和关系运算符
逻辑运算符:#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为整数
(4)其他函数用法:
@if函数:用法:@if(表达式,expression_1,expression_2)
说明:如果表达式的值为真,则返回表达式expression_1的值,如果表达式的结果为假,则返回表达式expression_2的值。(常用作于分段函数)
(三)Lingo实例:
注:Lingo不区分字母的大小写
model:sets:set_1/1..5/;set_2/1..5/;set_3(set_1,set_2):x,y;endsetsdata: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;enddatamin=@SUM(set_3(i,j):x(i,j)*y(i,j));@for(set_1(i):@sum(set_2(j):y(i,j))=1);@for(set_2(j):@sum(set_1(i):y(i,j))=1);@for(set_3(i,j):@bin(x(i,j)));END
运行结果: