PySCIPopt的参数化向量

时间:2019-07-11 16:13:47

标签: python scip mixed-integer-programming

我正在尝试使用PySCIPopt解决传统的Ax-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

1 个答案:

答案 0 :(得分:0)

好吧,我认为您要解决的不是传统的Ax-b型问题。传统类型是min | Ax-b | ^ 2。您不需要scip。

如果要为b的多个值求解程序,则应相应地调整make_program函数。您似乎对整体解决方案感兴趣。尽管LP在不同的右侧(使用对偶单纯形)具有一些热情的启动能力,但整数程序却没有这种能力。

仍然,您可以使用上一次运行的解决方案。使用

solution = model.createSol(None)

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

model.trySol(solution)

要创建解决方案,请设置其值并将其添加到模型中。

关于规范最小化,如sascha所指出的,您只能最小化多面体规范,最有可能是1 / inf规范。在前一种情况下,您可以使用

最小y_1 + ... + y_m + z_1 + ... + z_m

s.t。 A x + y-z = b

y,z> = 0

在后一种情况下,您可以使用

分钟d

s.t。 A x + y-z = b

y,z> = 0

d> = y_i,i = 1,...,m

d> = z_i i = 1,...,m

无论哪种情况,scip都不支持此功能,因此您必须自己添加相应的变量/约束。

修改:

关于2范数:首先,请注意2范数的最小化将问题转化为混合整数非线性程序(MINLP),特别是混合整数二次问题(MIQP) )。因此,问题变得更加难以解决:)我不知道在这种情况下SCIP是否最合适(我听说过Pajarito的好处)。尽管如此,SCIP仍可以解决MINLP。

要为规范建模,您应该注意SCIP不支持非线性目标,仅支持非线性约束。因此,模型应该是

最小y_1 + ... + y_m

s.t。 (A x-b)^ 2-y <= 0

您应该可以通过model.addConst(...)添加任意非线性约束 根据表达式的程度,pyscipopt将做正确的事。 如果是2级约束,即

model.addCons(x[i]*y[i] <= 0)

这意味着添加二次约束。

请注意,这将最小化平方范数而不是范数。您将获得正确的解决方案,但目标值将关闭。

此外,我认为在启用Ipopt支持的情况下编译scip可能会有所帮助。 Ipopt是非线性程序(NLP)的求解器,它是MINLP的松弛。