首页 > 编程语言 >禁忌搜索算法求解带时间窗的车辆路径问题(上)

禁忌搜索算法求解带时间窗的车辆路径问题(上)

时间:2022-09-29 17:03:34浏览次数:45  
标签:求解 路径 邻域 禁忌 搜索算法 更新 车辆 顾客

禁忌搜索算法求解带时间窗的车辆路径问题(上)_搜索算法


今天小编准备讲一下用禁忌搜索算法(下文简称TS)求解带时间窗的VRP问题(下文简称VRPTW)。

下面小编带大家体会TS的思想。以VRPTW为例,VRPTW的解的形式为每辆车所经过的顾客,比如说有15个顾客,并且仅需3辆车完成全部配送任务。,则解如下所示(序号代表顾客编号):

车辆1:4 2 9 10 14

车辆2:11 1 3 7 13

车辆3:15 8 6 5 12

假设当前解所有车辆行驶的总距离是100.

要用TS求这个问题,第一步是要确定禁忌表,包括禁忌表的形式以及禁忌表的长度。还是举例说明,先定义(i,k),其表示顾客i由车辆k服务,则当前解S的邻域N(S)为从当前解的任一路径中移除当前路径的任一顾客,并将该顾客插入到其他路径,当然这一系列操作必须满足时间窗约束和容量约束(PS,邻域结构有很多种形式,小编这里只给出一种最简单的邻域结构)

下面小编先给出禁忌表的形式,初始禁忌表的禁忌长度都设为0。

禁忌搜索算法求解带时间窗的车辆路径问题(上)_迭代_02

表中(i,k)表示路径k中的顾客i一旦从路径k中移除,则连续L代不能插回路径k中,这里的L代就是禁忌长度。

在当前解S的邻域N(S)中,如果把顾客5从路径3中移除并插入到其他路径使总行驶距离最小,比如说添加到路径2中的3和7之间,车辆行驶总距离为95(小于初始距离100,在代码里我们不接受劣质解,小伙伴们后续可以用模拟退火继续优化代码),则需要将更新禁忌表,并且更新当前解S,也就是将5行3列的数值更新为禁忌长度。第一次更新后的解为:

车辆1:4 2 9 10 14

车辆2:11 1 3 5 7 13 

车辆3:15 8 6 12

我们暂且将禁忌长度设为5(这里更新5行3列数值的含义是:不让顾客5在5次迭代内重新插回到路径3),则第一次更新后的禁忌表如下表所示:

禁忌搜索算法求解带时间窗的车辆路径问题(上)_邻域_03

在当前解S的邻域N(S)中,如果把顾客6从路径3中移除,并插入到其他路径使总行驶距离最小,假设插入到路径1的9和10之间,车辆行驶总距离小于上一次迭代优化后的车辆总行驶距离95,则需要将更新禁忌表,也就是将6行3列的数值更新为禁忌长度,同时将5行3列的数值减1,并更新当前解S。第二次更新后的解为:

车辆1:4 2 9 6 10 14

车辆2:11 1 3 5 7 13 

车辆3:15 8 12

则第二次迭代后更新的禁忌表为如下表所示

禁忌搜索算法求解带时间窗的车辆路径问题(上)_搜索算法_04

下面我们说一种特殊情况,在当前解S的邻域N(S)中,此时如果将顾客5从路径2移除,又重新插回到路径3,很明显(5,3)是禁忌表禁止的,但是如果重新把5插回路径3后的车辆总行驶距离为90,比当前最优的95还好,那么就可以执行该操作,这就是破禁准则,执行完该操作后,需要将5行3列的数值重置为0,其余非0的数值均减1。这里小编只是举个例子,各位小伙伴不用纠结于把5重新插回3怎么可能使总距离减小。更新后的禁忌表如下表所示。

禁忌搜索算法求解带时间窗的车辆路径问题(上)_迭代_05

最后小编给出,TS的伪代码:

禁忌搜索算法求解带时间窗的车辆路径问题(上)_迭代_06

这周末小编在实验室加班,所以代码没写完,忘各位小伙伴见谅。


标签:求解,路径,邻域,禁忌,搜索算法,更新,车辆,顾客
From: https://blog.51cto.com/u_15810430/5723536

相关文章

  • 大规模邻域搜索(LNS)求解带时间窗的车辆路径问题(VRPTW)(附MATLAB代码)
    祝大家元宵节快乐本文引用ShawP.UsingConstraintProgrammingandLocalSearchMethodstoSolveVehicleRoutingProblems[M]//PrinciplesandPracticeofConstrai......
  • 基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)
    本文依然参考《MATLAB智能算法30个案例分析》一书,文末的源代码也来自本书​上周有小伙伴后台问小编能否讲解一下关于多目标优化问题的算法,本周小编做足了功课,为大家更新这篇......
  • 遗传算法求解车间调度问题(附MATLAB代码)
    首先声明本文参考数据魔术师公众号的《遗传算法求解混合流水车间调度问题(附C++代码)》和《MATLAB智能算法30个案例分析》今天小编为大家讲解遗传算法求解车间调度问题。小编......
  • VNS(变邻域搜索算法)求解CVRP问题
    最近小编在学(xiao)习(xi)CVRP问题,相信小伙伴们CVRP问题并不陌生,没错CVRP问题就是容量受限制的车辆路径问题,容量受限指的是每辆车的容量都有限制,我们对问题的目标进行设定,本......
  • 数值计算(1) --求解连续微分系统和混沌系统
    前言微分系统在工程项目中很常见,通过物理建模之后,基本都需要求解微分方程得到其结果,混沌系统属于特殊的一类微分系统,在某些项目上也很常见,同时可以引申出分岔图、李雅普诺夫......
  • 分治法求解幂函数
    #include<iostream>usingnamespacestd;floatpower(floatx,inty){floattemp;if(y==0)return1;temp=power(x,y/2);if(y%2==0)......
  • LCA(最近公共祖先)求解方法
    本文参考https://oi-wiki.org/graph/lca/定义树上u,v两点的LCA(最近公共祖先)是从根节点dfs到上述两节点路径上距离上述两点最近的公共点。LCA有如下性质:1、u是v的祖先,当且......
  • 实例84 二分法求解方程
    #include<stdio.h>#include<math.h>#include<malloc.h>#include<stdlib.h>doubleFunc(double);intBisectRoot(double,double,double,double,double*,int,in......
  • 实例85 牛顿迭代法求解方程
    #include<stdio.h>#include<math.h>#include<stdlib.h>intFunction(double,double*,double*);intNewton(double*,double,int);intFunction(x,f,dy)dou......
  • 垃圾回收算法(2)-根搜索算法
    前言相对于引用计数算法而言,根搜索算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效的解决在引用记数法中一些已经死亡的对象因为相互引用而导致的无法......