LINGO(Linear Interactive General Optimizer 线性交互式通用优化器) 优化软件
优化模型的种类
lingo能够求解的优化模型的种类
lingo语法
x1>=0;
x2>=0;
x3>=0;
x4>=0;
x5>=0;
x6>=0;
x7>=0;
x8>=0;
集合(定义集合应该由sets:开始endsets结束)
集分为原始集和派生集两种。
原始集合
setname[/member_list/][:attribute_list];
注意:用“[ ]”表示该部分内容可选。
Setname是选择用来的来标记集的名字,最好具有较强的可读性。
集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32 个字符的字符串,且不区分大小写。该命名规则同样适用于**集成员名和属性名等的命名 **。
(Member_list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。)
① 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。
② 当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:
sets:
num_i/1..6/:b,x,y,z;
endsets
派生集合
派生集合是什么?
!上图中的links集合就是一个派生集合,对于这个例题,还可以进行下列集的定义: ;
sets:
product/1 2 3/;
machine/1 2/;
links(product,machine):a;
endsets
! 该方法可读性差,不建议使用;
派生集合赋值
b1~b10分别等于10个数字,如何赋值
sets:
ss/1..10/:b;
endsets
data: ! 数据段;
b=1 0 1 2 3 5 2 6 1 2;
enddata
! 表示 b1=1,b2=0,b3=1,b4=2,b5=3,b6=5,b7=2,b8=6,b9=1,b10=2;
lingo 中使用派生集合赋值的时候数据部分如何处理?
输入集成员(sets:... ... endsets)和数据的数据部分(data:... ...enddata)
数据部分可以指定成员、集的属性:object_list = value_list;
-
初始部分中可以输入初始声明(initialization statement)类似数据声明的写法,仅仅对非线性模型有用,lingo求解器可以自由改变初始部分初始化的变量值。init: ... ... endinit -
好的初始点会减少模型的求解时间
lingo函数
| 代码 | 含义 |
|---|---|
| 算术运算符 | |
| + | 加法 |
| - | 减法or取反or负号 |
| * | 乘法 |
| / | 除法 |
| 乘幂 | |
| 逻辑运算符(1-3逻辑值之间运算 4-9数之间比较 结果均为逻辑值) | |
| #AND# | 与 |
| #OR# | 或 |
| #NOT# | 非 |
| #EQ# | = equal |
| #NE# | ≠ not equal |
| #GT# | > greater than |
| #GE# | ≥ greater and equal |
| #LT# | < little than |
| #LE# | ≤ little and equal |
| 关系运算符 (用于表示优化模型的约束条件)此处并无严格大(小)于 | |
| < | <= |
| = | = |
| >= | |
| 运算符优先级 | |
| #NOT# -(负号) | 1 |
^ | 2 |
*``/ | 3 |
+``- | 4 |
| #EQ# #NE# #GT# #GE# #LT# #LE# | 5 |
| #AND# #OR# | 6 |
| < = > | 7 |
基本数学函数
| 函数 | 返回 |
|---|---|
@ABS(x) | 绝对值 |
@COS(x) | 余弦值(x为弧度) |
@EXP(x) | e^x的值(e=2.718281...) |
@FLOOR(x) | 向靠近0方向对x取整并返回 |
@LGM(x) | x的伽马函数的自然对数值。x为整数LGM(x)=LOG(x-1);x不为整数,线性插值结果 |
@LOG(x) | x的自然对数值 |
@MOD(x,y) | x对y取模的结果,x除以y的余数(此处x,y都是整数) |
@POW(x,y) | x^y |
@SIGN(x) | x的符号值,x<0返回-1;否则返回+1 |
@SIN(x) | sin(x) x是弧度值 |
@SMAX(list) | 一列数list中的最大值 |
@SMIN(list) | 一列数list中的最小值 |
@SQR(x) | x^2 |
@SQRT(x) | x^0.5 |
@TAN(x) | tan(x) x为弧度值 |
集循环函数
- 遍历整个集合进行操作的函数,语法如下:
@function(setname[set_index_list[|conditional_qualifier]]:expression_list);
@function 是四个集循环函数名之一;
setname要遍历的集;
set_index_list集索引列表,省略该部分时,在expression_list中引用的所有属性类型都是setnam集;
conditional_qualifier限制集循环范围,集循环函数遍历集合每个成员时,lingo会对conditional_qualifier判断是否要对当前的成员进行@function 操作;
expression_list应用于每个集成员的表达式列表,@for函数应用时该部分可以包含多个表达式(应用逗号分隔),其他集循环函数的此部分只能有一个表达式。
4个集循环函数
@FOR:对集合setname的每个元素独立的生成表达式,表达式由expression_list描述(通常是优化问题的约束)@SUM:返回setname上的表达式的和@MAX:返回setname上的表达式的最大值@MIN:返回setname上的表达式的最小值@PROD:返回setname上的表达式的积
集合操作函数
变量界定函数
| 代码 | 含义 |
|---|---|
@BND(L,X,U) | 限制 L<=X<=U |
@BIN(X) | 限制X=0 or 1 |
@FREE(X) | 取消对X的符号限制(X可以取正数、负数、0) |
@GIN(X) | 限制X为整数 |
在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。 @free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一 个变量的上下界,它也可以取消默认下界为0的约束