Python 纸浆加罚
Python pulp adding a penalty
目前我正在研究纸浆线性空气最小化问题。变量 X
等于本题中一列数字的总和。如果 X 为正,则不应向 objective 添加罚分。但是,如果 X
为负数,则应将其添加到 objective 的惩罚中。这意味着在这种情况下 Penalty
应该等于 -X
。
例如:
X = lpvariable('X'-1000,1000,cat='Integer')
Penalty =lpvariable('Penalty', 0,1000,cat='Integer')
prob += Penalty # Objective
prob += 10 + 11 + -2 + -4 == X
在这种情况下 X=15
和 Penalty=0
然而当总和为
prob += -10+11-2-4 ==X
变量X=-5
,惩罚应该是Penalty = 5
有人可以帮我解决这个问题吗?
非常感谢。
您缺少的是对 Penalty
的约束。您几乎已经说出了您的问题中需要的内容。
您想强制 Penalty
成为 >=
到 -X
。
当 X
为正时,这将不起作用 - Penalty
的下限已经为零,因此添加另一个 -X
的下限,其中 X
是正数什么都不做。
当 X
为负时,它会执行您想要的操作:
from pulp import *
X = LpVariable('X',-1000,1000,cat='Integer')
Penalty =LpVariable('Penalty', 0,1000,cat='Integer')
prob = LpProblem ("MinimisePenaltye", LpMinimize)
prob += Penalty # Objective
prob += Penalty >= -X
prob += X == -15
prob.solve()
# Dislay the optimums of each var
for v in prob.variables ():
print (v.name, "=", v.varValue)
Returns
Penalty = 15.0
X = -15.0
目前我正在研究纸浆线性空气最小化问题。变量 X
等于本题中一列数字的总和。如果 X 为正,则不应向 objective 添加罚分。但是,如果 X
为负数,则应将其添加到 objective 的惩罚中。这意味着在这种情况下 Penalty
应该等于 -X
。
例如:
X = lpvariable('X'-1000,1000,cat='Integer')
Penalty =lpvariable('Penalty', 0,1000,cat='Integer')
prob += Penalty # Objective
prob += 10 + 11 + -2 + -4 == X
在这种情况下 X=15
和 Penalty=0
然而当总和为
prob += -10+11-2-4 ==X
变量X=-5
,惩罚应该是Penalty = 5
有人可以帮我解决这个问题吗?
非常感谢。
您缺少的是对 Penalty
的约束。您几乎已经说出了您的问题中需要的内容。
您想强制 Penalty
成为 >=
到 -X
。
当 X
为正时,这将不起作用 - Penalty
的下限已经为零,因此添加另一个 -X
的下限,其中 X
是正数什么都不做。
当 X
为负时,它会执行您想要的操作:
from pulp import *
X = LpVariable('X',-1000,1000,cat='Integer')
Penalty =LpVariable('Penalty', 0,1000,cat='Integer')
prob = LpProblem ("MinimisePenaltye", LpMinimize)
prob += Penalty # Objective
prob += Penalty >= -X
prob += X == -15
prob.solve()
# Dislay the optimums of each var
for v in prob.variables ():
print (v.name, "=", v.varValue)
Returns
Penalty = 15.0
X = -15.0