假设我的PuLP定义中有一组决策变量:
vals = [-v for k, v in (DecisionVars.items())]
我想创建一个与所有约束之和的绝对值有关的约束。像这样:
for i in range(len(DecisionVars)):
prob += lpSum(abs(vals[:i+1])) <= some_limit, "Absolute constraint"
但是我似乎无法将abs()
运算符应用于约束吗?
更新
好的,如果我利用sum of absolute values constraint in semi definite programming中的信息,那么我的问题可以用不同的方式表达。我正在尝试评估:
abs(x1) + abs(x2) + abs(x3) <= some_limit
正如上面的链接所指出的,答案可能是创建向量x的1范数(其中x是上述决策变量的向量)。我可以看到numpy
有numpy.linalg.norm
,但是我看不到它如何在PuLP中递归地创建我的约束集。我正在努力使用lpSum
创建正确的语法。
答案 0 :(得分:1)
每个变量正确
X1
创建两个新的非负变量Y1
和Z1 >=0
然后设置一个约束
X1 == Y1 - Z1
然后您的吸收约束变为
Y1 + Z1 +.... <= 10
答案 1 :(得分:0)
您需要为每个绝对变量设置另一个变量和两组约束。
m += xn <= tn
m += -xn <= tn
那么tn的和就是xn的绝对值的和。