【问题标题】:speed up CPLEX C++ code加速 CPLEX C++ 代码
【发布时间】:2016-03-23 01:05:08
【问题描述】:

这是在 CPLEX C++ 中实现我的第一个模型的结果,我非常惊讶质量有多慢和差。我相信通过更好的配方可以避免大部分问题。有人可以帮我改进代码吗?提示、想法、想法......一切都值得赞赏!

这是关于在 5 天内安排考试,每个考试有 2 个可用时间段。我的输入是考试数量(第一行第一个数字)和冲突的考试对(第一行第二个数字),其中我还知道参加这两项考试的学生人数(在以下行中 ->exam1 Exam2 #students 参加两项考试)。 您可以找到代码here 和实例here

我包括的约束是:

  1. 每门考试只安排一次
  2. 冲突的考试不能安排在同一时期
  3. 如果在同一天安排有冲突的考试,将受到处罚
  4. 如果连续几天安排有冲突的考试,将受到处罚
  5. 如果有冲突的考试安排在相邻时段的夜间考试,将受到处罚

我有一种感觉,甚至在表述中有些地方是错误的,因为我无法想象客观价值的价值如此之高。有人看到缺陷吗?我被卡住了。

问题可能出在我试图找出是否违反软约束的循环中。我在那里循环了好几天,但可能我一直不小心覆盖了我的变量。有谁知道如何确定指示是否在任何一天违反软约束的二进制变量(当然它只能发生一次,但很可能不是在最后)。

【问题讨论】:

  • 当你说模型很慢时,我猜你是指求解性能?这听起来像个小问题。模型构建和求解的速度有多慢?当您说质量差时,您指的是生成的解决方案吗?它的质量差在哪里?你的目标价值有多大?
  • 日志显示“根松弛解决方案时间 = 0.05 秒。(38.16 滴答声)”,我想这是找到第一个可行解决方案所需的时间。它的目标值是 28722(在最佳整数列中),它不会低于 28608,应该更像是 700
  • 没有。根松弛时间是在根节点解决松弛问题(忽略完整性)所花费的时间。这通常不是一个整数可行的解决方案。您可以手动创建一个解决方案进行比较吗?
  • 如果节点日志中的第一个条目显示最佳整数,那么松弛整数不是找到解决方案吗?或者我该如何解释?

标签: c++ optimization discrete-mathematics cplex


【解决方案1】:

我只是使用建模语言重新实现了模型,而不是调试 C++ 代码(我相信这是度过周日晚上的更快、更愉快的方式)。

(注意:修复错误后更新)。这是我的解决方案,总罚款为 751:

您应该能够将其插入您的代码并验证结果。

注意:在旧笔记本电脑上大约需要 900 秒才能证明 Cplex 的最优性。如果你只想要一个好的解决方案,你可以早一点停下来:

(蓝线是目标,红线是最好的界限)。为了获得良好的性能,我在设置分支优先级和使用调整运行建议的一些选项方面帮助了 Cplex。

【讨论】:

  • 这令人印象深刻,但我仍然不明白我在哪里忘记了某些东西或把它弄得太复杂了
  • 拥有已知的最佳解决方案应该可以轻松调试代码。只需插入解决方案(修复变量)并检查冲突计数。
  • 好的,修复变量给了我这么大的客观价值......所以我的代码肯定有错误
  • 你包括了哪些处罚?当我手动计算时,我得到的数字比你高得多
  • @Yash 它是“下限”或最佳整数解决方案。当红线和蓝线相遇时,我们可以停下来:我们已经证明不存在更好的解决方案。由于这是一个 MIP 问题,我们不能直接使用 Simplex(仅适用于 LP)。
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
相关资源
最近更新 更多