在Python的PuLP中,线性规划约束可以转化为弹性子问题。
当然,目标值是这个子问题的最优解,但弹性化的整个重点在于我们认为这个解可能是不可行的。
如何将子问题纳入整个问题?我尝试将其添加到问题中,就像添加约束一样,但这会引发类型错误。我尝试将其放在目标函数中,但这也不起作用。
我在上面的文档或这里托管的示例中找不到任何东西:
http://www.coin-or.org/PuLP/pulp.html?highlight=lpsum#elastic-constraints
解决子问题可以优化距离目标值的距离。当然,目标值是这个子问题的最优解,但弹性化的整个重点在于我们认为这个解可能是不可行的。
如何将子问题纳入整个问题?我尝试将其添加到问题中,就像添加约束一样,但这会引发类型错误。我尝试将其放在目标函数中,但这也不起作用。
我在上面的文档或这里托管的示例中找不到任何东西:
https://code.google.com/p/pulp-or/wiki/OptimisationWithPuLP?tm=6
这是我制定的子问题:
capacity = LpConstraint(e=lpSum([ x[m][n] * len(n.items) for n in N ]),
sense=-1, rhs=30, name=str(random.random()))
stretch_proportion = 30/50
elasticCapacity = capacity.makeElasticSubProblem(penalty=50,
proportionFreeBoundList=[1,stretch_proportion])
这是我认为最接近将其纳入LP目标的方法:
def sub(m):
capacity = LpConstraint(e=lpSum([ x[m][n] * len(n.items) for n in N ]),
sense=-1, rhs=30, name=str(random.random()))
stretch_proportion = 30/50
elasticCapacity = capacity.makeElasticSubProblem(penalty=50,
proportionFreeBoundList=[1,stretch_proportion])
elasticCapacity.solve()
return elasticCapacity.isViolated()
...
prob += lpSum( [ x[m][n] * reduce(op.add, map(D2, [i.l for i in n.items], [j.l for j in n.items]))\
for n in N for m in M ] ) + 50 * sub(m)