Python 在Gurobi中枚举解决方案
我有一个没有任何目标的LP问题,也就是说,看起来Ax你的方法当然是一个非常有效的方法来采样不同的解决方案。另一种可能的方法是枚举所有基本可行解(角点)。然而,这并不容易。这里有一个有趣的技巧:使用二进制变量对基(0=非基本,1=基本)进行编码,然后使用Gurobi解决方案池枚举所有可行的整数解决方案。这将为您提供所有基本可行的解决方案。有关详细信息,请参阅Python 在Gurobi中枚举解决方案,python,linear-programming,gurobi,Python,Linear Programming,Gurobi,我有一个没有任何目标的LP问题,也就是说,看起来Ax你的方法当然是一个非常有效的方法来采样不同的解决方案。另一种可能的方法是枚举所有基本可行解(角点)。然而,这并不容易。这里有一个有趣的技巧:使用二进制变量对基(0=非基本,1=基本)进行编码,然后使用Gurobi解决方案池枚举所有可行的整数解决方案。这将为您提供所有基本可行的解决方案。有关详细信息,请参阅 import gurobipy as gp import numpy as np def solve(A, B): model
import gurobipy as gp
import numpy as np
def solve(A, B):
model = gp.Model()
model.Params.OutputFlag = False
x = model.addVars(A.shape[1]).values()
for a, b in zip(A, B):
expr = gp.LinExpr(b)
expr.addTerms(a, x)
model.addConstr(expr <= 0)
expr = gp.LinExpr()
for x_ in x:
if np.random.random() < 0.5:
expr.add(x_)
else:
expr.add(-x_)
model.setObjective(expr, gp.GRB.MAXIMIZE)
model.optimize()
return np.array([x_.x for x_ in x])
n_constr = 6
n_var = 5
A = np.random.random((n_constr, n_var)) * 2 - 1
B = np.random.random((n_constr,)) * 2 - 1
for i in range(3):
print(solve(A, B))
[ 1.59465412 0. 0. -0.77579453 0. ]
[-1.42381457 0. 0. -7.70035252 -8.55823707]
[1.8797086 0. 0. 7.24494007 4.43847791]