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

news2024/9/20 0:32:41

有时间窗车辆路径问题(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 = None
        self.x = None
        self.y = None
        self.demand = None
        self.ready = None
        self.due = None
        self.service = None


class Sol:
    def __init__(self):
        self.path = []
        self.node = []
        self.cost=None

代价计算:

def get_cost(sol):
    total_cost=0
    distance_cost=0
    early_cost=0
    late_cost=0
    sum_demand=0
    now_time=0
    for i in range(len(sol.path)):
        if i==0:
            continue
        distance=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_cost
        now_time+=distance/speed
        sum_demand+=sol.path[i].demand
        if sum_demand>capacity:
            total_cost+=HUGE
        if now_time<sol.path[i].ready:
            early_cost+=(sol.path[i].ready-now_time)*early_unit_cost
            now_time=sol.path[i].ready
        if now_time>sol.path[i].due:
            late_cost += (now_time-sol.path[i].due) * late_unit_cost
        now_time+=sol.path[i].service
        if sol.path[i].name==0:
            now_time=0
            sum_demand=0
    total_cost+=distance_cost+early_cost+late_cost
    sol.cost=total_cost
    return total_cost

局部搜索:

def local_search(sol):
    global best_sol
    temp_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_sol
        sol=temp_sol
    else:
        if np.exp((c2-c1)/temperature)<random.random():
            sol = temp_sol
    return 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.coloradmin.cn/o/948740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

what(): NCCL Error 1: unhandled cuda error解决方法

文章目录 遇到问题解决方法参考 遇到问题 运行项目&#xff1a;ACL2021的一篇工作&#xff0c;LM-BFF (Better Few-shot Fine-tuning of Language Models) https://github.com/princeton-nlp/LM-BFF 遇到环境问题。 我的机器环境如下&#xff1a; 服务器上CUDA版本为11.4 GPU…

为什么要参加浙大MPA提面申请?你看看AB资格的弃考率

时间即将来到九月份&#xff0c;在这个时间点依然能够坚持自己读研梦的考生&#xff0c;可以说基本是今年真正的准考生了&#xff01;在备考坚持这方面&#xff0c;其实每年很多考生走不到最后&#xff0c;比如在9-10月份全国研究生网上报名阶段&#xff0c;接近两成比例的考生…

geant4 常用代码

1 获取特特定能量范围的特定粒子 E:\examples_understanding\geant4-v11.0.0_note\examples\extended\runAndEvent\RE02 //-- Particle with kinetic energy filter.G4SDParticleWithEnergyFilter* pkinEFilter new G4SDParticleWithEnergyFilter(fltName"gammaE filter&…

招生大户!包邮区双非计算机强校计算机考研分析

杭州电子科技大学(B) 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23初试科目、23复试详情、各专业考情分析、各科目考情分析。 正文1689字&#xff0c;多表&#xff0c;预计阅读&#xff1a;5分钟…

Python中小数据池知识最详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一、id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f; id是内存地址&#xff0c;比如你利用i…

centos升级python

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

JavaScript常见的运算符

一、运算符和运算元 1.认识运算符 在小学的时候我们就学习了各种运算符&#xff0c;比如加号 、乘号 *、减号 - 、除号/ 几乎所有的编程语言都有各种各样的运算符(也被称之为操作符&#xff0c;operators) 初次接触这些运算符, 你会感觉种类繁多, 难以记忆.但是并不需要特别…

Lora升级!ReLoRa!最新论文 High-Rank Training Through Low-Rank Updates

目录 摘要1 引言2 相关工作3 方法4 实验5 结果6 结论7 局限性和未来工作 关注公众号TechLead&#xff0c;分享AI与云服务技术的全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0…

使用文本编辑器sublime text编写python代码

前言 上篇文章介绍了如何安装python程序&#xff0c;这次就讲讲如何用sublime来编写python代码 有的小伙伴可能会有疑问&#xff0c;为什么不选择pycharm来编写&#xff1f; pycharm写代码会有代码补全功能&#xff0c;而我们新手正是要在犯错误的过程中积累经验&#xff0c…

论文解读 | 新发现编码器PointPillars用于点云检测物体,更加高效且精准

原创 | 文 BFT机器人 01 技术背景 在过去的几年中&#xff0c;深度学习技术已经在图像领域的物体检测中取得了显著的进展&#xff0c;诸如目标检测算法&#xff08;如Faster R-CNN、YOLO和SSD&#xff09;在图像中能够高效准确地检测出物体。然而&#xff0c;当涉及到点云数据…

get√接口自动化核心知识点浓缩,为面试加分

日常接触到的接口自动化从实际目标可以划分为两大类&#xff1a; 1、为模拟测试数据而开展的接口自动化 这种接口自动化大多是单次执行&#xff0c;目的很明确是为了功能测试创造测试数据&#xff0c;节约人工造数据的时间和人工成本&#xff0c;提高功能测试人员的测试效率。…

《论文阅读18》JoKDNet

一、论文 研究领域&#xff1a;用于大尺度室外TLS点云配准的联合关键点检测和特征表达网络论文&#xff1a;JoKDNet: A joint keypoint detection and description network for large-scale outdoor TLS point clouds registration International Journal of Applied Earth Ob…

Java定时任务调用执行shell脚本实例

文章目录 Java代码1234 shell脚本 Java代码 1 2 3 4 shell脚本

检查nacos是否正常启动

可以通过以下几种方式检查nacos是否启动&#xff1a; 查看nacos日志文件&#xff1a;启动nacos时&#xff0c;控制台会输出一些信息&#xff0c;可以查看控制台输出的信息&#xff0c;如果显示“Server startup in XXX ms”等字样&#xff0c;则说明nacos已经启动。 查看端口…

【C++深入浅出】初识C++下篇(auto关键字、范围for、nullptr指针)

目录 一. 前言 二. auto关键字 2.1 auto的引入 2.2 auto简介 2.3 auto的使用细则 2.4 auto不能推导的场景 三. 基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的原理 3.3 范围for的使用条件 四. 指针空值nullptr(C11) 一. 前言 上期我们介绍了c新增的两个重…

ERROR o.s.b.SpringApplication - Application run failed

报错&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-08-25 18:32:41,704 main ERROR o.s.b.SpringApplication - Application run failed org.springframework.beans.factory.BeanCre…

路由器的简单概述(详细理解+实例精讲)

系列文章目录 华为数通学习&#xff08;4&#xff09; 目录 系列文章目录 华为数通学习&#xff08;4&#xff09; 前言 一&#xff0c;网段间通信 二&#xff0c;路由器的基本特点 三&#xff0c;路由信息介绍 四&#xff0c;路由表 五&#xff0c;路由表的来源有哪些…

tsmc standard cell命名规则

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 CKMUX2代表二输入clock mux&#xff0c;D2代表驱动强度X2&#xff0c;6T代表row高为6track&#xff0c;16P96C代表gate length和poly pitch&#xff0c;LVT就是low voltage thr…

鲜花小程序制作教程:让你的花店与时俱进

在当今的电子商务时代&#xff0c;消费者对于购物体验的要求越来越高。对于鲜花这一类商品&#xff0c;消费者更是希望能够方便快捷地购买到高品质的花卉&#xff0c;并且能够享受到一流的购物体验。为了满足消费者的需求&#xff0c;许多商家选择利用小程序来打造一流的鲜花购…

ssm化妆品配方及工艺管理系统源码和论文

ssm化妆品配方及工艺管理系统源码和论文083 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 课题的目的和意义 进入21世纪后我国的经济增长在全球脱颖而出&#xff0c;人们的生活质量也在不断地提高&#xff0…