【问题标题】:How to obtain multiple solutions in CPLEX for a UBQP如何在 CPLEX 中为 UBQP 获得多个解
【发布时间】:2017-02-11 13:37:51
【问题描述】:

我已经在 C 中的 Callable Library 中的 CPLEX (v 12.6.2) 中实现了一个 UBQP(这是一个没有约束和二进制变量的二次问题),我有兴趣获得多个解决方案(不仅是最优的,但也有其他可行的)。

我采用了 CPLEX 原始 populate.cpp 代码并获取其例程以获得解决方案池,例如 CPXpopulate(env,lp)。

问题在于我的解决方案池的大小始终为 1,它只包含最优值。 相反,如果我给 populate.cpp 一个 LP 问题(即最小化线性问题)它可以正常工作。

我尝试了常用的命令:

 status = CPXsetdblparam (env, CPXPARAM_MIP_Pool_RelGap, 0.5);
 status = CPXsetintparam (env, CPXPARAM_MIP_Pool_Capacity, 25);
 status = CPXsetintparam (env, CPXPARAM_MIP_Pool_Replace, 1);
 status = CPXsetdblparam (env,CPXPARAM_Simplex_Tolerances_Feasibility,0.01);    
 status = CPXsetdblparam (env, CPXPARAM_MIP_Tolerances_Integrality,   0.01);
status = CPXsetintparam (env, CPXPARAM_MIP_Pool_Intensity, N);

这应该会强制 CPLEX 生成更多解决方案,但事实并非如此。

如果我在 CPXPARAM_MIP_Pool_Intensity 中设置 N = 4(即最大值),它无法优化,但如果设置 N = 0,...,3 我得到的解决方案不会超过 1 个。

有没有办法在这类问题中获得多个解决方案?

【问题讨论】:

  • 有一个技术说明here 很旧,但有一些有用的指示。您是否尝试过在交互中使用populate(以确保获得相同的结果)?
  • 为了让其他人可以仔细查看,您可以考虑通过像filedropper.com 这样的文件共享网站在此处共享您的模型(例如,以 SAV 格式)。
  • @rkersh 使用交互式中的 populate 会导致 3 个解决方案而不是 1 个。其他 2 个解决方案是微不足道的:000...0 和 111...1,它们肯定不是我需要的,我记得在 Callable Library 中也找到了它们,将一些参数设置为我不记得的某个值。我并不认为我已经正确实施了该技术说明中所写的内容,但是现在我可以获得多种解决方案(基本上,添加约束以迫使现任者进行更改并执行循环)。现在的问题是我看到的执行时间比我预期的要长很多!
  • 虽然填充的工作时间非常快(即使它只给了我一个解决方案),但上述算法非常慢。在条件相同的情况下,填充运行时间不到 100 毫秒,而该算法需要 70.000 毫秒以上!
  • 在不了解您的特定型号的情况下很难对性能发表任何看法。技术说明确实提到枚举所有解决方案和/或使用替代方法可能很耗时。

标签: c optimization cplex quadratic-programming


【解决方案1】:

为了使用 CPLEX 获得大量可行解,您应该使用 CPLEX.populate() 而不是 CPLEX.solve()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多