我有一个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
答案 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]
编辑:查看并运行代码后,我们发现了问题所在:
代码仅设置绝对间隙参数,还应该设置相对间隙参数。
代码设置了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)