1.LINGO模型以MODEL开始,以END结束;中间为语句,分为四大部分.
①.集合部分(SETS)
这部分以"SETS:"开始,以"END SETS"结束
作用:定义必要的变量,便于后面进行编程与计算,在LINGO中称为集合(SET)及其元素和属性。
分为两类:
a.原始集合
定义为:SETNAME/member list(or 1…n)/:attribute,attribute,etc
b.导出集合(引用其它集合定义的集合)
定义为:SETNAME(set1,set2,etc):attribute,attribute,etc
如:
Person/1..10/:A;
Task/1..12/:B;
Link(Person,Task):X
②.目标与约束
这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数。
求解优化问题时,该部分是必须的。
③.数据部分(DATA)
这部分以“DATA:”开始,以“END DATA:”结束。
其作用是对集合的属性(数组)输入必要的数值
④.初始化部分(INIT)
这部分以“INIT:“开始,以“END INIT:”结束
作用在于对集合的属性(数组)定义初值
2.编写LINGO注意事项
a. 所有的语句除"MODEL、END、SETS、ENDSETS、DATA、ENDDATA 、 INIT、ENDINIT "外,必须以一个;结尾
b.LINGO求解非线性规划时已约定各变量非负
3.LINGO内部函数使用
LINGO建立优化模型时可以引用大量内部函数,这些函数以**@**符号开头
3.1 常用数学函数
@ABS(X) 返回变量X的绝对数值.
@SIN( X) 返回X的正弦值,X的单位为弧度
@COS(X) 返回X的余弦值,X的单位为弧度
@TAN( X)返回X的正切值,X的单位为弧度
@EXP(X)返回指数函数值,其中e=2.72828…
@LOG( X) 返回变量X的自然对数值
@FLOOR(X)向0靠近返回X的整数部分.
@LGM( X) 返回Γ函数的自然对数值.
@SIGN( X) 返回变量X的符号值,当X<0时为-1;当X>0时为1.
@SMAX( X1, X2,…, XN)返回一列值X1, X2,…, XN的最大值.
@SMIN( X1, X2,…, XN)返回一列值X1, X2,…, XN的最小值.
3.2集合函数
用法如下:
set_operator (set_name|condition:expression)
其中set_operator是集合函数名,
set_name是数据集合名,
|condition部分是条件,用逻辑表达式描述(无条件时可省略)
expression部分是表达式
逻辑表达式中可以三种逻辑算符#AND#(与),#OR#(或),#NOT#(非)
和六种关系算符
#EQ#(等于),#NE#(不等于),#GT#(大于),
#GE#(大于等于),#LT#(小于),#LE#(小于等于)。
常见的集合函数如下:
常见的集合函数如下:
@FOR (set_name:constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达(constraint_expressions)描述.
@MAX(set_name:expression)返回集合上表达式(expression)的最大值.
@MIN(set_name:expression)返回集合上的表达式(expression)最小值.
@SUM(set_name:expression)返回集合上的表达式(expression)的和.
@SIZE(set_name)返回数据集set_name中包含元素的个数.
@IN(set_name,set_element)如果数据集set_name中包含元素set_element则返回1,否则返回0.
3.3 变量界定函数
变量函数对变量的取值范围附加限制,共有四种.
@BND(L,X,U)限制L≤X≤U
@BIN(X)限制X为0或1.
@FREE(X)取消对X的符号限制(可取任意实数值).
@GIN(X)限制X为整数值.
示例
采用数据文件方式程序:
model:
sets:
person/1…4/;
task/1…4/;
assign(person,task):a,x;
endsets
data:
a=@file(data.txt);
enddata
min=@sum(assign:a*x);
@for(person(i):@sum(task(j):x(i,j))=1);
@for(task(j):@sum(person(i):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
end
同时在LINGO目录下建立文本文件
data.txt,数据如下:
1100,800,1000,700
600,500,300,800
400,800,1000,900
1100,1000,500,700