lingo真的是非常的银杏化,程序和语法结构简单,通过它我们可以解决大部分的规划类型的优化问题。
一.LINGO使用介绍
1.1 LINGO编写格式
LINGO模型以MODEL开始,以END结束.中间为语句,分为四大部分。不区分大小写。
(1)集合部分:定义决策变量
sets:
集合名称1/成员列表1/:属性1_1,属性1_2,…,属性1_n1;
集合名称2/成员列表2/:属性2_1,属性2_2,…,属性2_n2;
派生集合名称(集合名称1,集合名称2):属性3_1,…,属性3_n3;
endsets
Person/1..10/:A;
Task/1..12/:B;
Link(Person,Task):X;
上面的属性可以看成是集合下包含的元素(成员),派生集合意思是矩阵,比如上面的那个就是10行12列矩阵
(2) 目标与约束:这部分定义了目标函数、约束条件等。 一般要用到 LINGO的内部函数。求解优化问题时,该部分是必须的
(3)数据部分(DATA):这部分以“DATA: ”开始,以“END DATA” 结束。其作用在于对集合的属性(数组)输入必要的数值
(4)初始化部分(INIT):这部分以“INIT: ”开始,以“END INIT”结 束。作用在于对集合的属性(数组)定义初值.格式为: attribute=value_list
注意事项:
1.Lingo中模型以“MODEL:”开始,以“END”结束,对于简单的模型,这两个语句都可以省略
2.Lingo中每行后面均增加了一个分号“;”
3.所有符号都需在英文状态下输入
4.min=函数、max=函数,表示求函数的最小、最大值
5.Lingo中变量不区分大小写,变量名可以超过8个,但不能超过32个,需以字母开头
6.用Lingo解优化模型时已假定所有变量非负,如果想解除这个限制可以用函数@free(x),这样x可以取到任意实数
7.变量可以放在约束条件右端,同时数字也可以放在约束条件左边
8.Lingo模型语句由一系列语句组成,每一个语句都必须以“;结尾
9.Lingo中以“!”开始的是说明语句,说明语句也以“;” 结束
10.Lingo中数据部分不能使用分式,例如数据部分不能使用1/3
11.Lingo中矩阵数据是逐行存储的,Matlab中数据是逐列存储的
是不是一头雾水看不懂,没事先往下看。
1.2 LINGO内部函数使用详解
LINGO建立优化模型时可以引用大量内部函数, 这些函数以“@”符号打头.
(1)常用数学函数
常用数学函数 | 功能 |
@abs(x) | 返回变量X的绝对数值 |
@cos(x) | 返回X的余弦值,X的单位为弧度 |
@exp(x) | 返回指数函数值,其中e=2.72828… |
@floor(x) | 向0靠近返回x的整数部分 |
@lgm(x) | 返回Γ函数的自然对数值 |
@log(x) | 返回变量x的自然对数值 |
@sgn(x) | 返回变量X的符号值,当x<0时为-1, 当x>0时为1 |
@sin(x) | 返回x的正弦值,x的单位为弧度 |
@smax(x1,x2,...,xn) | 返回一列值x1, x2,..., xn的最大值 |
@smin(x1,x2,...,xn) | 返回一列值x1, x2,..., xn的最小值 |
@tan(x) | 返回x的正切值,x的单位为弧度 |
(2)集合函数
集合函数的用法如下: set_operator (set_name|condition:expression) 其中set_operator是集合函数名,set_name是数据集合名,expression 部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略)。逻辑表达式中可以三种逻辑算符#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)变量界定函数 变量函数对变量的取值范围附加限制,共有四种.
@bnd(L,x,U) | 限制L≤x≤U |
@bin(x) | 限制x为0或1 |
@free(x) | 取消对x的符号限制(可取任意实数值) |
@gin(x) | 限制x为整数值 |
二、LINGO求解优化模型实例
1.01规划
model:
sets:
people/1..4/;
task/1..4/;
assign(people,task):a,x;
endsets
data:
a=1100,800,1000,700,
600,500,300,800,
400,800,1000,900,
1100,1000,500,700;
enddata
min=@sum(assign(i,j):a(i,j)*x(i,j));
@for(task(j):@sum(people(i):x(i,j))=1);
@for(people(i):@sum(task(j):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
end
2.整数规划
model:
sets:
product/1..3/:x,y;
endsets
max=3*x(1)+4*x(2)+8*x(3)-100*y(1)-150*y(2)-200*y(3);
2*x(1)+4*x(2)+8*x(3)<=500;
2*x(1)+3*x(2)+4*x(3)<=300;
x(1)+2*x(2)+3*x(3)<=100;
3*x(1)+5*x(2)+7*x(3)<=700;
@for(product:x<=150*y);
@for(product:@gin(x));
@for(product:@bin(y));
end
x1与x(1)变量是不一样的,使用for语句会使上面的变量与下面的变量不一致,所以还不如分式直接列出。
按下solve键后会弹出两个窗口
上面圈出的表示代码运行的时间,几乎是在瞬间完成,这足以体现lingo内部程序的强大。
了解以上后,我们学习其他的规划模型问题就比较容易了。