【发布时间】:2021-03-10 06:08:50
【问题描述】:
当 Gurobi 只有一个可行的解决方案时,我如何获得变量的所有值? 例如: 最佳目标是 5 并且有四个值可以达到可行解,如下图。 [1, 2, 1, 1], [2, 1, 1, 1], [2, 1, 2, 0], [3, 0, 2, 0] 但是 Gurobi 只显示一个值,如下所示:
x[0]:3.0
x[1]:0.0
x[2]:2.0
x[3]:0.0
请告诉我如何获得所有价值。非常感谢!
【问题讨论】:
当 Gurobi 只有一个可行的解决方案时,我如何获得变量的所有值? 例如: 最佳目标是 5 并且有四个值可以达到可行解,如下图。 [1, 2, 1, 1], [2, 1, 1, 1], [2, 1, 2, 0], [3, 0, 2, 0] 但是 Gurobi 只显示一个值,如下所示:
x[0]:3.0
x[1]:0.0
x[2]:2.0
x[3]:0.0
请告诉我如何获得所有价值。非常感谢!
【问题讨论】:
假设您想列举 MIP 的所有最佳解决方案,您可以借助 PoolGap、PoolSolutions 和 PoolSearchMode 参数来实现。
PoolSolutions 参数确定在求解 MIP 时存储多少可行解。PoolGap 参数确定所有存储解决方案的允许间隙。将其设置为 0.0 以仅允许解决方案池内的最佳解决方案。PoolSearchMode 参数设置 MIP 树搜索的搜索模式。将其设置为2 以搜索n 最佳解决方案,其中n 只是为PoolSolutions 设置的值。这是一个最小的例子:
import gurobipy as gp
coins = [1, 2, 5, 10, 20, 50, 100, 200]
m = gp.Model()
x = m.addVars(8, vtype='I', name="x")
m.addConstr(sum(coins[i]*x[i] for i in range(8)) == 200)
# Parameters
m.Params.PoolSearchMode = 2
m.Params.PoolSolutions = 10**8
m.Params.PoolGap = 0.0
# Optimize
m.optimize()
# Iterate over all found solutions
for k in range(m.SolCount):
m.Params.SolutionNumber = k
print([var.Xn for var in m.getVars()])
【讨论】:
if all(var.Xn % 10 == 0 for var in m.getVars()):过滤找到的解决方案。或者,您可以添加一个额外的约束来强制执行x[i] == 10*k[i],其中k[i] 是一个整数变量。
x = modelname.addVars(path_number, lb=data_low, ub=data_up, vtype=GRB.INTEGER, name='x')