使用PuLP
和CBC
在python中使用LP模型。该模型有很多约束条件,当然其中许多都是多余的。我将展示一个例子。
#import libraries
from pulp import LpVariable, LpProblem, LpMaximize, lpSum, LpConstraint, LpStatus, value
prob = LpProblem("test_model", LpMaximize)
set_pt=[i for i in range(100)] #set of var
var = LpVariable.dicts("var",set_pt,lowBound=0,cat='Continuous')
# The objective function is added to 'prob' first
prob += lpSum([var[i] for i in set_pt]), "f(v)"
#constraits
for i in set_pt:
prob += LpConstraint(var[i] <= 300000), "max margin "+str(i)
prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i)
#solve
prob.writeLP("price_mod2.lp")
print 'solver begin'
prob.solve()
# The status of the solution is printed to the screen
print "Status:", LpStatus[prob.status]
结果是:
solver begin
Status: Infeasible
当然,在这个例子中,两个约束显然是多余的,并且在解决这个问题时,更难以看到约束的冗余。
我不知道问题是否与解算器(CBC
)有关,所以我可以使用CPLEX
代替并解决冗余约束的问题,或问题是{{1我需要使用另一个库。或者我可能需要对问题进行建模以使其成为冗余证明。
任何指导? 谢谢!
编辑我尝试使用PuLP
开放解算器(在excel中)并且它有效,所以我认为这必须是CBC
中实现的问题,或者也许我做错了,或者可能无法在PuLP
答案 0 :(得分:1)
我没有使用纸浆,所以我无法解释这里的内部结构(这会使你的情况失败),但你正在以错误的方式使用纸浆的约束机制。
for i in set_pt:
prob += LpConstraint(var[i] <= 300000), "max margin "+str(i)
prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i)
for i in set_pt:
prob += var[i] <= 300000, "max margin "+str(i)
prob += var[i] <= 30000000000, "ma2 margin "+str(i)
LpConstraint
;需要导入)for i in set_pt:
prob += LpConstraint(var[i], LpConstraintLE, 300000), "max margin "+str(i)
prob += LpConstraint(var[i], LpConstraintLE, 30000000000), "ma2 margin "+str(i)
后者更像是您最初的方法。但是你的用法看起来不像函数所期望的那样(参见docs)