之前讲到过pulp的初步应用,接下来就讲一下pulp的进阶用法
一、建立多维变量(比如说三维),方法很多,这里只说明自己常用方法
x = 5
y = 6
z = 7
A = [(v,i,j) for v in range(x) for i in range(y) for j in range(z)] # 车辆k从客户i到客户j
model = pulp.LpProblem('VRPTW', sense=pulp.LpMinimize) # 最小问题
vehicle = pulp.LpVariable.dicts('vehicle', A, lowBound=0, upBound=1, cat=pulp.LpInteger) # 混合线性规划问题,针对多个变量可以放在列表内,调用pulp.LpVariable.dicts方法进行统一建立
二、 热启动(warm start)
给定你的初始解(必须是可行解才会提高效率,否则求解器会默认从开始寻找解)
只对部分求解器适用,glpk不允许输入初始解来加快求解效率
e.g.
for v in self.V:
for i,j in self.A:
if (v,i,j) in vehicle_initialval_list:
a = self.vehicle[(v,i,j)]
a.setInitialValue(1.0)
# a.fixValue() # 将这个值固定
elif v not in vehicle_info and i == 0 and j == (self.c_num+1):
a = self.vehicle[(v,i,j)]
a.setInitialValue(1.0)
# a.fixValue()
else:
a = self.vehicle[(v,i,j)]
a.setInitialValue(0.0)
# a.fixValue()
solver = pulp.PULP_CBC_CMD(warmStart=True, keepFiles=True) # 需要加上keepFiles这个参数,否则初试参数传入不成功;
model.solve(solver)
简而言之为setInitialValue()方法
三、求解参数
# pulp支持部分求解器api接口,
import pulp as pl
solver_list = pl.listSolvers() # 可以查看支持哪些求解器
solver_list = pl.listSolvers(onlyAvailable=True) # 可以看目前默认路径有哪些可用的求解器
# 拿pulp.PULP_CBC_CMD求解器来举例
# 这是PULP的内置CBC求解器,CMD可以理解为能够支持pulp调用的API
# 具体参数,只介绍几个常用参数
pulp.PULP_CBC_CMD(
timeLimit=90, # 求解时间限制
msg=True, # 是否显示求解日志
# path=path_to_cbc # 如果有其他求解器,可以把本地的位置传入即可执行
warmStar=True, # 支持热启动
)
四、解的输出
for i in A:
print(f'vehicle{i}', vehicle[i].value()) # 输出结果
print('status:', pulp.LpStatus[model.status]) # 输出求解状态
print("F(x) = ", pulp.value(model.objective)) # 输出目标函数结果
# 另一种结果输出方法
for v in self.model.variables():
print(v.name, "=", v.varValue)
别的应该没有什么了,如果有什么疑问可以留言进行提问
# 更新日期:2022.9.29,更新三-求解参数设置