我已声明facility
的列表LpVariable
:
for fac in range (len(candidates)):
facility.append(LpVariable("Facility_{0}".format(fac),lowBound=0, upBound=1, cat= pulp.LpInteger ))
当我执行print(value(facility[i]))
时,它会将输出显示为None
,这是正常的,因为默认情况下所有LpVariables都具有None值。但是在我的代码中我想用0初始化。但是当我解决问题时,最优解可以有0到1之间的任何值。
如果我这样做:
for i in range (len(facility)):
facility[i] = 0
它将设置facility[i] = 0
(整数值,并且不再有LpVariable)。
如果我value(facility[i]) = 0.
,则会抛出错误
我应该如何初始化这些变量?
答案 0 :(得分:1)
您可以按here所述尝试facility[i].setInitialValue(0.)
。
请注意,PuLP会将此调用委托给您正在调用的解算器的API中的相应方法。因此,仅当解算器支持它时才会起作用。 Gurobi和CPLEX支持它,我不确定其他求解器。
答案 1 :(得分:1)
现在有一些有关如何在纸浆中执行此操作以及提供哪些求解器的文档。
https://coin-or.github.io/pulp/guides/how_to_mip_start.html
作为摘要,您需要对所需的值进行setInitialValue
,然后在求解器调用中设置mip_start
参数:
import pulp
# facility is a dictionary with LpVariable()
# model is an LpProblem()
facility[i].setInitialValue(0)
solver = pulp.PULP_CBC_CMD(msg=1, mip_start=1)
model.solve(solver)
某些求解器(例如CBC)需要完整的解决方案(至少在纸浆随附的当前版本中)。其他(CPLEX和GUROBI)可以修复不完整的解决方案。