遗传算法求解带时间窗的VRP问题(python)

来来来,继续学习物流路径优化问题,这次是带时间窗的VRP问题。
以城市生鲜食品冷链物流配送中心选址及路径优化问题研究为学习材料。以下遗传算法的数据均来源于该文献。

1.问题描述

一般的VRPTW问题(带时间窗的车辆优化调度问题)可描述为: 一个配送中心或车场(发车点),z个客户 (1, 2,⋯, z),第 i个客户的货运量为 g,使用载重量相同的货车( 车速为 v, 车载量为Q )完成货物需求点的配送任务。每个任务都有最早送达时间 ET,和最迟送达时间 LT 。每个需求点的需求量均小于配送货车的载重量( g < Q), 且要求只由一辆货车一 次运送完成,但允许一辆车一次运输可完成多个任务;配送中心和各客户点位置已知,各点之间的距离也已知; 所有配送车辆均从配送中心出发,完成运送任务后返回配送中心。现要求在满足所有任务时间窗约束和车辆载重量约束的情况下,如何安排车辆运输路线,使得总费用最小。

城市生鲜食品冷链物流配送中心选址及路径优化问题研究下层模型中总的运输成本=车辆的固定使用成本+车辆运输成本+时间窗的惩罚成本+货损成本。数学模型的目标函数是求总运输成本最小化,所以遗传算法的适应度函数就是总运输成本的倒数。

2.确定遗传算子的编码规则

2.1染色体的编码方式

采用整数编码,染色体的个数是配送需求点的数量。生成的初始种群中的每条染色体都应该是可行解,求解的问题中只有车辆数不能超过配送中心可支配的最大车辆数限制这一个硬性的约束条件,所以采用get_feasible_route函数保证随机生成的染色体形成的车辆路线在最大车辆数范围内。

def set_codeForm(Popsize):demand_node_num = Data_class.demand_node_numpopulation = np.zeros((Popsize, demand_node_num), dtype=int)for i in range(Popsize):while 1:population[i, :] = random.sample(range(1, demand_node_num+1), demand_node_num)if get_feasible_route(population[i, :]):breakreturn population
def get_feasible_route(chrom):individual = copy.deepcopy(chrom)split_flag_node = Truetotal_path_list = []vehicle_capacity_max = Data_class.vehicle_capacity_maxdemand_quantity = Data_class.demand_quantityvehicle_num = Data_class.vehicle_numwhile split_flag_node:vehicle_load_list = demand_quantity[0, individual]cumsum_list = np.cumsum(vehicle_load_list)if len(np.where(cumsum_list > vehicle_capacity_max)[0]) != 0:split_flag_node = np.where(cumsum_list > vehicle_capacity_max)[0][0]else:split_flag_node = Falsepath_list = [0] * (len(individual) + 2)path_list[1:-1] = copy.deepcopy(individual)total_path_list.append(path_list)if split_flag_node:path_list = [0] * (split_flag_node + 2)path_list[1:-1] = copy.deepcopy(individual[:split_flag_node])total_path_list.append(path_list)individual = individual[split_flag_node:]if len(total_path_list) > vehicle_num:# 生成的车辆路线数量超过了配送中心可以调配的实际车辆数return []else:return total_path_list

2.2选择算子

采用锦标赛选择

def select(population, fitness):# 进行选择操作Popsize = Data_class.Popsize# 二复本锦标赛选择方法new_population = np.zeros((Popsize, demand_node_num), dtype=int)new_fitness = []for i in range(Popsize):index = random.choices(list(range(Popsize)), k=2)if fitness[index[0]] < fitness[index[1]]:new_population[i, :] = population[index[1], :]new_fitness.append(fitness[index[1]])else:new_population[i, :] = population[index[0], :]new_fitness.append(fitness[index[0]])# 精英保留策略new_population[np.argmin(new_fitness), :] = population[np.argmax(fitness), :]return new_population

不知道自己对锦标赛选择的理解是不是对的,上面代码的实现过程是随机选择两个染色体,通过比较它们的适应度函数值的大小,保留较大值作为下一代种群的染色体,重复该选择操作Popsize次,Popsize为种群的规模也就是染色体的总数。同时采取精英保留策略,保存上一代种群中适应度函数值最大的染色体,替换掉已经选中的种群中的最差的染色体。

