有时间窗车辆路径问题(vehicle routing problems with time windows,VRPTW)学习实践与base案例代码开发

有时间窗车辆路径问题(Vehicle Routing Problems with Time Windows,VRPTW)是一类著名的组合优化问题,涉及在有限时间窗口约束下,有效地安排多个车辆的路径,以满足客户需求。

在VRPTW中,假设有一个中央仓库和一组客户节点,每个节点有特定的需求量、服务时间窗口和时间窗宽度。问题的目标是在满足以下约束条件前提下,找到一组最佳路径:

  • 每个节点只能在其时间窗口内进行服务。
  • 车辆在仓库出发,并返回仓库,且不超过车辆的最大行驶距离和容量限制。
  • 所有客户需求量得到满足。

VRPTW是一个NP-hard问题,难以在多项式时间内获得精确解。因此,通常使用启发式和元启发式算法来近似求解。

下面是一些常用的求解VRPTW的方法:

  1. 基于启发式算法的方法:这类方法使用启发规则来指导路径的构建。例如,最近邻规则、最远插入规则、最优插入规则等。它们逐步构建路径,每次选择一个节点进行插入,直到所有节点都被插入路径中。

  2. 遗传算法和进化算法:这些算法利用基因编码和进化操作(如交叉、变异)进行全局搜索。通过利用优秀解的性质,逐代优化路径的质量。

  3. 禁忌搜索算法:该算法通过跳出局部最优解的搜索过程,基于禁忌表和禁忌策略来避免重复搜索相似的解。

  4. 模拟退火算法:这是一种随机搜索优化算法,模拟了物质在退火过程中的行为。通过渐进降低温度和接受劣质解的概率,逐渐搜索到全局最优解。

  5. 其他元启发式算法:如蚁群算法、粒子群算法、人工免疫算法等,这些算法模拟自然界的行为和现象,用于搜索和优化问题。

VRPTW的求解方法需要根据问题的规模和复杂性选择合适的算法。解决VRPTW不仅仅是求解最优路径,还需要进行路径规划、资源配置和优化调度,以提高效率和满足时间约束。

不同的求解方法原理不同,适用场景也会有所差异,这里做了简要的总结分析:

  1. 启发式算法:启发式算法是一种基于经验的方法,通过设计一些规则或策略来指导路径的构建。例如,最近邻规则会选择距离当前节点最近的下一个节点进行插入。它们的优点包括简单易实现、计算效率高,能够在短时间内找到接近最优的解。然而,启发式算法往往局限于局部搜索,可能会陷入次优解,不保证找到全局最优解。

  2. 遗传算法和进化算法:遗传算法通过模拟自然界的生物进化过程,利用交叉和变异等进化操作,对路径进行全局搜索。其优点在于对多个解进行并行搜索,能够避免陷入局部最优解。然而,由于遗传算法需要进行大量的解的评估和选择操作,计算复杂度较高,并且不保证获得最优解。

  3. 禁忌搜索算法:禁忌搜索通过记忆搜索历史和禁忌策略来避免陷入局部最优解,并探索更广阔的搜索空间。其优点是具有较强的全局搜索能力,能够在有限的搜索时间内找到较好的解。然而,禁忌搜索算法选择何时解禁,以及禁忌表的更新策略等设计都需要进行仔细调整,不同的问题可能需要不同的禁忌思路。

  4. 模拟退火算法:模拟退火算法通过使用随机扰动和接受劣质解的策略,模拟物体退火时温度的下降过程,有助于跳出局部最优解。它的优势在于全局搜索能力较强,能够在搜索空间中更广泛地探索。然而,模拟退火算法的效果高度依赖于退火参数的设置,对于复杂问题可能需要长时间的搜索才能找到较好的解。

  5. 其他元启发式算法:蚁群算法、粒子群算法、人工免疫算法等元启发式算法根据模拟自然界的行为或现象进行路径搜索和优化。它们具有较强的全局搜索能力和适应性。然而,它们的参数设置相对复杂,计算开销较高,对于问题规模较大的情况可能不适用。

需要根据具体的问题和需求选择适当的求解方法。对于简单任务和较小的问题规模,启发式算法可能已足够满足要求;而对于复杂任务和大规模问题,进化算法、禁忌搜索或元启发式算法可能更适用。此外,可以结合多种算法进行问题求解,如启发式算法与禁忌搜索的结合使用,以充分发挥各自的优点。

最近有一个小问题可能跟这块的解决思路是一致的,就想着抽点时间先来看下VRPTW相关的知识内容,基于实际的数据来做些实践性质的工作。

实例数据集如下所示:

参数定义:

capacity = 200
temperature=1000
alpha=0.99
speed=1
HUGE=99999999
early_unit_cost=0.2
late_unit_cost=0.5
distance_unit_cost=1
best_sol=None

对应类定义:

class Node:def __init__(self):self.name = Noneself.x = Noneself.y = Noneself.demand = Noneself.ready = Noneself.due = Noneself.service = Noneclass Sol:def __init__(self):self.path = []self.node = []self.cost=None

代价计算:

