如何增加Cplex解决方案的数量?

时间:2020-03-19 14:26:35

标签: python-3.x cplex docplex

我有一个this复杂模型,具有1个binay变量(x_i)。现在,我有2个关于其复杂解决方案的问题(我将它们放在一篇文章中,因为它们是相关的。)

首先:对于我的模型,我有26个解决方案,但我知道实际上有更多解决方案。如何在cplex中生成解决方案?有什么办法可以增加解决方案的数量?

第二:我想使用解决方案池访问所有解决方案,但是当我尝试打印所有解决方案时,它会打印所有现有变量(显然,我只需要等于1)及其值。

这是我的解决方案池代码:

typealias MyMap = Map<MyEntry, String>

这是我输出的一部分:

Private Sub Bgw_GetTasks_DoWork(sender As Object, e As DoWorkEventArgs)
    TasksDS = GetDataFromSQL("[dbo].[GetTasks]")
End Sub

1 个答案:

答案 0 :(得分:3)

我猜您是从the example in the documentation获取参数设置的?这些参数将使CPLEX枚举所有最优解决方案。如果要使用所有解决方案,则必须将解决方案池差距设置为非常大的值。

CPLEX有很多生成解决方案的方法,但大致上遵循了启发式方法增强的标准分支和绑定方案。

当然,解决方案的每个变量都有一个值。如果只需要某些变量,则可以使用Python提供的各种过滤和理解类型。例如,要获取解决方案中二进制变量的索引为1,您可以执行以下操作:

indices = [j for j, a in enumerate(cpx.solution.pool.get_values(i)) if a > 0.5]

编辑:查看并运行代码后,我们发现了问题所在:

  1. 代码仅设置绝对间隙参数,还应该设置相对间隙参数。

  2. 代码设置了cpx.solnpoolintensity = 4之类的参数。这不是设置参数的正确方法。该语句将在对象中创建一个新属性,其余代码将忽略该属性。

设置用于枚举(最多)4000个解决方案的参数的正确方法是

cpx.parameters.mip.pool.intensity.set(4)
cpx.parameters.mip.pool.absgap.set(1e75)
cpx.parameters.mip.pool.relgap.set(1e75)
cpx.parameters.mip.limits.populate.set(4000)