求解器开源库新手入门教程(冲刺必看)

open_source_library 2016-04-11 12:21:38
大家好!之前有个哥们说给开源库教程,怎么迟迟不给?只好我来了。

先说明我的使用情况,我前几天用小号在各个赛区跑了一下。基本都是前三,有四个赛区是第一。所以鄙人觉得还是有资格来给大家做个教程。(请不要喷,小号就是跑一下,就解散队伍了,没有影响你们,估计你们都觉察不到)

下面以问答的方式来讲开源库的使用。

1. 神马是开源库?神马是求解器?
这个赛题可以看成是个组合优化问题,因此可以建立整数线性规划模型。而整数规划模型的求解算法是比较固定的,因此有开源社区写出这个求解工具,这些就是求解器,也就是开源库。

2. 求解器有多牛逼?
绝对没有大家说得那么神乎。是的,求解器容易求出最优解,但是时间开销大。那些20ms出最优解的,我相信不是求解器算的。所以,这也是赛制所决定用求解器有优势,因为权值优先。如果限定时间是 1s,估计就没几个人用求解器了。

3. 哪个求解器最好?
没有最好,但对于这道题来说,我从个人的使用经验给大家分享一下。
——gplk最渣,问题规模稍大就跪
——lpsolve挺好,容易上手,求解速度也不差
——scip据说是最快的开源求解器,但是版权限制得比较严格,我放弃了
——coin-or cbc我去,这个简直就是求解器中的战斗机。求解快,还有很多控制求解过程的接口。但是,要花点心思看文档,没那么容易做好。我选择的是这个

4. 现在看论文学模型还来得及吗?
看个人。anyway,老子就没参考任何论文的模型。一看到题目,经验告诉我可以用整数规划做,就做了。后来,我回头看了一下别人的论文。任性地告诉大家,论文上的模型有改进的地方。好了,如果真的不会,那我只能简单说说一二。无非就是几个约束,起点有且仅有一条出边,终点有且仅有一条入边,必经点既有且仅有一条出边又有且仅有一条入边,其他点要么没有出边和入边,要么既有且仅有一条出边又有且仅有一条入边

5. 现在用求解器还来得及吗?
我是看到论坛上有个人抱怨说自己辛辛苦苦写了那么久的算法,被别人轻轻松松用求解器超越了,很伤心,才决心写这么个帖子的。我理解大家的心情。但是,不要放弃,你要是觉得自己本来的算法改不动来,那就试试求解器。我是用了大概三四个小时写出lpsolve版本的代码,求解速度还不错。你要是能够在这么大压力,这么短时间快速建模,快速使用求解器,快速优化代码,那我觉得你就是华为想要的人。

6. 用求解器怎么解决环?
不要盲目崇拜别人,肯定自己的想法就好。这个题目是NPC问题,没有一个轻轻松松解决环问题的办法。你能想到的,不错,就是那样的,不要怀疑自己。但为尊重比赛,恕我不能直说。

7. 用求解器是不是太可恶了,不给别人活路啊?
这么敏感的问题,来来来,我们说点轻松的。NBA有关注吧,库里喜欢吗?库里这么逆天的表现,要是能坚持五六年,说他是全宇宙最伟大的篮球运动员也不为过。可偏偏有人说,那有啥?就是一个投手!我去。。。你牛逼你投试试?好像投篮很简单的样子。再说了,库里只会投篮吗?这么说的人一般是没有认真看过库里打球赛的。几个人过来包夹,库里还是轻松地运球过人,然后从容、淡定、任性地投进了。毕竟是控卫!库里就是投篮太牛逼来,才让你们忽略了其实他各个方面都不错的一个伟大球员。我敢说,库里不用投篮,其他技术(防守、过人、组织)能力那也是狠狠地甩某些球星几条街的球员。。。。
停!!!扯哪了?。。。
噢,对不起,我是库迷,说到这个激动来。。。唉,我刚才是说库里,还是说开源库来着???

8. 最后,用Linus大神的一句名言与君共勉:
Talk is cheap, show me the code!
...全文
4732 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
GDRetop 2016-04-16
  • 打赏
  • 举报