2.3交叉算子

交叉算子参考简书上面的文章:遗传算法实践(九) VRP问题

本文交叉操作思想和上图的交叉操作不同的是:不是选择生成的子路径中代价最小的,而是通过get_feasible_route函数实现自动生成路径,直接添加到已经从父代1选中的子路径后面。

def crossover(population):# 是否进行交叉操作由交叉概论决定Popsize = Data_class.PopsizePc = Data_class.Pcfor i in range(Popsize):r = random.random()if r > Pc:continuewhile 1:# 随机选择两条染色体,进行交叉操作index = random.choices(range(Popsize), k=2)chrom1 = population[index[0], :]chrom2 = population[index[1], :]routes1 = get_feasible_route(chrom1)# 随机选择父代1的一条路径ind1 = routes1[random.choice(range(len(routes1)))]ind1_index = []ind2 = copy.deepcopy(chrom2)for j in ind1[1:-1]:ind1_index.append(ind2.tolist().index(j))nodes = chrom2[list(set(range(len(chrom2))) - set(ind1_index))]route_list = get_feasible_route(nodes)if len(route_list) != 0 and (len(route_list) <= Data_class.vehicle_num-1):breaknew_route = ind1[1:-1]for route in route_list:new_route += route[1:-1]population[index[0], :] = new_routepopulation[index[1], :] = new_routereturn population

2.4变异算子

变异算子参考城市生鲜食品冷链物流配送中心选址及路径优化问题研究中的变异算子

def mutate(population):# 采用逆转变异Popsize = Data_class.PopsizePm = Data_class.Pmfor i in range(Popsize):r = random.random()# 变异概率决定该轮循环是否进行变异操作if r > Pm:continuechrom = population[i, :]while 1:index = random.choices(range(demand_node_num), k=2)ind = chrom[index[0]:index[1]]chrom[index[0]:index[1]] = ind[::-1]if get_feasible_route(chrom):breakpopulation[i, :] = chromreturn population

3.结果展示

遗传算法的相关参数设置:种群规模100,交叉概率0.85,变异概率0.15,最大迭代次数300。
运行python3程序,运行环境为win64,pycharm2019.3.2,在某一次运行中得到的算例结果如下(手算检验该结果也是正确的):
最优解结构:[ 9 11 10 3 12 13 1 2 5 15 8 7 4 6 14]
最优车辆运行路线为:[[0, 9, 11, 10, 3, 0], [0, 12, 13, 1, 2, 0], [0, 5, 15, 8, 7, 0], [0, 4, 6, 14, 0]]
车辆的使用成本:1200
车辆的运输路线成本: 6538.0
时间窗的惩罚成本: 678.0
货损成本: 2370.305
总运输成本: 10786.305

4.小结

感觉选择操作、交叉操作和变异操作的方法还不是很好,三种算子的处理还需要改进。

参考文献:
1.matlab智能优化算法30个案例.pdf
(关注公众号,获得百度网盘的提取码就能看了,本人就是这么得到的^ * ^)
2.遗传算法实践(十) VRPTW问题求解https://www.jianshu.com/p/ca9a7cde6532

3.将python文件加入到python的环境变量中https://www.cnblogs.com/beginner-boy/p/9052483.html
4.全局变量的最佳实践https://zhuanlan.zhihu.com/p/43808665
5.python 获取当前目录,上级目录,上上级目录
https://blog.csdn.net/We_are_family678/article/details/82593944?utm_source=distribute.pc_relevant.none-task
6.python遗传算法工具箱:https://www.zhihu.com/question/60545629?sort=created
7.【算法】超详细的遗传算法(Genetic Algorithm)解析https://www.jianshu.com/p/ae5157c26af9
8.常用的选择策略https://www.cnblogs.com/legend1130/archive/2016/03/29/5333087.html

