Lingo 基本用法总结(除集函数部分)
LINGO 是用来求解线性和非线性优化问题的简易工具。Lingo 免费版可以支
持 30 个未知数,lingo 破解版可以支持几万个未知数、几万个约束条件。
当你在 windows 下开始运行 LINGO 系统时,会得到类似下面的一个窗口:
外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都
都要在该窗口内编码实现。下面举两个例子。
例1.1 如何在LINGO中求解如下的LP问题:
在模型窗口中输入如下代码:
min=2*x1+3*x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;
然后点击工具条上的按钮
即可。
得到如下结果:
所以当 x1 为 250,x2 为 100 时目标函数得到最大值。
算术运算符
Lingo 中变量不区分大小写,以字母开头不超过 32 个字符
算术运算符是针对数值进行操作的。LINGO 提供了 5 种二元运算符:
^ 乘方
﹡ 乘 / 除 ﹢ 加 ﹣ 减
LINGO 唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:
高 ﹣(取反)
^
﹡/
低 ﹢﹣
运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”
来改变。
例:在 x1+x2>=350,x1>=100,2*x1+x2<=600 的条件下求 2*x1+3*x2 的最小值
在代码窗口中编写
min=2*x1+3*x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;
然后单击上面菜单 lingo 菜单下 solve 键即可。
数学函数
标准数学函数:
@abs(x)
@sin(x)
@cos(x)
@tan(x)
@exp(x)
@log(x)
@lgm(x)
@sign(x)
@floor(x)
返回 x 的绝对值
返回 x 的正弦值,x 采用弧度制
返回 x 的余弦值
返回 x 的正切值
返回常数 e 的 x 次方
返回 x 的自然对数
返回 x 的 gamma 函数的自然对数
如果 x<0 返回-1;否则,返回 1
返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当
x<0 时,返回不低于 x 的最大整数。
最大最小函数:
@smax(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最大值
@smin(x1,x2,…,xn) 返回 x1,x2,…,xn 中的最小值
边界限定函数:
@bin(x)
@bnd(L,x,U)
@free(x)
@gin(x)
辅助函数
限制 x 为 0 或 1
限制 L≤x≤U
取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数
限制 x 为整数
1.@if(logical_condition,true_result,false_result)
@if 函数将评价一个逻辑表达式 logical_condition,如果为真,返回 true_ result,
否则返回 false_result
在默认情况下,LINGO 规定变量是非负的,也就是说下界为 0,上界为+∞。@free 取消
了默认的下界为 0 的限制,使变量也可以取负值。@bnd 用于设定一个变量的上下界,它也可
以取消默认下界为 0 的约束。
例:求x1^2+3*x2-x1*x2+e^x3在 x1+x2>=350;x1+x3<50;2*x1+x2+x3<=600;x1只能取0
或1;x2为整数的条件下的最小值。
在代码窗口中编写
min=x1^2+3*x2-x1*x2+@exp(x3);
x1+x2>=350;
x1+x3<50;
2*x1+x2+x3<=600;
@bin(x1);@gin(x2);
以上是 lingo 最基本的用法
逻辑运算符
LINGO 具有9种逻辑运算符:
若两个运算数相等,则为 true;否则为 flase
若两个运算符不相等,则为 true;否则为 flase
若左边的运算符严格大于右边的运算符,则为 true;否则为 flase
若左边的运算符大于或等于右边的运算符,则为 true;否则为 flase
若左边的运算符严格小于右边的运算符,则为 true;否则为 flase
若左边的运算符小于或等于右边的运算符,则为 true;否则为 flase
#not# 否定该操作数的逻辑值,#not#是一个一元运算符
#eq#
#ne#
#gt#
#ge#
#lt#
#le#
#and# 仅当两个参数都为 true 时,结果为 true;否则为 flase
#or#
这些运算符的优先级由高到低为:
高 #not#
仅当两个参数都为 false 时,结果为 false;否则为 true
#eq# #ne#
#gt# #ge#
#lt# #le#
低 #and#
#or#
例 4.2 逻辑运算符示例
2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。
模型求解状态
@status()
返回 LINGO 求解模型结束后的状态:
0
1
2
3
4
5
Global Optimum(全局最优)
Infeasible(不可行)
Unbounded(无界)
Undetermined(不确定)
Feasible(可行)
Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确
定模型究竟是不可行还是无界)
6
7
Local Optimum(局部最优)
Locally Infeasible(局部不可行,尽管可行解可能存在,但是 LINGO 并没有找到
一个)
Cutoff(目标函数的截断值被达到)
Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)
8
9
通常,如果返回值不是 0、4 或 6 时,那么解将不可信,几乎不能用。该函数仅被用在
模型的数据部分来输出数据。