回复
引用 8 楼 open_source_library 的回复:
[quote=引用 7 楼 uniquew1 的回复:] 等于没说。。。这也是教程?骗谁的?
我已经告诉了你最好的求解器是cbc,也告诉怎么建立一个整数规划模型,你还需要什么?直接上代码?这个不是很简单的事情? 所有的开源库,都会有example的,照壶画瓢就行啊。。 比如谷歌搜“coiner cbc example”, #include "CbcModel.hpp" // Using CLP as the solver #include "OsiClpSolverInterface.hpp" int main (int argc, const char *argv[]) { OsiClpSolverInterface solver1; // Read in example model in MPS file format // and assert that it is a clean model int numMpsReadErrors = solver1.readMps("../../Mps/Sample/p0033.mps",""); assert(numMpsReadErrors==0); // Pass the solver with the problem to be solved to CbcModel CbcModel model(solver1); // Do complete search model.branchAndBound(); /* Print the solution. CbcModel clones the solver so we need to get current copy from the CbcModel */ int numberColumns = model.solver()->getNumCols(); const double * solution = model.bestSolution(); for (int iColumn=0;iColumn<numberColumns;iColumn++) { double value=solution[iColumn]; if (fabs(value)>1.0e-7&&model.solver()->isInteger(iColumn)) printf("%d has value %g\n",iColumn,value); } return 0; } 这些就是。。如果这些都不是教程的话,我觉得可能只能等比赛结束直接奉上我的代码才算教程了[/quote]
引用 8 楼 open_source_library 的回复:
[quote=引用 7 楼 uniquew1 的回复:] 等于没说。。。这也是教程?骗谁的?
我已经告诉了你最好的求解器是cbc,也告诉怎么建立一个整数规划模型,你还需要什么?直接上代码?这个不是很简单的事情? 所有的开源库,都会有example的,照壶画瓢就行啊。。 比如谷歌搜“coiner cbc example”, #include "CbcModel.hpp" // Using CLP as the solver #include "OsiClpSolverInterface.hpp" int main (int argc, const char *argv[]) { OsiClpSolverInterface solver1; // Read in example model in MPS file format // and assert that it is a clean model int numMpsReadErrors = solver1.readMps("../../Mps/Sample/p0033.mps",""); assert(numMpsReadErrors==0); // Pass the solver with the problem to be solved to CbcModel CbcModel model(solver1); // Do complete search model.branchAndBound(); /* Print the solution. CbcModel clones the solver so we need to get current copy from the CbcModel */ int numberColumns = model.solver()->getNumCols(); const double * solution = model.bestSolution(); for (int iColumn=0;iColumn<numberColumns;iColumn++) { double value=solution[iColumn]; if (fabs(value)>1.0e-7&&model.solver()->isInteger(iColumn)) printf("%d has value %g\n",iColumn,value); } return 0; } 这些就是。。如果这些都不是教程的话,我觉得可能只能等比赛结束直接奉上我的代码才算教程了[/quote] 想请教一下,https://projects.coin-or.org/BuildTools/wiki/downloadUnix 我用这个网页提供的教程安装了cbc,接下来要如何写一个样例程序进行编译运行呢? 能不能给一点指导,或者推荐一篇教程呢?
qq_26143529 2016-04-15
  • 打赏
  • 举报
回复
谢谢大神分享
Dorrit_Waitting 2016-04-15
  • 打赏
  • 举报
回复
求解器不是拿来就能用的好吧,要自己分析建模。最少我知道,我们赛区前32很多都没有用求解器。分数上不去可能是算法没有别人的好。
举个例子,用蚁群的人很多,有的人轻松都求解出来了,有的人还总是unreached nodes,都是蚁群啊,很多人还都是下载的一个版本的基本蚁群啊,为什么差距那么大呢?人和人是不一样的啊,你得承认啊!
  • 打赏
  • 举报
回复
引用 36 楼 qq_22674313 的回复:
[quote=引用 11 楼 frostbolt 的回复:] 针对这个题目,我们内部有一套数学模型可以保证找出最优解,但是速度是分钟级别的。如果楼主能够找到一个确定找到最优解、速度又很快的方案,我们也很期待。
我只想问,如果都用楼主这个方案 是不是该当作弊处理? 如果不当作弊处理,那么我们这些自己写算法的还有一丝机会吗? 如果楼主是为了分享知识,大可以在复活赛后分享,这个时候分享算什么? 让我们不用开源库的全部被淘汰吗? 你把模型都给出来了,请问 使用开源库的人还需要什么技能? 也请大赛组委想想,不使用开源库的人还有一丝机会吗?这也算公平竞技吗? [/quote] 我写这个的初衷,是发现很多大学生没有使用开源库的经验,也没怎么接触Linux。这个教程是很简单的科普,在有些关键问题的处理上我是有很多保留的。很多人私信我加qq,我全部拒绝,甚至有人想看看我的代码,我当然回绝。自始至终,我尊重这个比赛,希望提供别人与核心算法模型无关的帮助。如果有人这几天用了开源库进了复赛,真的恭喜他们,他们一定是有独到的能力。
qq_22674313 2016-04-15
  • 打赏
  • 举报
