我正在尝试使用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
答案 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的松弛。