Lingo基本用法
00 分钟
2024-7-28

基础用法

  1. 以”model:“开始,最后以“end”结束(也可以省略不写)
  1. 字母不区分大小写
  1. 每个语句都必须以分号“;”结束(注意是英文的分号)
  1. Lingo已经规定所有的决策变量均为非负
  1. 模型中符号≤、≥用“< =、”> =”形式输入,他们与“<”、”>”等效
例:
输入模型中第一行为目标函数,[milk]、[time]、[cpct]是为了对各约束条件命名,便于从输出结果中查找相应信息(也可以不对约束条件命名,此时Lingo会自动用数字按顺序对约束条件命名)。
  • 将文件存储并命名后,选择菜单”LINGO|Solve”执行,即可得到如下输出:
notion image

经济学相关名词分析

(1)三个约束条件的右端不妨看成3种资源:原料、劳动时间、甲类设备的加工能力。
💀
Slack or Surplus给出这三种资源在最优解下是否有盈余。[Time]、[MILK]均为0,表明原料、劳动时间已用完,而甲类设备的能力有余,一般称资源剩余为0的约束为紧约束(有效约束)。
(2)目标函数可以看作“效益”,成为紧约束的资源一旦增加,“效益”必然跟着增长。Dual Price给出这三种资源在最优解下“资源”增加一个单位时“效益”的增量:原料[MILK]增加一个单位(一桶牛奶)时利润增长48元……而增加非紧约束[CPCT]甲类设备的能力显然不会使利润增长。这里,“效益”的增量可以看作“资源”的潜在价值,经济学上称为影子价格,即一桶牛奶的影子价格为48元……
(3)目标函数的系数发生变化时(假定约束条件不变),最优解、最优值不一定发生变化。对目标函数系数变化的影响的讨论,通常称为对目标函数系数的敏感性分析。选择“LINGO|Options”菜单,在弹出的选项卡中选择“General Solver”,然后找到选项“Dual Computations”,在下拉框中选中“Prices&Ranges”,应用或保存设置,重新运行”LINGO|Solve“,然后选择”LINGO|Ranges“菜单,则得到以下输出:
notion image
“Current Coefficient”(当前系数)对应的“Allowable Increase”和“Allowable Decrease”给出了最优解不变条件下目标函数系数允许变化的范围:的系数为(72-8,72+24),即(64,96);的系数为(64-16,64+8),即(48,72)。注意:系数的允许变化范围需要系数64不变,反之亦然。
(4)对”资源“的影子价格作进一步分析。
影子价格的作用(即在最优解下(等式右端)”资源“增加一个单位时”效益“的增量(注意跟原等式的区别,因为有的是通分之后写的式子))是有限制的。这种对影子价格在什么条件下才有意义的讨论,通常称为对资源约束右端项的敏感性分析。上面输出的”Current RHS“(当前右端项)对应的”Allowable Increase“和”Allowable Decrease”给出了影子价格有意义条件下约束右端项的限制范围;原料[MILK]最多增加10桶牛奶,劳动时间[TIME]最多增加53.3 h.
需要注意的是:一般条件下LINGO给出的敏感性分析结果只是充分条件,如上述“最多增加10桶牛奶”应理解为“增加10桶牛奶”一定是有利可图的,但不意味着“增加10桶以上的牛奶”一定不是有利可图的(对最大可增加的劳动时间也应该类似的理解)只是此时无法通过敏感性分析直接得出结论,而需要重新求解新的模型进行判断。(同样,对目标函数系数给出的敏感性分析结果也只是充分条件)。

运算符

逻辑运算符

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

关系运算符

在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。
LINGO有三种关系运算符:“=”、“<=”和“>=”。LINGO中还能用“<”表示小于等于关系,“>”表示大于等于关系。LINGO 并不支持严格小于和严格大于关系运算符。

数学函数

  • LINGO提供了大量的标准数学函数
  1. @abs(x) 返回x 的绝对值
  1. @sin(x) 返回x 的正弦值,x 采用弧度制
  1. @cos(x) 返回x 的余弦值
  1. @tan(x) 返回x 的正切值
  1. @exp(x) 返回常数e 的x 次方
  1. @log(x) 返回x 的自然对数
  1. @lgm(x) 返回x 的gamma 函数的自然对数
  1. @sign(x) 如果x<0 返回-1;否则,返回1
  1. @floor(x) 返回x的整数部分。当x>=0 时,返回不超过x 的最大整数;当x<0
  1. 时,返回不低于x 的最大整数。
  1. @smax(x1,x2,…,xn) 返回x1,x2,…,xn 中的最大值
  1. @smin(x1,x2,…,xn) 返回x1,x2,…,xn 中的最小值

变量界定函数

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

集循环函数

其语法为

@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集。

1.@for

该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束。@for函数允许只输入一个约束,然后LINGO 自动产生每个集成员的约束。

2.@sum

该函数返回遍历指定的集成员的一个表达式的和。

3.@min和@max

返回指定的集成员的一个表达式的最小值或最大值。

辅助函数

1.@if(logical_condition,true_result,false_result)
@if 函数将评价一个逻辑表达式logical_condition,如果为真返回true_ result,否则返回false_result。2.@warn(’text’,logical_condition)
如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框。

其他函数

@gin(x)函数可使x取整数
@bin(x)函数是0-1变量的限定语句
 
上一篇
海明校验的公式推导及讨论
下一篇
数学建模のwiki

评论
Loading...