回复
引用 11 楼 frostbolt 的回复:
针对这个题目,我们内部有一套数学模型可以保证找出最优解,但是速度是分钟级别的。如果楼主能够找到一个确定找到最优解、速度又很快的方案,我们也很期待。
我只想问,如果都用楼主这个方案 是不是该当作弊处理? 如果不当作弊处理,那么我们这些自己写算法的还有一丝机会吗? 如果楼主是为了分享知识,大可以在复活赛后分享,这个时候分享算什么? 让我们不用开源库的全部被淘汰吗? 你把模型都给出来了,请问 使用开源库的人还需要什么技能? 也请大赛组委想想,不使用开源库的人还有一丝机会吗?这也算公平竞技吗?
chenmeng1164651620 2016-04-12
  • 打赏
  • 举报
回复
引用 29 楼 frostbolt 的回复:
好啊,我们也希望多和大家聊聊天,你的队伍名称方便发私信给我下吧。 另外,我们本次比赛结束以后会有一个悬赏题,奖金更高,题目是真实存在的的、我们内部还没有完全解决的问题,对解题方式不做任何限制,有兴趣请继续关注,谢谢。。
版主,能有机会接触下这个悬赏题目吗?
「已注销」 2016-04-12
  • 打赏
  • 举报
回复
yalmip对大规模数据求解也挺好的吧,
赵4老师 2016-04-12
  • 打赏
  • 举报
回复
Code is simple,show me the CUDA!
SunliyMonkey 2016-04-12
  • 打赏
  • 举报
回复
冒个泡泡~~ 表示没用求解器~~ 手写代码3K。
frostbolt 2016-04-12
  • 打赏
  • 举报
回复
引用 30 楼 chenmeng1164651620 的回复:
[quote=引用 29 楼 frostbolt 的回复:] 好啊,我们也希望多和大家聊聊天,你的队伍名称方便发私信给我下吧。 另外,我们本次比赛结束以后会有一个悬赏题,奖金更高,题目是真实存在的的、我们内部还没有完全解决的问题,对解题方式不做任何限制,有兴趣请继续关注,谢谢。。
版主,能有机会接触下这个悬赏题目吗? [/quote] 悬赏题面向所有人,欢迎参加。
  • 打赏
  • 举报
回复
引用 29 楼 frostbolt 的回复:
[quote=引用 13 楼 open_source_library 的回复:] [quote=引用 11 楼 frostbolt 的回复:] 针对这个题目,我们内部有一套数学模型可以保证找出最优解,但是速度是分钟级别的。如果楼主能够找到一个确定找到最优解、速度又很快的方案,我们也很期待。
谢谢版主支持!当听到复赛不能用求解器的时候,我就没修改代码了。我有一个自认为很好的方案,是结合搜索和模型的,可能的话,我希望比赛结束后好好实现和优化,希望有机会和赛题组的老师们交流一下。[/quote] 好啊,我们也希望多和大家聊聊天,你的队伍名称方便发私信给我下吧。 另外,我们本次比赛结束以后会有一个悬赏题,奖金更高,题目是真实存在的的、我们内部还没有完全解决的问题,对解题方式不做任何限制,有兴趣请继续关注,谢谢。。[/quote] 哈哈,喜欢挑战这样真正的难题!不过我的方案还没充分的验证,我要过两周才比较有空。所以,容我充分论证,如果觉得可行的话,我会主动找机会和老师们交流的
lmz4098 2016-04-11
  • 打赏
  • 举报
回复
谢谢大大分享!!!原来手写的算法排25左右,决定用最后的11个小时去拼一把求解器了!!!
frostbolt 2016-04-11
  • 打赏
  • 举报
回复
引用 13 楼 open_source_library 的回复:
[quote=引用 11 楼 frostbolt 的回复:] 针对这个题目,我们内部有一套数学模型可以保证找出最优解,但是速度是分钟级别的。如果楼主能够找到一个确定找到最优解、速度又很快的方案,我们也很期待。
谢谢版主支持!当听到复赛不能用求解器的时候,我就没修改代码了。我有一个自认为很好的方案,是结合搜索和模型的,可能的话,我希望比赛结束后好好实现和优化,希望有机会和赛题组的老师们交流一下。[/quote] 好啊,我们也希望多和大家聊聊天,你的队伍名称方便发私信给我下吧。 另外,我们本次比赛结束以后会有一个悬赏题,奖金更高,题目是真实存在的的、我们内部还没有完全解决的问题,对解题方式不做任何限制,有兴趣请继续关注,谢谢。。
chenmeng1164651620 2016-04-11
  • 打赏
  • 举报
