lingo入门

1.lingo快速入门

1.1lingo优势

LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。

其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括 0-1 整数规划),方便灵活,而且执行速度非常快。

1.2lingo软件基本介绍

工具栏:

在这里插入图片描述

1.2.1 文件格式

“LG4”表示LINGO 格式的模型文件,是一种特殊的二进制格式文件,保存了我们在模型窗口中所能够看到的所有文本和其他对象及其格式信息,只有LINGO 能读出它用其他系统打开这种文件时会出现乱码。

“LNG”表示LINGO文本文件,以这个格式保存模型时系统 将给出警告,因为模型中的格式信息(如字体、颜色等)将会丢失。

“LDT”表示数据文件

“LTF”表示命令脚本文件

“LGR”表示报告文件

在这里插入图片描述

1.2.2 运行状态窗口介绍

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开启敏感性分析

LINGO不询问是否进行敏感性分析,敏感性分析需要将来通过修改系统选项启动敏感性分析后,再调用“REPORT|RANGE”菜单命令来实现。现在同样可以把模型和结果报告保存在文件中。

1.打开solver中的options选项

在这里插入图片描述

2.找到options中General Solver 将默认的改为Prices & Ranges 别忘记应用

在这里插入图片描述

3.写好代码后,按Ctrl + r 即可

1.3lingo基本用法与注意事项

  • 变量和行名可以超过8个字符, 但不能超过32个,且必须以字母开头
  • 模型以max=(或min=)开始表示目标函数
  • 系数与变量之间的运算符(*)不能省略
  • 每行用;表示结束
  • lingo已假定各变量非负(除非用函数@free等另行说明)
  • 变量可以放在约束条件的右端(同时数字也可以放在约束条件左端)
  • lingo有三种关系运算符:“=”,“<=”,“>=” lingo中还能用**"<“表示小于等于关系,”>"表示大于等于关系**。lingo并不支持严格小于和严格大于关系运算符
  • lingo中函数一律需要以"@"开头
  • 以感叹号开始的是说明语句(说明语句也需要以分号结束)

1.4 函数使用

1.4.1 边界限定函数
函数作用
@bin(x)限制x为0或1
@bnd(L,x,U)限制L<= x <= U
@free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数
@gin(x)限制x为整数
1.4.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#仅当两个参数都为flase时,结果为flase;否则为true
1.4.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(求解器因在某约束中遇到无定义的算术运算而停止)

1.4.4 数学函数
函数用法
@ABS(X)绝对值函数,返回X的绝对值。
@COS(X)余弦函数,返回X的余弦值(X的单位是弧度)
@EXP(X)指数函数,返回ex
@FLOOR(X)取整函数,返回X的整数部分(向最靠近0的方向取整)。
@LGM(X)返回X的伽玛(gamma)函数的自然对数值(当X为整数时LGM(X) = LOG(X-1)!;当X不为整数时,采用线性插值得到结果)。
@LOG(X)自然对数函数,返回X的自然对数值。
@MOD(X,Y)模函数,返回X对Y取模的结果,即X除以Y的余数,这里X和Y应该是整数
@POW(X,Y)指数函数,返回XY的值
@SIGN(X)符号函数,返回X的符号值(X < 0时返回-1, X >= 0时返回+1)
@SMAX(list)最大值函数,返回一列数(list)的最大值
@SMIN(list)最小值函数,返回一列数(list)的最小值。
@SQR(X)平方函数,返回X的平方(即X*X)的值
1.4.5 集合循环函数
函数作用
@FOR(集合元素的循环函数)对集合setname的每个元素独立地生成表达式,表达式由expression_list描述(通常是优化问题的约束)。
@MAX(集合属性的最大值函数)返回集合setname上的表达式的最大值。
@MIN(集合属性的最小值函数)返回集合setname上的表达式的最小值。
@PROD(集合属性的乘积函数)返回集合setname上的表达式的积。
@SUM(集合属性的求和函数)返回集合setname上的表达式的和
1.4.6 集合操作函数

1.@INDEX( [set_name,] primitive_set_element)

给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号)。省略set_name,LINGO按模型中定义的集合顺序找到第一个含有该元素的集合,并返回索引值。如果没有找到该元素,则出错。

例:

注: Set_name的索引值是正整数且只能位于1和元素个数之间。例:定义一个女孩姓名集合(GIRLS)和男孩姓名集合(BOYS) :
SETS:
GIRLS /DEBBIE, SUE, ALICE/;
BOYS /BOB, JOE, SUE, FRED/;
ENDSETS
都有SUE, GIRLS在BOYS前定义,调用**@INDEX(SUE)将返2,相当于@INDEX(GIRLS,SUE)** 。要找男孩中名为SUE的小孩的索引,应该使用**@INDEX(BOYS, SUE)**,返3。

2.@IN( set_name, primitive_index_1 [, primitive_index_2 …])

