首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

札记—— C++程序调用 python 脚本写的 Gurobi 优化model

2013-03-29 
笔记—— C++程序调用 python 脚本写的 Gurobi 优化model擦,这个标题写得不通顺,让人摸不着头脑有点 -p不过

笔记—— C++程序调用 python 脚本写的 Gurobi 优化model

       擦,这个标题写得不通顺,让人摸不着头脑有点 ;-p  不过没办法,总共涉及到3个工具,有点特殊,不过我保证都是我自己的经验。

       如果有做研究的同行也被同类问题所困扰,请原谅我没有早一点把我的经验写出来供您参考。我将把我近一段时间 用 C++ 调用 ( 由python 脚本 调用 Gurobi optimizer 程序 ) 的 程序 【果真有点嵌套吧:-)】的经验分享出来。因为我当初开始试着解决问题时,搜索了整个网络,国语写成的资料,最多涉及到2项,如 “如何用C++调用 python 脚本” 或者 “如何 调用 Gurobi 的 C++ 接口”,又或者 “ 如何用 python 调用 Gurobi 脚本”。 擦,没有一个符合我的要求的。木有办法,只好去参考原版的 Gurobi  Manual 与 python 27 的 tutorial, 然后一步步地做实验,探索用法。然后结合着 Google Group (https://groups.google.com/forum/#!forum/gurobi) 的帖子,去借鉴别人的经验。虽然这个过程走了很多的弯路,比如前边的两篇文章关于优化软件 LINGO 的学习积累”与“Little experience to use Gurobi to solve an LP problem”,最后终于把自己的problem 打通了。爽! perfect !

   首先,把我的需求说明清楚,要不您还不知道我的problem到底与您的问题是否一致。

   我一个月前遇到的需求与 problems :

   1)我已经有一个数学model了,但是不知道是否正确,所以需要用一个简单的小例子快速地验证;

   2)如果正确了,我需要把这个model封装一下,嵌到我的C++工程里,这样可以在模拟程序里一轮一轮地反复调用,求得多次由model解出来的optimal值的平均值,同时可以与模拟程序里的人工设计的算法执行在由同样的输入数据的情况下,最终可以比较算法的结果与最优值之间的performances。

   前边 之所以说,走了弯路,而且走了两次弯路:一是因为最开始时,我没有挑选对优化工具,用了国内常用的Lingo,因为在国内网站上搜到很多诸如“谢金星Lingo优化工具讲解” ,擦,这个工具的脚本语言真是不好用,不是贬损人家,是我用着真不顺手,花了好几天的时间还用不好。渐渐生出换解model工具的念头。请教师兄曾博,他推荐我使用世界上优化效率最好的 Gurobi,比著名的CPlex还要好用。最开始不信,google一下再说,结果第一条便是“Gurobi — The overall fastest and best supported solver available”,而且找到了几种主流的优化工具效率的比较的柱状图,不是重点,略去。

    开读Gurobi的 manual,我发现,它的使用很灵活,提供了若干种主流语言的 interfaces, 如 C, C++, Java, Python, .net等等,比较适合嵌套在用户的程序里去被调用,来解决优化问题。

    紧接着,我又走了一次弯路,因为我最熟悉C++,然后就对着Gurobi提供的C++ exmples,与quick start Refs,用了C++ interfaces 来写解model的程序。经过千辛万苦,终于把model的solving 程序封装并写好了调用。擦,一试用效果,小规模的程序很快,model也被验证了正确性,心里窃喜。可是一旦上了规模,结果程序慢得像蜗牛,因为输入的数据上了规模后,Gurobi Model里的变量与constraints的数量呈非线性增长,甚至达到了数百万个constraints,根本没法用在模拟程序里进行成百上千次的反复调用。究其原因,可能性是1)我的水平不够,写的C++程序效率奇差;2)我的数学model本身的特殊性造成的,当变量规模大了,constraints就异常多;3)也可能是因为Gurobi所提供的C++ interfaces 在解决我的model 时,效果不好。

    木有办法,再次请教师兄,他建议我使用 python试试(现在看来,真是前辈的经验宝贵啊)。于是,就现学现用python了。对照着师兄给的sample,慢慢将我的model写成用python脚本来解。又经过2天的埋头coding,终于写好了单独的一个用python脚本写好的model solving 程序。开试效果,擦,只要规模不是太大,几乎瞬间被解出。怎么回事?哈,现在看来刚才用C++ 调用失败的3个可能的原因,原来是第3条被验证了。

    好,那我就用python脚本写成的model solving程序来解最优值。

    Therefore, the last problem appears: How to use my C++ project to call this python model solving script?

    到了这一步,这最后一个问题就简单多了,只需要解决用C++来调用 python 脚本就over了。很快,这个问题被我解决了。

    以上便是我的此次的问题解决路线,弯路有时候必须走一走,到终点时,才知道它原来是一条弯路。尽管觉得费了很大力气,做了很多无用功,但是,我倒不觉得这是在浪费时间与精力。逆境才能让人学到更多。

    Ok, 不多废话了,我把我的 用python 写的 gurobi 脚本 与 一部分 C++调用这个脚本的关键程序贴在最后,如果对someone 有帮助,那我的汗水也会增加一分重量。

    贴出来的程序分为2个主要部分:1)python写的model solving 脚本; 2)用C++调用Python脚本的一些 api 的用法与封装.

    关于我的数学model,其实是曾师兄所formulate出来的,我来解的,类似于背包问题或者Bin packing 问题,不是什么秘密,原样贴出,因为曾师兄应该很快可以把这个model 发表在 Globecom2013 上,欢迎到时候垂读,if you are interested in it. 札记—— C++程序调用 python 脚本写的 Gurobi 优化model

    

   1)  Gurobi based model, Python script:

)


   


-- Davy Hwang

2013-03-27

1楼bbquare1小时前
gurobi 的 python 接口写模型的确很 nice。“ Gurobi Model里的变量与 constraints 的数量呈非线性增长,甚至达到了数百万个”---这句话怎样理解?是约束会急剧增加?还是变量急剧增加?如果是后者使用 gurobi 的 shifting 功能试一试可能会好一些,如果是前者那就要考虑数学模型有没有解了

热点排行