当前位置: 首页 > 工具软件 > Pulp > 使用案例 >

算法--运筹规划--pulp(二)

耿招
2023-12-01

之前讲到过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,更新三-求解参数设置

 类似资料: