600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 猿创征文 | 数学建模 lingo超实用的核心使用技巧

猿创征文 | 数学建模 lingo超实用的核心使用技巧

时间:2021-11-13 11:35:52

相关推荐

猿创征文 | 数学建模 lingo超实用的核心使用技巧

文章目录

1、查看lingo版本信息,以防在解决大规模优化问题时受限2、利用全局求解器尽可能大的逼近全局解(提高精确度)3、编程过程中验证编写的模型与预期是否一致(减少编写错误)4、快速查找结果中的非零变量5、解决大规模优化问题要学会中断程序的执行(牺牲精度,节省时间)6、灵敏度分析

lingo软件在解决数学优化问题上有着独特的优势,但其本身属于建模型语言,和c、python等语言在编程方面有着较大的不同,不易上手。 本文主要记录总结我在学习lingo中认为使用频繁、比较实用的小技巧,如果想系统的学习可以去看谢金星老师写的《优化建模与LINDO、LINGO软件》

1、查看lingo版本信息,以防在解决大规模优化问题时受限

说明:因为lingo有着不同的版本,而不同的版本的处理数据量的大小是不同的

做法:

可以在【help】中选择【About lingo】来查看

比如这个就是不受限制的

2、利用全局求解器尽可能大的逼近全局解(提高精确度)

说明:

对于整数规划、非线性规划可能用到扩展求解器(绿框标出的)

而lingo求非线性的整数时默认不使用全局求解器,这样可以节省时间,但有时结果可能达不到预期。在数学上,不可能求出全局解,所以只是近似的求取全局解

做法:下面就是如何打开全局求解器

①打开【options…】

②找到【Global Solver】在【Use Global Solver】前打勾,最后点击【ok】

3、编程过程中验证编写的模型与预期是否一致(减少编写错误)

说明:在实际的编写过程中往往会因为集合的使用导致程序不直观,很容易出现错误,为了避免出现这样的问题,我们可以在编写的过程中随时的检查,减少错误的产生

例如对于这个优化问题:

做法:①首先我们要定义集合

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;endsetsmin=@sum(set3(i,j):c*x);

由于目标函数是集合的形式表示,不直观,我们这时候就可以查看现在所编写的模型是否正确

③查看模型

可以看到如下界面,检查发现与目标函数一致,说明编写正确,可以继续写约束条件

④写第一个约束条件

注意:这个展开写的画实际上是四个表达式

sets:set1/1..4/:y;set2/1..4/:z;set3(set1,set2):c,x;endsetsmin=@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;endsetsmin=@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)));

4、快速查找结果中的非零变量

说明:在有些时候往往涉及到的变量会非常多,特别是有01变量的时候,这时我们要找到非零变量往往比较耗时间,好在lingo中有一个选项可以快速查找

(继续用上一问的题目)

正常情况下结果会以这种形式出现

做法:①找到【solution】

②勾选,然后确定

③这时候的变量只显示非零项了

5、解决大规模优化问题要学会中断程序的执行(牺牲精度,节省时间)

说明:有时候在解决大规模的优化问题时,往往在短时间内得不到计算的结果,但我们又想用较少的时间内得到较满意的结果,这时可以判断当前状况,中断程序

做法:

①判断是否可以终止

往往在这种情况下都会使用扩展求解器,在求解器中可以看到边界值和当前求的的最佳值,这两个不断接近

当接近时即找到结果,但接近速度越来越慢

当两个数差别非常小时,运行非常慢,可以人为中断,所以运行时要关注这两个数

②点击【Interrupt】

6、灵敏度分析

说明:

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,允许增加(Allowable

Increase)=2.6,允许减少(Allowable Decrease)=3.4,说明当这个系数在

[7-3.4,7+2.6]=[3.6,9.6]范围变化时,最优基保持不变。对x2变量,可以类似解释.由于此时约束没有变化(只是目标函数中某个系数发生变化),所以最优基保持不变的意思也就是最优解不变(当然,由于目标函数中系数发生了变化,所以最优值会变化).

(2)约束右端项变化的范围(RIGHT HAND SIDE RANGES)

如本例中,第⒉行约束中当前右端项(CURRENT RHS)= 360,允许增加(Allowable

Increase)=INFINITY(无穷)、允许减少(ALLOWABLE DECREASE)=84,说明当它在

[360-84,360+∞]=[276,∞)范围变化时,最优基保持不变。第3、4行可以类似解释.不过由于此时约束发生变化,最优基即使不变,最优解﹑最优值也会发生变化。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。