判断一个集合中是否含有某个索引值。如果集合set_name中包含由索引primitive_index_1 [, primitive_index_2 …]所对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”)索引用“&1”、“&2”或@INDEX函数等形式给出,这里“&1”表示对应于第1个父集合的元素的索引值,“&2”表示对应于第2个父集合的元素的索引值。

例:定义一个集合STUDENTS(基本集合),派生出集合PASSED和FAILED,定义:
SETS:
STUDENTS / ZHAO, QIAN, SUN, LI/:;
PASSED( STUDENTS) /QIAN,SUN/:;
FAILED( STUDENTS) | #NOT# @IN( PASSED, &1):;
ENDSETS

如果集合C是由集合A,B派生的,例如:
SETS:
A / 1…3/:;
B / X Y Z/:;
C( A, B) / 1,X 1,Z 2,Y 3,X/:;
ENDSETS
判断C中是否包含元素(2,Y),则可以利用以下语句:
X = @IN( C, @INDEX( A, 2), @INDEX( B, Y));
对本例,结果是X=1(真)。
注:X既是集合B的元素,又对X赋值1,在LINGO中这种表达是允许的,因为前者是集合的元素,后者是变量,逻辑上没有关系(除了同名外),所以不会出现混淆。

3.@WRAP(I,N) 此函数对N<1无定义

当I位于区间[1, N]内时直接返回I;一般地,返回 J = I - K *N , 其中J位于区间[1, N ], K为整数。即
@WRAP(I,N)= @MOD(I,N)。

​ 但当@MOD(I,N)=0时@WRAP(I,N)=N.
​ 此函数可以用来防止集合的索引值越界。
​ 用户在编写LINGO程序时,应注意避免LINGO模型求解时出现集合的索引值越界的错误。

4.@SIZE (set_name)
返回数据集set_name中包含元素的个数

1.4.7 文件输入输出函数

函数作用
@FILE(filename)当前模型引用其他ASCII码文件中的数据或文本时可以采用该语句(但不允许嵌套使用),其中filename为存放数据的文件名,该文件中记录之间用“~”分开
@ODBC提供LINGO与ODBC(Open Data Base Connection,开放式数据库连接)的接口。
@OLE提供LINGO与OLE(Object Linking and Embeding)接口。
@POINTER( N)在Windows下使用LINGO的动态连接库DLL ,直接从共享的内存中传送数据
@TEXT([‘filename’])用于数据段中将解答结果送到文本文件filename中,filename中可以带有文件路径

常用:

输出:@text(‘d:out.txt’)

输入: x = @OLE(‘D:/cost.xls’,f)

在这里插入图片描述

1.4.8 结果报告函数

@WRITEFOR( setname[ ( set_index_list) [ | condition]]: obj1[,…, objn]) :

函数@WRITE在循环情况下的推广,输出集合上定义的属性对应的多个变量的取值。

在这里插入图片描述

只能在数据段中使用

1.5 集合

集合段(SETS):以“ SETS:” 开始, “ENDSETS”结束,定义必要的集合变量(SET)及其元素

sets:
supply/1..2/:s;
demand/1..3/:d;
link(supply, demand):road, g;
endsets

初始集合分别为一维数组supply和demand,其中取值范围分别为1 ~ 2和1 ~ 3,supply和deman分别为数组的类型名后面代表变量名。

link衍生集合将两个集合合起来形成一个二维集合,可以理解成表格的形式,例如此题中的road和g的形式就是一个2行3列的表格。

稀疏集合与稠密集合

包含了两个基本集合构成的所有二元有序对的派生集合称为稠密集合(简称稠集)。有时候,在实际问题中,一些属性(数组) 只在笛卡儿积的一个真子集合上定义,这种派生集合称为稀疏集合(简称疏集)

其实两者区别就是稀疏集合将想要用到的元素列举出来而不是全部生成,节省存储空间,摘除不需要的元素。

在这里插入图片描述

隐式列举法:(常用)
在这里插入图片描述

在这里插入图片描述

1.6 求和 @ sum()

@SUM(集合(下标):关于集合的属性的表达式)

应用集合求和举例说明:

  1. 只对i进行遍历求和

∑ i = 1 2 g i j \sum_{i=1}^{2} g{\tiny ij} i=12gij

@sum(supply(i) : g(i,j))

2.对 i , j 进行遍历求和
∑ i = 1 2 ∑ j = 1 3 g i j × L i j \sum_{i=1}^{2} \sum_{j=1}^{3} {\Large g} {\small ij} \times L{\small ij} i=12j=13gij×Lij

@sum(link(i, j) : g(i, j) * L(i, j))

1.7 遍历 @for()

对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立

1.8 数据段(data)

以 “DATA:” 开始, “ENDDATA”结束,

对集合的属性(数组)输入必要的常数数据。
格式为:“attribute(属性) = value_list(常数列表);”

常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用空格分开,如上面对DEM的赋值也可以写成“DEM=40 60 75 25;”

1.9 初始段 (init)

以“INIT: ”开始, “ENDINIT”结束

对集合的属性(数组)定义初值

