赞
踩
概念 :Lingo 是一款求解最优化问题的软件,可用于求解非线性规划问题,也可以用于用于一些线性和非线性方程组的求解等,功能强大,是求解优化模型的好选择
tips:lingo对大小写不敏感
5种二元运算符:


开头用感叹号(!),末尾用分号(;),表示注释,可跨多行。
集部分(语句块)以关键字“sets:”开始,以“endsets”结束,中间是各个原始集的名称、成员和属性 。
而当我们要阐释一个群体中所有成员时,则可以采用下面的语法(显示罗列法)逐个罗列出对象
student/stu1, stu2, stu3/: name, age;
这行代码表示学生集合中有三个对象:他们分别是stu1,stu2 和 stu3
而当我们要定义更多的集合对象时,很明显我们不能一个一个的输入对象们的名字——当数据量一大,这实在是不小的工程量。幸运的是 LINGO 提供了隐式罗列法:这也是 LINGO 的特别之处,它定义了 … 运算符,这个运算符可以智能地根据规律来填充我们没有完全写出的集合对象名,我们可以像下面这样使用它——
student/stu1…stu100/: name, age;
例:
model:
sets:
! 原始集;
worker:/worker1..worker3/: efficiency; ! 工人效率;
machine:/machine1..machine3/: quality; ! 机器质量;
product:/product1..product3/: value, cost; ! 产品价值和消耗;
! 派生集
allowed_plan(worker, machine, product): evaluation; ! 对可行方案的评价;
endsets
end
为了定义一个派生集,必须详细声明:
定义派生集语法: setname(parent_set_list)[/member_list/][:attribute_list];
setname : 派生集名。
(parent_set_list) :父集名列表(已定义的),派生集的父集既可以是原始集,也可以是其它的派生集。
/member_list/ :可选,成员名列表,成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。
:attribute_list :可选,集成员属性名列表。
为集指派一些成员并且在 LINGO 求解模型之前为集的某些属性指定值,提供了两个可选部分:输入集成员和数据的数据部分(Data Section)和为决策变量设置初始值的初始部分(Init Section)。
数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定 集成员、集的属性。其语法如下: object_list = value_list;
对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开。
数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属性值的个数必须等于集成员的个数。
例:
set1/A,B,C/: X,Y;
endsets
data:
X=1,2,3;
Y=4,5,6;
enddata
也可采用如下例子中的复合数据声明(data statement)实现同样的功能:
set1/A,B,C/: X,Y;
endsets
data:
X,Y=1 4
2 5
3 6;
enddata
在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数据部分确定时,称之为参数,例:
data:
interest_rate,inflation_rate = .085 .03;
enddata
4.1.3 实时数据处理
在本该放数的地方输入一个问号(?),表示待定值,每一次求解模型时,LINGO都会提示为参数 inflation_rate输入一个值,例如:
data:
interest_rate,inflation_rate = .085 ?;
enddata
在求解目标规划的序贯式算法中会经常用到此语法。除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。
为所有成员的属性指定同一个值:
sets:
days /MO,TU,WE,TH,FR,SA,SU/:needs;
endsets
data:
needs = 20;
enddata
也支持多个属性的情况:
sets:
days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;
endsets
data:
needs cost = 20 100;
enddata
4.1.5 数据部分的未知数值
sets:
years/1..5/: capacity;
endsets
data:
capacity = ,34,20,,;
enddata
属性 capacity 的第 2 个和第 3 个值分别为 34 和 20,其余的未知。
4.2 模型的初始部分
一个初始部分以“init:”开始,以“endinit”结束:
init:
X, Y = 0, .1;
endinit
Y=@log(X);
X^2+Y^2<=1;
在初始部分定义的变量的值仅被 LINGO 求解器当作初始点来用,并且仅仅对非线性模型有用。好的初始点会减少模型的求解时间。

变量界定函数实现对变量取值范围的附加限制,共4种
@STRLEN(string):这个函数返回字符串“string”的长度,如@STRLEN(123)返回值为 3。
@status():返回 LINGO 求解模型结束后的状态:
使用语法
@sum(集合(下标):集合表达式);
代码实例

tip:arc是一个3*3集合(矩阵)
使用语法
@for(集合(下标)[逻辑表达式]:集合表达式);
代码实例

tip:node也是一个矩阵
sets:
S1/A B C/;
S2/X Y Z/;
S3(S1,S2)/A X, A Z, B Y, C X/;
endsets
X=@in(S3,@index(S1,B),@index(S2,Y));
@wrap(index,limit):该函数返回
其中 k 是一个整数,取适当值保证 j 落在区间 [1,limit] 内。该函数在循环、多阶段计划编制中特别有用。
@size(set_name):该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。
集循环函数遍历整个集进行操作。其语法为:
@function 相应于下面罗列的四个集循环函数之一。
setname 是要遍历的集。
set_ index_list 是集索引列表。
conditional_qualifier 是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO 都要对conditional_qualifier 进行评价,若结果为真,则对该成员执行@function 操作,否则跳过,继续执行下一次循环。
expression_list 是被应用到每个集成员的表达式列表,当用的是 @for 函数时,expression_list 可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list 只能有一个表达式。如果省略 set_index_list,那么在 expression_list 中引用的所有属性的类型都是setname 集。
集循环函数具体有:
model:
sets:
number/1..5/:x;
endsets
@for(number(I): x(I)=I^2);
end
model:
data:
N=6;
enddata
sets:
number/1..N/:x;
endsets
data:
x = 5 1 3 4 6 10;
enddata
s=@sum(number(I) | I #le# 5: x);
end
model:
data:
N=6;
enddata
sets:
number/1..N/:x;
endsets
data:
x = 5 1 3 4 6 10;
enddata
minv=@min(number(I) | I #le# 5: x);
maxv=@max(number(I) | I #ge# N-2: x);
end
参考资料:
https://zhuanlan.zhihu.com/p/159487786
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。