0

我已经使用 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 作为目标传递?

4

1 回答 1

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

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

于 2022-01-06T19:03:41.953 回答