Python实现VRP常见求解算法

您所在的位置:网站首页 Python路径优化代码 Python实现VRP常见求解算法

Python实现VRP常见求解算法

2024-07-14 17:49| 来源: 网络整理| 查看: 265

基于python语言,实现经典粒子群算法(DPSO)对车辆路径规划问题(CVRP)进行求解。

目录 优质资源1. 适用场景2. 求解效果3. 问题分析4. 数据格式5. 分步实现5. 完整代码参考

优质资源 python实现6种智能算法求解CVRP问题python实现7种智能算法求解MDVRP问题python实现7种智能算法求解MDVRPTW问题Python版MDHFVRPTW问题智能求解算法代码【TS算法】Python版MDHFVRPTW问题智能求解算法代码【SA算法】Python版MDHFVRPTW问题智能求解算法代码【GA算法】Python版MDHFVRPTW问题智能求解算法代码【DPSO算法】Python版MDHFVRPTW问题智能求解算法代码【DE算法】Python版MDHFVRPTW问题智能求解算法代码【ACO算法】Python版HVRP问题智能求解算法代码【GA算法】Python版HVRP问题智能求解算法代码【DPSO算法】 1. 适用场景 求解CVRP车辆类型单一车辆容量不小于需求节点最大需求单一车辆基地 2. 求解效果

(1)收敛曲线 在这里插入图片描述

(2)车辆路径 在这里插入图片描述

3. 问题分析

CVRP问题的解为一组满足需求节点需求的多个车辆的路径集合。假设某物理网络中共有10个顾客节点,编号为1~10,一个车辆基地,编号为0,在满足车辆容量约束与顾客节点需求约束的条件下,此问题的一个可行解可表示为:[0-1-2-0,0-3-4-5-0,0-6-7-8-0,0-9-10-0],即需要4个车辆来提供服务,车辆的行驶路线分别为0-1-2-0,0-3-4-5-0,0-6-7-8-0,0-9-10-0。由于车辆的容量固定,基地固定,因此可以将上述问题的解先表示为[1-2-3-4-5-6-7-8-9-10]的有序序列,然后根据车辆的容量约束,对序列进行切割得到若干车辆的行驶路线。因此可以将CVRP问题转换为TSP问题进行求解,得到TSP问题的优化解后再考虑车辆容量约束进行路径切割,得到CVRP问题的解。这样的处理方式可能会影响CVRP问题解的质量,但简化了问题的求解难度。

4. 数据格式

以xlsx文件储存网络数据,其中第一行为标题栏,第二行存放车辆基地数据。在程序中车辆基地seq_no编号为-1,需求节点seq_id从0开始编号。可参考github主页相关文件。

5. 分步实现

(1)数据结构 为便于数据处理,定义Sol()类,Node()类,Model()类,其属性如下表:

Sol()类,表示一个可行解 属性描述nodes_seq需求节点seq_no有序排列集合,对应TSP的解obj优化目标值routes车辆路径集合,对应CVRP的解 Node()类,表示一个网络节点 属性描述id物理节点id,可选name物理节点名称,可选seq_no物理节点映射id,基地节点为-1,需求节点从0编号x_coord物理节点x坐标y_coord物理节点y坐标demand物理节点需求 Model()类,存储算法参数 属性描述sol_list可行解集合,值类型为Sol()best_sol全局最优解,值类型为Sol()node_list物理节点集合,值类型为Node()node_seq_no_list物理节点映射id集合depot车辆基地,值类型为Node()number_of_nodes需求节点数量opt_type优化目标类型,0:最小车辆数,1:最小行驶距离vehicle_cap车辆容量pl可行解历史最优位置pg全局最优解历史最优位置v可行解更新速度Vmax最大速度w惯性权重c1学习因子c2学习因子

(2)文件读取

def readXlsxFile(filepath,model): # It is recommended that the vehicle depot data be placed in the first line of xlsx file node_seq_no = -1#the depot node seq_no is -1,and demand node seq_no is 0,1,2,... df = pd.read_excel(filepath) for i in range(df.shape[0]): node=Node() node.id=node_seq_no node.seq_no=node_seq_no node.x_coord= df['x_coord'][i] node.y_coord= df['y_coord'][i] node.demand=df['demand'][i] if df['demand'][i] == 0: model.depot=node else: model.node_list.append(node) model.node_seq_no_list.append(node_seq_no) try: node.name=df['name'][i] except: pass try: node.id=df['id'][i] except: pass node_seq_no=node_seq_no+1 model.number_of_nodes=len(model.node_list)

(3)初始种群

def genInitialSol(model,popsize): node_seq=copy.deepcopy(model.node_seq_no_list) best_sol=Sol() best_sol.obj=float('inf') for i in range(popsize): seed = int(random.randint(0, 10)) random.seed(seed) random.shuffle(node_seq) sol=Sol() sol.nodes_seq= copy.deepcopy(node_seq) sol.obj,sol.routes=calObj(sol.nodes_seq,model) model.sol_list.append(sol) model.v.append([model.Vmax]*model.number_of_nodes) model.pl.append(sol.nodes_seq) if sol.obj0: new_v.append(min(v_,model.Vmax)) else: new_v.append(max(v_,-model.Vmax)) new_x=[min(int(x[i]+new_v[i]),model.number_of_nodes-1) for i in range(model.number_of_nodes) ] new_x=adjustRoutes(new_x,model) model.v[id]=new_v new_x_obj,new_x_routes=calObj(new_x,model) if new_x_obj


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3