遗传算法求解带时间窗的VRP问题(python)相关推荐

  1. 【TWVRP】基于matlab遗传算法求解带时间窗且车辆速度车辆路径规划问题【含Matlab源码 2094期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  2. 【路径规划】基于遗传算法求解带时间窗车辆路径规划问题(VRPTW)matlab源码

    1 简介 有时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows,VRPTW)因为其有重要的现实意义而备受关注.其时间窗即为客户接受服务的时间范围, ...

  3. 多智能体进化算法求解带时间窗的VRP问题(python)

    作者:Logintern09 发布时间:2022年8月19日12时 出处:CSDN博客 专栏:<智能优化算法> 前言:研究学习文献<带时间窗VRP问题的多智能体进化算法>,掌握 ...

  4. 【路径规划】基于遗传算法求解带时间窗多电动车充电路径规划问题附matlab代码

    1 简介 电动车在物流领域中取代燃油车是一个广泛的发展趋势.但电动车的电池利用率低,充电时间长,相关充电配套设施建设不完善,存在"续驶里程焦虑"等现象成为了电动车推广和应用的重要制 ...

  5. 【TWVRP】遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  6. 禁忌搜索算法求解带时间窗的车辆路径问题原理讲解

    前言 今天为大家带来用禁忌搜索算法(下文简称TS)求解带时间窗的VRP问题(下文简称VRPTW). 下面带大家体会TS的思想.以VRPTW为例,VRPTW的解的形式为每辆车所经过的顾客,比如说有15个 ...

  7. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题(总成本最低)【含Matlab源码 2590期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  8. 0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题...

    蚁群算法求解VRPTW问题https://www.zhihu.com/video/1235315908018298880 今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题. ...

  9. 【路径规划】基于粒子群算法求解带时间窗的车辆路径规划问题VRPTW模型matlab源码

    1 模型简介 将粒子群算法(PSO)应用于带时间窗车辆路径优化问题(VRPTW),构造车辆路径问题的粒子表达方法,建立了此问题的粒子群算法,并与遗传算法作了比较.实验结果表明,粒子群算法可以快速,有效 ...

  10. java随机数时间窗_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题

    今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题.在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后 ...

最新文章

  1. spark1.1.0学习路线
  2. s5pv210运行裸机程序的方法之在SDRAM(DDR2)中运行
  3. markdown 流程图js_科学网—让Markdown支持ASCII流程图和JavaScript流程图 - 李继存的博文...
  4. Cocoa原理指南-学习和实践1
  5. java swing实现简单图片显示(测试生成图片快捷方式)
  6. 长隆大马戏机器人_惊艳亮相广州长隆,智伴儿童机器人1X成行业焦点
  7. DDD专家张逸:构建领域驱动设计知识体系
  8. C# 代码调整屏幕分辨率
  9. Discuz常见小问题-如何为每个板块设置不同的图标
  10. 在Java中编写实现_在运行时编写和实现新的Java类文件
  11. 监控某个dll被修改_浅谈动力环境监控系统技术标准
  12. 无法从“cstring”转换为“lpcstr”_别用Sketchup一个个转模型的版本了,用这些批量转换器真香…...
  13. maxscale跨库分片的限制
  14. cmd命令行查看wifi密码
  15. 用于自动驾驶的实时联合目标检测和语义分割网络
  16. 小宁百度了php一句话用菜刀,web学习01day攻防世界web简单题
  17. 点线面的意义_【干货】设计中的点线面到底有什么用?
  18. inspects a maven model for resolution problems
  19. c语言单片机温度调节系统设计,基于单片机的温度控制系统的设计
  20. SCAU 2018 初出茅庐 题解

热门文章

  1. 盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究
  2. win7安装mysql后“应用程序无法启动因为应用程序的并行配置不正
  3. 电脑爱好者 2008年第24期 12月下
  4. android搜狗输入法广告,Android 搜狗输入法 v8.12 去广告纯净版
  5. 社会工程学案例调研和研究
  6. 双光耦开关电源电路图_简单的开关电源电路图大全(六款简单的开关电源电路设计原理图详解)...
  7. 获取人脸图片和训练人脸
  8. android qq下载路径,手机qq下载的文件在哪个文件夹 查找路径解答
  9. 信杂比公式_信噪比公式
  10. 单片机ADC分压电阻测量直流电压