def get_cost(sol):total_cost=0distance_cost=0early_cost=0late_cost=0sum_demand=0now_time=0for i in range(len(sol.path)):if i==0:continuedistance=get_distance(sol.path[i-1].x,sol.path[i-1].y,sol.path[i].x,sol.path[i].y)distance_cost+=distance*distance_unit_costnow_time+=distance/speedsum_demand+=sol.path[i].demandif sum_demand>capacity:total_cost+=HUGEif now_time<sol.path[i].ready:early_cost+=(sol.path[i].ready-now_time)*early_unit_costnow_time=sol.path[i].readyif now_time>sol.path[i].due:late_cost += (now_time-sol.path[i].due) * late_unit_costnow_time+=sol.path[i].serviceif sol.path[i].name==0:now_time=0sum_demand=0total_cost+=distance_cost+early_cost+late_costsol.cost=total_costreturn total_cost

局部搜索:

def local_search(sol):global best_soltemp_sol=copy.deepcopy(sol)temp2_sol=copy.deepcopy(sol)for i in range(10):change(temp2_sol)if get_cost(temp2_sol)<get_cost(temp_sol):temp_sol=copy.deepcopy(temp2_sol)c1=get_cost(temp_sol)c2=get_cost(sol)if c1<c2:if c1<best_sol.cost:best_sol=temp_solsol=temp_solelse:if np.exp((c2-c1)/temperature)<random.random():sol = temp_solreturn sol

实例执行:

sol=read_data()
init_code(sol)
print(get_cost(sol))
best_sol=copy.deepcopy(sol)
cost=[]
for i in tqdm(range(2000)):sol=local_search(sol)cost.append(sol.cost)temperature*=alpha
plt.clf()
plt.plot(cost)
plt.savefig("cost.png")
plot(best_sol)
print([best_sol.path[i].name for i in range(len(best_sol.path))])

终端输出如下所示:

对路径搜索做了记录可视化如下所示:

代价计算曲线如下所示:

随着搜索迭代cost趋于稳定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/91847.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…

WordPress主题Zing V2.2.1/模块化WordPress响应式通用企业商城主题

WordPress主题Zing V2.2.1&#xff0c;模块化WordPress响应式通用企业商城主题。 功能介绍 百度熊掌号文章实时推送、原创保护 多设备支持自适应布局&#xff0c;支持电脑、Pad、手机以及各种浏览器 SEO优化首页、文章、页面、分类均支持自定义标题、关键字和描述 速度优化…

【跟小嘉学 Rust 编程】二十三、Cargo 使用指南

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

投票同款特效样式

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>import url("https://fonts.…

C#,数值计算——Midinf的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midinf : Midpnt { public new double func(double x) { return funk.funk(1.0 / x) / (x * x); } public Midinf(UniVarRealValueFun funcc, double aa,…

为什么聊天头像ChatGPT是橙色的?

目录 ChatGPT的不同版本及其颜色 了解绿色和橙色的ChatGPT徽标 颜色变化的重要性 橙色标志的原因 故障排除和常见问题解答 常见问题3&#xff1a;如何查看ChatGPT的服务器状态&#xff1f; 常见问题4&#xff1a;如果使用ChatGPT时遇到错误&#xff0c;我该怎么办&#…

关于CICD流水线的前端项目运行错误,npm项目环境配置时出现报错:Not Found - GET https://registry.npm...

关于CICD流水线的前端项目运行错误&#xff0c;npm项目环境配置时出现报错&#xff1a;Not Found - GET https://registry.npm… 原因应该是某些jar包缓存中没有需要改变镜像将包拉下来 npm config set registry http://registry.npm.taobao.org npm install npm run build

【Linux系列】离线安装openjdk17的rpm包

首发博客地址 首发博客地址[1] 系列文章地址[2] 视频地址[3] 准备 RPM 包 请从官网下载&#xff1a;https://www.oracle.com/java/technologies/downloads/#java17[4] 如需不限速下载&#xff0c;请关注【程序员朱永胜】并回复 1020 获取。 安装 yum localinstall jdk-17_linux…

Android 动画之插值器PathInterpolator

Android 的View动画、属性动画都可以设置动画插值器&#xff0c;以此来实现不同的动画效果。 这篇文章 Android View动画整理 有介绍各种插值器的效果&#xff0c;这一篇专访 PathInterpolator 。 参考官网 添加曲线动作 &#xff0c; PathInterpolator 基于 贝塞尔曲线 或 …

百度文心一率先言向全社会开放 应用商店搜“文心一言”可直接下载

8月31日&#xff0c;文心一言率先向全社会全面开放。广大用户可以在应用商店下载“文心一言APP”或登陆“文心一言官网”&#xff08;https://yiyan.baidu.com&#xff09; 体验。同时&#xff0c;企业用户可以直接登录百度智能云千帆大模型平台官网&#xff0c;调用文心一言能…

ACL 访问控制 过滤数据 维护网络安全(第七课)

一 ACL 简介 ACL是Access Control List&#xff08;访问控制列表&#xff09;的缩写&#xff0c;是一种用于控制文件、目录、网络设备等资源访问权限的方法。ACL可以对每个用户或用户组设置不同的访问权&#xff0c;即在访问控制清单中为每个用户或用户组指定允许或禁止访问该…

2023年7月京东笔记本电脑行业品牌销售排行榜(京东数据平台)

随着智能手机、平板电脑等移动互联设备的普及&#xff0c;人们对于个人电脑的依赖减轻&#xff0c;加之电脑的更换率较低&#xff0c;因此当前PC端消费市场整体出现疲态&#xff0c;笔记本电脑的出货量不断下降&#xff0c;今年7月份也同样呈现这一趋势。 根据鲸参谋电商数据分…