数学建模比赛——LINGO软件学习

458 阅读4分钟

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个集循环函数

  1. @FOR:对集合setname的每个元素独立的生成表达式,表达式由expression_list描述(通常是优化问题的约束)
  2. @SUM:返回setname上的表达式的和
  3. @MAX:返回setname上的表达式的最大值
  4. @MIN:返回setname上的表达式的最小值
  5. @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的约束

文件输入输出函数