(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。

如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为:
“attribute(属性) = value_list(常数列表);”

1.10 计算段 (calc)

以“CALC: ”开始, “ENDCALC”结束,

对一些原始数据进行计算处理。
在实际问题中,输入的数据通常是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的**“****预处理”**,得到模型中真正需要的数据

1.11 灵敏度分析与窗口解释

1.11 .1开启灵敏度分析

在这里插入图片描述

在这里插入图片描述

最后Ctrl + R

在这里插入图片描述

1.11.2 报告内容窗口

在这里插入图片描述

                   Variable           Value        Reduced Cost
                      DESKS        2.000000            0.000000
                     TABLES        0.000000            5.000000
                     CHAIRS        8.000000            0.000000

                        Row    Slack or Surplus      Dual Price
                          1        280.0000            1.000000
                          2        24.00000            0.000000
                          3        0.000000            10.00000
                          4        0.000000            10.00000
                          5        5.000000            0.000000

Reduced Cost
列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时, 目标函数的变化率。其中基变量的reduced cost值应为0, 对于非基变量 Xj, 相应的 reduced cost值表示当某个变量Xj 增加一个单位时目标函数减少的量( max型问题)。本例中:变量tables对应的reduced cost值为5,表示当非基变量tables的值从0变为 1时(此时假定其他非基变量保持不变,但为了满足约束条件,基变量显然会发生变化),最优的目标函数值 = 280 - 5 = 275。

row

代表第几个等式(或不等式****)

Slack or Surplus

给出松弛或剩余变量的值,其值为零的对应约束为**“紧约束”,表示在最优解下该项资源已经用完**;其值为非零的对应约束为"松约束",表示在最优解下该项资源还有剩余(解释:把解集带入约束,如变为等式则为紧约束)

DUAL PRICE(对偶价格)
对应的值表示当对应约束有微小变动时, 目标函数的变化率。输出结果中对应于每一个约束有一个对偶价格。 若其数值为p, 表示对应约束中不等式右端项若增加1 个单位,目标函数将增加p个单位(max型问题)。

显然,如果在最优解处约束正好取等号(也就是“紧约束”,也称为有效约束或起作用约束),对偶价格值才可能不是0。本例中:第3、4行是紧约束,对应的对偶价格值为10,表示当紧约束
4 DESKS + 2 TABLES + 1.5 CHAIRS <= 20
变为
4 DESKS + 2 TABLES + 1.5 CHAIRS <= 21
时,目标函数值 = 280 +10 = 290。
对第4行也类似。 对于非紧约束(如本例中第2、5行是非紧约束),DUAL PRICE 的值为0, 表示对应约束中不等式右端项的微小扰动不影响目标函数。有时, 通过分析DUAL PRICE, 也可对产生不可行问题的原因有所了解。

1.11.3 灵敏度分析窗口
                                  Objective Coefficient Ranges
                              Current        Allowable        Allowable
            Variable      Coefficient         Increase         Decrease
               DESKS         60.00000         20.00000         4.000000
              TABLES         30.00000         5.000000         INFINITY
              CHAIRS         20.00000         2.500000         5.000000

                                       Righthand Side Ranges
                 Row          Current        Allowable        Allowable
                                  RHS         Increase         Decrease
                   2         48.00000         INFINITY         24.00000
                   3         20.00000         4.000000         4.000000
                   4         8.000000         2.000000         1.333333
                   5         5.000000         INFINITY         5.000000

目标函数中DESKS变量原来的费用系数为60,允许增加(Allowable Increase)=4、允许减少(Allowable Decrease)=2,说明当它在[60-4,60+20] = [56,80]范围变化时,最优基保持不变。对TABLES、CHAIRS变量,可以类似解释。由于此时约束没有变化(只是目标函数中某个费用系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中费用系数发生了变化,所以最优值会变化)。
第2行约束中右端项Right Hand Side,简写为RHS)原来为48,当它在[48-24,48+∞] = [24,∞]范围变化时,最优基保持不变。第3、4、5行可以类似解释。不过由于此时约束发生变化,最优基即使不变,最优解、最优值也会发生变化
灵敏性分析结果表示的是最优基保持不变的系数范围。由此,也可以进一步确定当目标函数的费用系数和约束右端项发生小的变化时,最优基和最优解、最优值如何变化。

[60-4,60+20] = [56,80]范围变化时,最优基保持不变**。对TABLES、CHAIRS变量,可以类似解释。由于此时约束没有变化(只是目标函数中某个费用系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中费用系数发生了变化,所以最优值会变化)。
第2行约束中右端项Right Hand Side,简写为RHS)原来为48,当它在[48-24,48+∞] = [24,∞]范围变化时,最优基保持不变。第3、4、5行可以类似解释。不过由于此时约束发生变化,最优基即使不变,最优解、最优值也会发生变化
灵敏性分析结果表示的是最优基保持不变的系数范围。由此,也可以进一步确定当目标函数的费用系数和约束右端项发生小的变化时,最优基和最优解、最优值如何变化。

原文链接:https://blog.csdn.net/qq_45152779/article/details/106225254

  • 28
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值