当前位置:   article > 正文

lingo基础及运用_lingo应用sgn函数

lingo应用sgn函数

lingo基础及运用

概念 :Lingo 是一款求解最优化问题的软件,可用于求解非线性规划问题,也可以用于用于一些线性和非线性方程组的求解等,功能强大,是求解优化模型的好选择

tips:lingo对大小写不敏感

1 基本运算符

1.1 算术运算符

5种二元运算符:

  • ^:乘方
  • *:乘
  • /:除
  • +:加
  • -:减
  1. 唯一1种一元运算符
  • -:取反
  1. 运算符的优先级
    在这里插入图片描述

1.2 逻辑运算符

  • #not#: 否定该操作数的逻辑值,#not#是一个一元运算符
  • #eq#: 若两个运算数相等,则为 true;否则为 flase
  • #ne#: 若两个运算符不相等,则为 true;否则为 flase
  • #gt#: 若左边的运算符严格大于右边的运算符,则为 true;否则为 flase
  • #ge#: 若左边的运算符大于或等于右边的运算符,则为 true;否则为 flase
  • #lt#: 若左边的运算符严格小于右边的运算符,则为 true;否则为 flase
  • #le#: 若左边的运算符小于或等于右边的运算符,则为 true;否则为 flase
  • #and#: 仅当两个参数都为 true 时,结果为 true;否则为 flase
  • #or#: 仅当两个参数都为 false 时,结果为 false;否则为 true 这些运算符的优先级:

在这里插入图片描述

2 注释

开头用感叹号(!),末尾用分号(;),表示注释,可跨多行。

3 Lingo中的集

集部分(语句块)以关键字“sets:”开始,以“endsets”结束,中间是各个原始集的名称、成员和属性 。

  • setname:集名称
  • 可选参数 /member_list/ :集的成员名横向列表(用反斜杠 “/” 开头和结尾,用","或空格分隔各个成员)
  • 可选参数 :attribute_list :及成员属性名列表(冒号 “:” 开头)。

而当我们要阐释一个群体中所有成员时,则可以采用下面的语法(显示罗列法)逐个罗列出对象

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
3.1派生集

为了定义一个派生集,必须详细声明:

  • 集的名字
  • 父集的名字
  • 可选,集成员
  • 可选,集成员的属性

定义派生集语法: setname(parent_set_list)[/member_list/][:attribute_list];

setname : 派生集名。
(parent_set_list) :父集名列表(已定义的),派生集的父集既可以是原始集,也可以是其它的派生集。
/member_list/ :可选,成员名列表,成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。
:attribute_list :可选,集成员属性名列表。

4 模型的数据部分和初始部分

为集指派一些成员并且在 LINGO 求解模型之前为集的某些属性指定值,提供了两个可选部分:输入集成员和数据的数据部分(Data Section)和为决策变量设置初始值的初始部分(Init Section)。

4.1 模型的数据部分
4.1.1 数据部分入门

数据部分以关键字“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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

也可采用如下例子中的复合数据声明(data statement)实现同样的功能:

 set1/A,B,C/: X,Y; 
endsets 
data: 
 X,Y=1 4 
 2 5 
 3 6; 
enddata
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
4.1.2 参数

在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数据部分确定时,称之为参数,例:

data: 
 interest_rate,inflation_rate = .085 .03; 
enddata
  • 1
  • 2
  • 3

4.1.3 实时数据处理
在本该放数的地方输入一个问号(?),表示待定值,每一次求解模型时,LINGO都会提示为参数 inflation_rate输入一个值,例如:

data: 
 interest_rate,inflation_rate = .085 ?; 
enddata
  • 1
  • 2
  • 3

在求解目标规划的序贯式算法中会经常用到此语法。除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。

4.1.4 指定属性为一个值

为所有成员的属性指定同一个值:

sets: 
 days /MO,TU,WE,TH,FR,SA,SU/:needs; 
endsets 
data: 
 needs = 20; 
enddata
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

也支持多个属性的情况:

sets: 
 days /MO,TU,WE,TH,FR,SA,SU/:needs,cost; 
endsets 
data: 
 needs cost = 20 100; 
enddata
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.1.5 数据部分的未知数值

sets: 
 years/1..5/: capacity; 
