如何使用 PySCIPOpt 解决仅可行性问题



我已经使用CVXPY及其一些LP求解器来确定A*x <= b问题的解决方案是否可行,现在我想尝试PySCIPOpt。 我在文档中找不到这方面的示例,并且我无法找出正确的语法。 使用CVXPY,代码很简单:

def do_cvxpy(A, b, solver):
x = cvxpy.Variable(A.shape[1])
constraints = [A@x <= b] #The @ denotes matrix multiplication in CVXPY
obj = cvxpy.Minimize(0)
prob = cvxpy.Problem(obj, constraints)
prob.solve(solver=solver)
return prob.status

我认为使用 PySCIPOpt 不能使用上述矩阵表示法,而必须将向量和矩阵视为标量变量的集合,每个变量都必须单独添加,所以我尝试了这个:

def do_scip(A, b):
model = Model("XYZ")
x = {}
for i in range(A.shape[1]):
x[i] = model.addVar(vtype="C", name="x(%s)" % i)

model.setObjective(0)  #Is this right for a feasibility-only problem?
model.addCons(A*x <= b) #This is certainly the wrong syntax
model.optimize()
return model.getStatus()

谁能帮我解决此类问题的 addCons() 约束的正确形式,并确认询问解决方案是否可行的一种可接受的方法是简单地传递 0 作为目标?

我仍然对 setObjective(0) 不肯定,但至少我可以通过"解包"A矩阵和b向量并将每个元素添加为约束来让代码正常运行:

for i in range(ncols):
for j in range(nrows):
model.addCons(A[j,i]*x[i] <= b[i])

我还发现 CVXPY 实际上有一个 SCIP 接口,但是当我尝试使用它时它给了我一个错误:

getSolObjVal cannot only be called in stage SOLVING without a valid solution

这似乎表明该接口不能仅用于可行性问题。

最新更新