5.2.9. MILP的解池

MindOpt 在求解混合整数规划问题的过程中,可能会找到多个可行解。MindOpt 为用户提供解池(Solution Pool)功能,帮助用户了解求解过程中实际找到的解的个数,以及帮助用户获取这些解。

5.2.9.1. 解个数的设置与获取

用户可以通过设置参数 MIP/SolutionPoolSize 的值,例如设为n,促使 MindOpt 在求解过程中尽力寻找n个可行解。 在问题求解完成后,用户可以通过属性 SolCount 了解 MindOpt 实际找到的可行解的个数。

5.2.9.2. 获取第k个解

解池中的解是从好到坏排列的。在问题求解完成后,用户可以这样获得第k个次优解:首先,设置参数 SolutionNumber 的值为k,然后,通过属性 Xn 获得第k个解。 此外,用户在设置 SolutionNumber 时应注意不要超过 SolCount 的值。以Python为例:

from mindoptpy import *

model = read('problem.mps')
model.setParam(MDO.Param.MIP_SolutionPoolSize, 10)
model.optimize()

firstVar = model.getVars()[0]

if (model.status == MDO.Status.OPTIMAL):
    print("Best solution for first variable: {}".format(firstVar.X))

if (model.status in (MDO.Status.OPTIMAL, MDO.Status.SUB_OPTIMAL)):
    print("Found {} suboptimal solution(s)".format(model.SolCount))

for i in range(model.SolCount):
    model.setParam(MDO.Param.SolutionNumber, i)
    print("  The kth (k = {}) suboptimal solution for first variable is {}".format(i, firstVar.Xn))