回复
引用 24 楼 tianranyixiao 的回复:
我不知道求解器的速度如何,但是我们组没有用,我们用了一篇论文里的算法解决该整数规划问题,复杂度为为O(n^3),对于600个点的,只需要0.04ms,求出来的路径可能是成环的。求解器是针对一般情况的,对于这个问题,存在有更高效率的算法。PS:我们的时间主要花在去除环路上
你发现神器了,线性规划似乎都比这复杂度高啊。
frostbolt 2016-04-11
  • 打赏
  • 举报
回复
引用 12 楼 qq_34302488 的回复:
[quote=引用 11 楼 frostbolt 的回复:] 针对这个题目,我们内部有一套数学模型可以保证找出最优解,但是速度是分钟级别的。如果楼主能够找到一个最优解情况下速度又很快的方案,我们也很期待。
我们所有用例都在10S内算出最优解了,可是复赛不让用开源库了,您的肯定是对我们最好的鼓励![/quote]
引用 24 楼 tianranyixiao 的回复:
我不知道求解器的速度如何,但是我们组没有用,我们用了一篇论文里的算法解决该整数规划问题,复杂度为为O(n^3),对于600个点的,只需要0.04ms,求出来的路径可能是成环的。求解器是针对一般情况的,对于这个问题,存在有更高效率的算法。PS:我们的时间主要花在去除环路上
我们实用的算法是要求在30ms内得出结果,而且约束条件要多得多,这次设置了10s的限制,纯粹是为了降低初赛的难度。 如果不考虑时间因素,我们内部的数学建模可以”保证“获得最优解。
seewed 2016-04-11
  • 打赏
  • 举报
回复
很棒,我的思路和你差不多,但是没有你那么厉害:1、我不知道如何保证路径连通,所以用求解器求出来是一些最优的边,没法形成路径,难道你的做法是多次使用求解器么;2、我也不知道如何描述不成环的约束条件。by the way,膜拜大神!!!
tianranyixiao 2016-04-11
  • 打赏
  • 举报
回复
我不知道求解器的速度如何,但是我们组没有用,我们用了一篇论文里的算法解决该整数规划问题,复杂度为为O(n^3),对于600个点的,只需要0.04ms,求出来的路径可能是成环的。求解器是针对一般情况的,对于这个问题,存在有更高效率的算法。PS:我们的时间主要花在去除环路上
  • 打赏
  • 举报
回复
引用 20 楼 huolilililili 的回复:
请叫自己抄模型而不是写模型
我觉得你心理很不健康,看到你在别的帖子上骂“建模狗”,请注意措辞! 明确跟你说,我实现这个东西的时候,没有参考任何论文的模型,完完全全是自己建立的。 再有,对于求解模型的算法,我也是略懂一二的。单纯形法,内点法,分支定界法,割平面法,略知一二。 我敬佩那些手写算法并且跑得很好的人,打心里地佩服他们。 而我也会手写算法求解这个问题。我希望你万一不幸进不了复赛,也记得关注这个比赛,看看进复赛的同学是不是不会手写算法了。 最后,没必要为一个比赛搞得自己对别人充满仇恨,显得自己那么狭窄。
chenmeng1164651620 2016-04-11
  • 打赏
  • 举报
回复
引用 20 楼 huolilililili 的回复:
请叫自己抄模型而不是写模型
抄原本的模型是不会出现在排行榜上的。虽然都依赖学习别人文章或者课本学来的,掌握了,那也算自己学会了。
huolilililili 2016-04-11
  • 打赏
  • 举报
回复
请叫自己抄模型而不是写模型
加载更多回复(19)

127

社区成员

发帖
与我相关
我的任务
社区描述
华为软件精英挑战赛(Huawei Code Craft)是华为公司面向全球大学生举办的一年一度的大型软件竞赛,致力于让参赛学生感受软件改变世界魅力,展示软件设计与编程潜力,享受Coding解决问题
开源软件软件工程软件构建 技术论坛(原bbs)
社区管理员
  • HUAWEI Code Craft社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