一个小小的LINGO建模技巧
本帖最后由 wujianjack2 于 2014-11-25 18:53 编辑本帖将以一个看似简单,实则求解很难的优化测试题来讨论LINGO的求解能力(LINDO API),个人见识有限,敬请谅解!
参考帖子:
http://forum.simwe.com/thread-806242-1-1.html (原问题提出者为shamohu版主,16楼为我的回复)
1.问题陈述:
参考文献:
1stOpt and Global Optimization Platform-Comparison and Case Study.caj
文献给出参考结果:(取较优解)
2.LINGO程序代码:(以LINGO 14及【LINGO学习杂谈 二】中Patch的LINDO API版本为求解引擎)
方案一:直接编写
(1)源代码一:
MIN=(X1^X2+X2^X1-5*X1*X2*X3-85)^2+(X1^3*X2^X3*X3^X2-60)^2+(X1^X3+X3^X1-X2-0.55)^2; @FREE(X1);@FREE(X2);@FREE(X3);
运行结果截图:
运行状态:
运行结果:
(2)源代码二:
X1^X2+X2^X1-5*X1*X2*X3-85=0;X1^3*X2^X3*X3^X2-60=0;
X1^X3+X3^X1-X2-0.55=0;
@FREE(X1);@FREE(X2);@FREE(X3);
运行结果截图:
Global Solver Status:
Local Nonlinear Solver Status:
Local Nonlinear Solver运行结果:
综上,可以看出,如果直接编写,LINGO对于此题的求解结果并不理想,但这并不意味着此题LINGO无法求解,只是,我们需要改变下策略。
方案二:把复杂的约束简化(前提:把X1,X2,X3的定义域缩小为非负)
对于方案一的代码,LINDO Systems公司的Mark Wiley先生给出了评价,并给出了合理的建议:
如下代码基本沿用Mark Wiley先生给出的思路,稍作调整:
X1^X2+X2^X1-5*X1*X2*X3-85=0;
3*@LOG(X1)+X3*@LOG(X2)+X2*@LOG(X3)-@LOG(60)=0;
X1^X3+X3^X1-X2-0.55=0;
使用Global Solver与否均可较快得到较好的结果:(以下结果为Global Solver求解结果)
有兴趣的可尝试其它版本,包括各种Crack,由于LINDO API版本号的不同,求解效果也可能出现差异。
不明觉厉。。500体力值?本人数学中国菜鸟一枚 雪夜邀月 发表于 2014-1-5 09:08 static/image/common/back.gif
不明觉厉。。500体力值?本人数学中国菜鸟一枚
嗯,对,每天我会总共拿出上限为500体力的体力奖励来奖励大家的精彩回帖。
祝新年快乐! 太感谢慷慨的楼主了 可以建个群 大家一起讨论?感觉楼主比较大牛 这个问题用这种方法真是很好啊 ! 秋の名山で戦 发表于 2014-1-24 18:21 static/image/common/back.gif
太感谢慷慨的楼主了 可以建个群 大家一起讨论?感觉楼主比较大牛
不客气,承蒙抬举!在论坛交流也不错啊。 紫菱666 发表于 2014-1-24 21:02 static/image/common/back.gif
这个问题用这种方法真是很好啊 !
同感,欢迎积极发言讨论!新年快乐! 被你折服了,真的很有用,谢谢楼主分享 {:3_50:}{:3_41:}{:3_42:}{:3_42:} 这对于LINGO初学者来说很难把握啊