Lingo基本用法总结(除集函数部分) - 图文

更新时间:2023-10-29 14:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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;

然后点击工具条上的按钮得到如下结果:

即可。

1

所以当x1为250,x2为100时目标函数得到最大值。

? 算术运算符

Lingo中变量不区分大小写,以字母开头不超过32个字符

算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符: ^ 乘方 ﹡ 乘 / 除 ﹢ 加 ﹣ 减 LINGO唯一的一元算术运算符是取反函数“﹣”。 这些运算符的优先级由高到底为:

高 ﹣(取反) ^ ﹡/ 低 ﹢﹣

运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”来改变。

2

例:在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) 返回x的绝对值

@sin(x) 返回x的正弦值,x采用弧度制 @cos(x) 返回x的余弦值 @tan(x) 返回x的正切值 @exp(x) 返回常数e的x次方 @log(x) 返回x的自然对数

@lgm(x) 返回x的gamma函数的自然对数 @sign(x) 如果x<0返回-1;否则,返回1

@floor(x) 返回x的整数部分。当x>=0时,返回不超过x的最大整数;当

x<0时,返回不低于x的最大整数。

最大最小函数:

@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值 @smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值 边界限定函数:

@bin(x) 限制x为0或1 @bnd(L,x,U) 限制L≤x≤U

@free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数 @gin(x) 限制x为整数 辅助函数

1.@if(logical_condition,true_result,false_result)

@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result

在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。

例:求

Minx12?3x2?x1x2?ex3?x1?x2?350??x1?x3?50?2x?x?x?600?123 其中x1只能取0或1;x2为整数

在代码窗口中编写

min=x1^2+3*x2-x1*x2+@exp(x3);

3

x1+x2>=350; x1+x3<50;

2*x1+x2+x3<=600; @bin(x1);@gin(x2);

以上是lingo最基本的用法

? 逻辑运算符

LINGO具有9种逻辑运算符:

#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 这些运算符的优先级由高到低为: 高 #not#

#eq# #ne# #gt# #ge# #lt# #le# 低 #and# #or#

例4.2 逻辑运算符示例

2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。

? 模型求解状态

@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(求解器因在某约束中遇到无定义的算术运算而停止)

通常,如果返回值不是0、4或6时,那么解将不可信,几乎不能用。该函数仅被用在模型的数据部分来输出数据。

4

解窗口说明

例5.1某家具公司制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示:

木料 漆工 木工 成品单价 每个书桌 8单位 4单位 2单位 60单位 每个餐桌 6单位 2单位 1.5单位 30单位 每个椅子 1单位 1.5单位 0.5单位 20单位 现有资源总数 48单位 20单位 8单位 若要求桌子的生产量不超过5件,如何安排三种产品的生产可使利润最大?

用DESKS、TABLES和CHAIRS分别表示三种产品的生产量,建立LP模型。

max=60*desks+30*tables+20*chairs; 8*desks+6*tables+chairs<=48; 4*desks+2*tables+1.5*chairs<=20; 2*desks+1.5*tables+.5*chairs<=8; tables<=5;

求解这个模型,并激活灵敏性分析。这时,查看报告窗口(Reports Window),可以看到如下结果。

“Global optimal solution found at iteration: 3”表示3次迭代后得到全局最优解。 “Objective value:280.0000”表示最优目标值为280。 “Value”给出最优解中各变量的值:造2个书桌(desks), 0个餐桌(tables), 8个椅子(chairs)。所以desks、chairs是基变量(非0),tables是非基变量(0)。 “Slack or Surplus”给出松驰变量的值:

第1行松驰变量 =280(模型第一行表示目标函数,所以第二行对应第一个约束) 第2行松驰变量 =24 第3行松驰变量 =0

5

本文来源:https://www.bwwdw.com/article/4cm2.html

Top