我试图使用pyscipopt来解决传统的ax-b+约束类型的问题。我有很多b值,我需要对每个b值运行优化器。如何重用设置?第二个问题,在pyscipopt中norm的等价物是什么?或者怎样才能使ax-b尽可能接近于零?看到了吗???以下标记

import numpy as np
from pyscipopt import Model, quicksum

def make_program():
    A = ... load constant master matrix ...
    model = Model('Match_to_Master')
    x = []
    y = []
    for i in range(A.shape[1]):
        x.append(model.addVar(vtype='C', lb=0.0, ub=4.0, name='x(%s)' % i))
        y.append(model.addVar(vtype='B', name='y(%s)' % i))
        model.addCons(x[i] <= y[i]*4)
    for i in range(0, A.shape[1] - 20, 20):
       model.addCons(quicksum(y[i:i+20]) <= 1)

    #b = Parameter(A.shape[0], nonneg=True) ???
    model.setObjective(norm(A*x - b), sense='minimize') ???
    return b, x, model


def run_program(data, thresh=0.2):
    b, x, model = make_program()
    B = ... from data load matrix for analysis ...
    c = 0
    for column in B.T:
        b.value = column   ???
        model.optimize()  # reuse previous x values as starting point
        x.value[x.value < thresh] = 0.0
        for i in range(0, x.value.size - 20, 20):
            sum = np.sum(x.value[i:i+20])
            if sum > 0.2:
                print('  hit at ', str(i//20), ' for column ', str(c))
        c += 1

最佳答案

好吧,我不认为你解决的是传统的ax-b类型的问题。传统类型是min ax-b ^2。你不需要scip。
如果您想求解b的多个值的程序,您应该相应地调整make_program函数。你似乎对积分解感兴趣。虽然lps对于不同的右手边有一些温暖的startign能力(使用双单纯形),但是整数程序没有这种能力。
不过,您仍然可以使用上一次运行的解决方案。使用

solution = model.createSol(None)

# for each nonzero variable
model.setSolVal(solution, var, val)

model.trySol(solution)

要创建解决方案,请设置其值并将其添加到模型中。
关于范数最小化,正如sascha所指出的,您只能最小化多面体范数,很可能是1/inf范数。在前一种情况下,您可以使用
最小Y_1+…+你+你1+…+桑姆
S.T.A X+Y-Z=B
Y,Z>=0
在后者中,您可以使用
闽D
S.T.A X+Y-Z=B
Y,Z>=0
d>=y,i=1,…,m
d>=z_i i=1,…,米
在这两种情况下,scip都不支持这种方式,因此您必须自己添加相应的变量/约束。
编辑:
关于2-范数:首先,注意2-范数的最小化将问题转化为一个混合整数非线性规划(minlp),具体地说,是一个混合整数二次问题(miqp)。因此,这个问题变得更难解决:)我不知道scip是否最适合这种情况(我听说过关于Pajarito的好消息)。不过,scip可以解决minlps问题。
要对范数建模,应该注意scip不支持非线性目标,只支持非线性约束。因此,模型应该是
最小Y_1+…+是的
S.T.(a x-b)^2-y您应该可以通过model.addConst(...)添加任意非线性约束。
根据表达的程度,pyscipopt会做正确的事情。
如果是2级约束,即,
model.addCons(x[i]*y[i] <= 0)

这意味着添加一个二次约束。
注意,这将最小化平方范数而不是范数。您将得到正确的解决方案,但目标值将被禁用。
另外,我认为在启用ipopt支持的情况下编译scip会有帮助/可能是必需的。ipopt是一个非线性程序(nlps)的求解器,它是minlps的松弛。

关于python - PySCIPopt的参数化向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56993384/

10-13 05:53