【问题标题】:Obtain all value while Gurobi has only one feasible solutions in Python在 Gurobi 在 Python 中只有一个可行的解决方案时获得所有价值
【发布时间】: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

请告诉我如何获得所有价值。非常感谢!

【问题讨论】:

    标签: python gurobi


    【解决方案1】:

    假设您想列举 MIP 的所有最佳解决方案,您可以借助 PoolGapPoolSolutionsPoolSearchMode 参数来实现。

    • 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()])
    

    【讨论】:

    • 你知道如何将 gurobi 的解设置为 10 的倍数而不是所有整数吗?例如 gurobi 的解有两个解,如下: [10,20,50,70] [55,79,30,80] 我只想输出只包含 10 倍数的解,请告诉我怎么做我得到了解决方案。非常感谢!
    • 您可以在打印之前通过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')
    • @Zying 既然你已经问了一个单独的问题here,我建议你在那里提供一个最小的例子。
    • 最小的例子已经上传到另一个issue了。如果你有解决方案,请告诉我。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2023-01-03
    相关资源
    最近更新 更多