lingo软件在解决数学优化问题上有着独特的优势,但其本身属于建模型语言,和c、python等语言在编程方面有着较大的不同,不易上手。 本文主要记录总结我在学习lingo中认为使用频繁、比较实用的小技巧,如果想系统的学习可以去看谢金星老师写的《优化建模与LINDO、LINGO软件》
说明:
因为lingo有着不同的版本,而不同的版本的处理数据量的大小是不同的
做法:
可以在【help】中选择【About lingo】来查看
比如这个就是不受限制的
说明:
对于整数规划、非线性规划可能用到扩展求解器(绿框标出的)
而lingo求非线性的整数时默认不使用全局求解器,这样可以节省时间,但有时结果可能达不到预期。在数学上,不可能求出全局解,所以只是近似的求取全局解
做法:
下面就是如何打开全局求解器
①打开【options…】
②找到【Global Solver】在【Use Global Solver】前打勾,最后点击【ok】
说明:
在实际的编写过程中往往会因为集合的使用导致程序不直观,很容易出现错误,为了避免出现这样的问题,我们可以在编写的过程中随时的检查,减少错误的产生
例如对于这个优化问题:
做法:
①首先我们要定义集合
sets:
set1/1..4/:y;
set2/1..4/:z;
set3(set1,set2):c,x;
endsets
②紧接着要确立目标函数的编写
sets:
set1/1..4/:y;
set2/1..4/:z;
set3(set1,set2):c,x;
endsets
min=@sum(set3(i,j):c*x);
由于目标函数是集合的形式表示,不直观,我们这时候就可以查看现在所编写的模型是否正确
③查看模型
可以看到如下界面,检查发现与目标函数一致,说明编写正确,可以继续写约束条件
④写第一个约束条件
注意:这个展开写的画实际上是四个表达式
sets:
set1/1..4/:y;
set2/1..4/:z;
set3(set1,set2):c,x;
endsets
min=@sum(set3(i,j):c*x);
@for(set1(i):@sum(set2(j):x(i,j))=1);
展现出的模型
这里可以验证一下,结果正确
⑤完成剩余条件的编写
sets:
set1/1..4/:y;
set2/1..4/:z;
set3(set1,set2):c,x;
endsets
min=@sum(set3(i,j):c*x);
@for(set1(i):@sum(set2(j):x(i,j))=1);
@for(set2(j):@sum(set1(i):x(i,j))=1);
@for(set3(i,j):@bin(x(i,j)));
说明:在有些时候往往涉及到的变量会非常多,特别是有01变量的时候,这时我们要找到非零变量往往比较耗时间,好在lingo中有一个选项可以快速查找
(继续用上一问的题目)
正常情况下结果会以这种形式出现
做法:
①找到【solution】
②勾选,然后确定
③这时候的变量只显示非零项了
说明:
有时候在解决大规模的优化问题时,往往在短时间内得不到计算的结果,但我们又想用较少的时间内得到较满意的结果,这时可以判断当前状况,中断程序
做法:
①判断是否可以终止
往往在这种情况下都会使用扩展求解器,在求解器中可以看到边界值和当前求的的最佳值,这两个不断接近
当接近时即找到结果,但接近速度越来越慢
当两个数差别非常小时,运行非常慢,可以人为中断,所以运行时要关注这两个数
②点击【Interrupt】
说明:
Lingo默认关闭灵敏度分析,灵敏度分析将耗费相当多的求解时间,因此当速度很关键或不需要灵敏度分析报告时就没必要激活。此外,灵敏度分析只对线性规划模型有意义。
目标函数的变化范围:Allowable Increase和Allowable Decrease分别表示在最优解不变的情况下变量允许增加或减少的量(最优解不变,但是最优解对应目标函数的值会变化)
做法:
①
在蓝色区域内选择【Prices & Ranges】,点击【OK】
②先运行程序,然后点击【Solver】里的【Range】或直接Ctrl+r调出
③分析
例如对于这个 表达式
max=7*x1+12*x2;
9*x1+4*x2<=360;
4*x1+5*x2<=200;
3*x1+10*x2<=300;
其灵敏度结果由两部分组成:
(1)目标函数中系数变化的范围(Objective Coefficient Ranges)
x1
变量当前的系数(Current Coefficient)=7,允许增加(Allowablex2
变量,可以类似解释.由于此时约束没有变化(只是目标函数中某个系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中系数发生了变化,所以最优值会变化).
(2)约束右端项变化的范围(RIGHT HAND SIDE RANGES)