为准备写整数线性规划求解器的道友献上自己的优化历程兼新手教程

chenmeng1164651620 2016-04-12 09:36:53
复赛题目不让用开源库了,自己实现太困难,在这里分享我的优化历程和模型,以case3为例;
1、以边构造变量0、1变量,可以尽量减少规模,相信大家都是这样做的;
2、添加约束
(1)对所有的必经点:除去起点,其余点的入度为1;除去终点,其余点的出度为1;
(2)对所有的非必经点:出度与入度相等;
(3)然后加上tsp或者最小生成树里面类似的利用level去除环路,耗时1m20s+(当时好伤心)
(4)出度小于等于1,入度小于等于1;加入这两个比较紧的约束,耗时40s+(好意外,提速这么多)
(5)添加去除小环的约束:形式如x_ij + x_ji <= 1;性能改进忘记了,(似乎不大)
(6)干掉耗时的去环约束,改为多次求解,然后在最后解中寻找是否存在环,如存在,加入约束,重复这步,直到找到解(肯定是最优解)。去换的约束很简单,每个环上所有的边的变量相加小于等于该环边的数量-1。(10s内)好高兴,可以提交了(然而还当时没开始提交)。这时候小环(5)的约束是起到作用了的。
(7)添加起点到终点这条路径如(6)所描述的约束;竟然遗忘了,竟然1s内了;
我提交的代码似乎只有这些,可能会有遗漏。
(8)在重复计算中,中间可能找到可行解(上界),这时候应该把它保留下来作为下一次的初始值,如果不是那就添加环的约束,也是一个好处啊。(耗时用例会提速0.5~1倍,目测干不过自己前面大神,没上传)

新手部分:
开源软件部分:coin-cbc easy-ip
easy-ip可以让你很容易的写出约束
coin-cbc是求解器
编译是最耗时的部分,coin-cbc用命令./configure --help 看帮助
easy-ip 的编译是个头疼问题,作者没有提供静态编译,而且不只是这一个求解器的封装。建议把关键用上的几个文件拿出来加入工程就行了,至于其他求解器部分的代码,请自己修改屏蔽掉。

可能有漏掉的部分,希望能给道友们助力一把啊。
...全文
2822 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-14
  • 打赏
  • 举报
回复
强烈支持各种炫技!
  • 打赏
  • 举报
回复
哥们,你这模型能求出多少个比赛用例晒?
chenmeng1164651620 2016-04-14
  • 打赏
  • 举报
回复
引用 7 楼 long19911126 的回复:
哥们,你这模型能求出多少个比赛用例晒?
15个初赛用例
bryanting 2016-04-13
  • 打赏
  • 举报
回复
引用 5 楼 w123456709 的回复:
大神,这个什么意思呀?“(7)添加起点到终点这条路径如(6)所描述的约束;竟然遗忘了,竟然1s内了;”,这个约束能不能再详细描述一下呀
约束没有成环的的主路不能在迭代中再次出现,是为了防止下次迭代主路不变环扩大,减少迭代次数
w123456709 2016-04-12
  • 打赏
  • 举报
回复
大神,这个什么意思呀?“(7)添加起点到终点这条路径如(6)所描述的约束;竟然遗忘了,竟然1s内了;”,这个约束能不能再详细描述一下呀
chenmeng1164651620 2016-04-12
  • 打赏
  • 举报
回复
引用 3 楼 open_source_library 的回复:
写的这么详细,不知道好不好。我也是用的CBC,优化的有的跟你一样,有的不是,case3我跑了30ms
也是数十毫秒,机器都不一样,那个案例说明不了太多啊。
migoo_hao 2016-04-12
  • 打赏
  • 举报
回复
复活赛稳了,大神好分享
  • 打赏
  • 举报
回复
写的这么详细,不知道好不好。我也是用的CBC,优化的有的跟你一样,有的不是,case3我跑了30ms
qq_15069149 2016-04-12
  • 打赏
  • 举报
回复
问个小白问题,
引用
以边构造变量0、1变量,可以尽量减少规模,相信大家都是这样做的;
这个以边构造变量是什么意思?我自己是存为邻接矩阵来处理的。
Python编程基础教程教程旨在帮助初学者了解Python编程的基础知识和高级应用。我们将介绍Python的各个方面,包括基础语法、数据类型、控制结构、函数、文件操作、面向对象编程、模块和包、异常处理、装饰、生成、迭代以及协程。1. Python基础Python是一种解释型、交互式的编程语言。它具有简单易学的语法和丰富的库,使得开发过程既快速又高效。在开始学习Python之前,建议您先熟悉基本的计算机科学概念,例如变量、数据类型、运算符等。2. 数据类型Python具有多种数据类型,包括数字(整数和浮点数)、字符串、布尔值、列表、元组、集合和字典等。这些数据类型在Python中有着广泛的应用,从简单的数值计算到复杂的数据处理。3. 控制结构控制结构是编程中的基本组成部分,它们决定了程序如何执行。Python支持条件语句(if-elif-else)和循环语句(for和while),可以根据程序中的特定条件和情况来选择适当的操作。4. 函数函数是封装一段代码的便捷方式,它们可以在需要时被调用。在Python中,您可以定义函数,并使用参数来传递数据。函数可以返回值,以便在调用它们时使用。5. 文件操作文件操作是编程中常见的任务之一。Python提供了许多内置的函数和方法来进行文件操作,如读取、入和删除文件等。此外,Python还支持对文件进行高级操作,如读二进制文件、文件锁定等。6. 面向对象编程面向对象编程是一种流行的编程范式,它使用类和对象的概念来构建复杂的系统。Python支持面向对象编程,您可以使用类来定义对象,并使用继承和多态等特性来扩展和定制对象的行为。7. 模块和包模块和包是Python中组织代码的重要工具。模块是一个包含Python代码的文件,而包则是一个包含多个模块的目录。通过使用模块和包,您可以轻松地组织和管理大型项目中的代码。8. 异常处理异常处理是Python中处理错误的方式之一。当程序中出现错误时,Python会抛出一个异常。通过使用try-except语句块,您可以捕获并处理这些异常,以确保程序的稳定性。9. 装饰装饰是Python中的高级功能之一,它允许您在函数或方法之间添加额外的功能,而不改变其原始实现。装饰是一种强大的工具,可用于实现各种功能,如日志记录、性能分析等。10. 生成生成是Python中的一种特殊类型的迭代。通过使用生成函数和方法,您可以在需要时生成数据,而不是一次性生成所有数据。这使得生成在处理大量数据时非常有用,因为它们可以节省内存空间。11. 迭代和协程迭代和协程是Python中的两个重要概念。迭代允许您遍历容类型的数据结构(如列表和元组),而协程则是一种异步编程的方式,它允许您在程序中执行多个任务并发执行。这两个概念在处理大量数据和高性能应用程序方面非常有用。

127

社区成员

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

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