endsets 
data: 
 capacity = ,34,20,,; 
enddata
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

属性 capacity 的第 2 个和第 3 个值分别为 34 和 20,其余的未知。

4.2 模型的初始部分
一个初始部分以“init:”开始,以“endinit”结束:

init: 
 X, Y = 0, .1; 
endinit 
Y=@log(X); 
X^2+Y^2<=1;
  • 1
  • 2
  • 3
  • 4
  • 5

在初始部分定义的变量的值仅被 LINGO 求解器当作初始点来用,并且仅仅对非线性模型有用。好的初始点会减少模型的求解时间。

5 Lingo中的函数

5.1数学函数

在这里插入图片描述

5.2界定函数

变量界定函数实现对变量取值范围的附加限制,共4种

  • @bin(x) 限制x 为0 或1 — 用于0-1规划
  • @bnd(L,x,U) 限制L≤x≤U
  • @free(x) 取消对变量x 的默认下界为0 的限制,即x 可以取任意实数
  • @gin(x) 限制x 为整数
    在默认情况下,LINGO 规定变量是非负的,也就是说下界为0,上界为+∞。@free 取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可 以取消默认下界为0的约束。
5.3 结果报告函数

@STRLEN(string):这个函数返回字符串“string”的长度,如@STRLEN(123)返回值为 3。
@status():返回 LINGO 求解模型结束后的状态:

  • 0:Global Optimum(全局最优)
  • 1: Infeasible(不可行)
  • 2: Unbounded(无界)
  • 3: Undetermined(不确定)
  • 4: Feasible(可行)
  • 5: Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)
  • 6: Local Optimum(局部最优)
  • 7: Locally Infeasible(局部不可行,尽管可行解可能存在,但是 LINGO 并没有找到一个)
  • 8: Cutoff(目标函数的截断值被达到)
  • 9: Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)
5.4 sum函数和for函数
5.4.1、sum函数

使用语法

@sum(集合(下标):集合表达式);

代码实例
在这里插入图片描述
tip:arc是一个3*3集合(矩阵)

5.4.2、for函数

使用语法

@for(集合(下标)[逻辑表达式]:集合表达式);

代码实例
在这里插入图片描述
tip:node也是一个矩阵

5.5 集操作函数
  • @in(set_name,primitive_index_1 [,primitive_index_2,…]):如果元素在指定集中,返回 1;否则返回 0。
  • @index([set_name,] primitive_set_element):返回在集set_name中原始集成员primitive_set_element的索引。如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。
    例:如何确定集成员(B,Y)属于派生集 S3。
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):该函数返回 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中 k 是一个整数,取适当值保证 j 落在区间 [1,limit] 内。该函数在循环、多阶段计划编制中特别有用。
@size(set_name):该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。

5.6 集循环函数

集循环函数遍历整个集进行操作。其语法为:

  • @function(setname[(set_index_list[|conditional_qualifier]]:expression_list);

@function 相应于下面罗列的四个集循环函数之一。

setname 是要遍历的集。

set_ index_list 是集索引列表。

conditional_qualifier 是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO 都要对conditional_qualifier 进行评价,若结果为真,则对该成员执行@function 操作,否则跳过,继续执行下一次循环。
expression_list 是被应用到每个集成员的表达式列表,当用的是 @for 函数时,expression_list 可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list 只能有一个表达式。如果省略 set_index_list,那么在 expression_list 中引用的所有属性的类型都是setname 集。
集循环函数具体有:

  • @for:用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过 @for 函数允许只输入一个约束,然后 LINGO 自动产生每个集成员的约束。
    例:产生序列{1,4,9,16,25}.
model: 
sets: 
 number/1..5/:x; 
endsets 
 @for(number(I): x(I)=I^2); 
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • @sum :返回遍历指定的集成员的一个表达式的和。
    例:求向量[5,1,3,4,6,10]前 5 个数的和。
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • @min 和@max :返回指定的集成员的一个表达式的最小值或最大值。
    例:求向量[5,1,3,4,6,10]前 5 个数的最小值,后 3 个数的最大值。
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

参考资料:
https://zhuanlan.zhihu.com/p/159487786

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55647?site
推荐阅读
相关标签
  

闽ICP备14008679号