经过上一篇 无形忍者-也许你和禁忌搜索算法的距离就差这一文(附python案例代码) 的概念介绍和算法核心步骤介绍,我们对禁忌搜索已经有了一定的了解。下面我们来一起复习下禁忌搜索算法的核心步骤:
1.禁忌搜索算法核心步骤
① 初始化
利用贪婪算法等局部搜索算法生成一个初始解,清空禁忌表,设置禁忌长度。
② 邻域搜索产生候选解
根据步骤①产生的初始解,通过搜索算子(search operators),如relocation、exchange、2-opt等,生成候选解(candidate solution),并计算各个候选解的适应值(即解对应的目标函数值)。
③ 选择最好的候选解
从步骤②产生的所有候选解中选出这一轮适应值最好的候选解,将其与全局最优解进行比较,
如果优于全局最优解,那么就不考虑其是否被禁忌,用这个最好的候选解来更新全局最优解,并且作为下一个迭代的当前解,然后将对应的操作加入禁忌表;
如果不优于全局最优解,就从所有候选解中选出不在禁忌状态下的最好解作为新的当前解,并且作为下一个迭代的当前解,然后将对应的操作加入禁忌表;这时候不更新全局最优解。
④ 藐视准则
如步骤3中介绍的:如果优于全局最优解,那么就不考虑其是否被禁忌,用这个最好的候选解来更新全局最优解,并且作为下一个迭代的当前解,然后将对应的操作加入禁忌表;
⑤ 判断终止条件
若满足终止条件,则立即停止并输出当前最好解;否则继续搜索。一般终止条件为是否到达一定的迭代次数或者达到了一个时间限制。
2.带时间窗车辆路径问题(VRPTW)简介
车辆路径问题(VRP)最早是由 Dantzig 和 Ramser 于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小、耗费时间最少等目的。
由于VRP问题的持续发展,考虑需求点对于车辆到达的时间有所要求之下,在车辆途程问题之中加入时窗的限制,便成为带时间窗车辆路径问题(VRP with Time Windows, VRPTW)。带时间窗车辆路径问题(VRPTW)是在VRP上加上了客户的被访问的时间窗约束。
3.VRPTW问题的建模实例
3.1问题背景
VRPTW 问题是不仅考虑CVRP的所有约束,还需要考虑时间窗约束,也就是每个顾客对应一个时间窗 ,其中 和
和
分别代表该点的最早到达时间和最晚到达时间。
3.2约束条件
①每辆车必须从仓库出发,最终返回仓库;
②每个客户只被1辆车服务;
③每辆车的载重不超过总容量Q;
④每辆车的总时间不超过Dk;
⑤需要在时间窗 内服务客户i,并且需要在
时间窗内返回仓库点
3.3目标
每辆车辆的总时间最短(由于车辆速度相同,时间最短相当于路程最短)的路线。(允许不使用某些车辆)
4.利用禁忌搜索解决VRPTW问题
算法的核心步骤
首先,我们怎么去产生一个初始解?这是利用的贪心的思想为每个客户指派路径:
- 尝试将客户i加入到某条路径k中,
- 判断是否满足路径k的容量约束条件,如果不满足则新建一条路径,k=k+1;
- 然后再路径k中,任意找节点j,j+1;如果客户i满足时间窗满足
。
- 我们就将客户i分派到这条路径k,并放置在节点j,j+1之间,同时累加该路径的总长度。
然后开始禁忌搜索,在禁忌搜索的每一轮迭代的过程中,我们都需要找出一个最好的候选解,这个候选解与全局最优解进行比较,如果优于全局最优解,那么就不考虑其是否被禁忌,用这个最好的候选解来更新全局最优解,并且作为下一个迭代的当前解,然后将对应的操作加入禁忌表;如果不优于全局最优解,就从所有候选解中选出不在禁忌状态下的最好解作为新的当前解,并且作为下一个迭代的当前解,然后将对应的操作加入禁忌表;这时候不更新全局最优解。
那么我们怎么搜索最好的候选解呢?
首先我们假设每一轮迭代中的当前解为bestv,当前最好客户为bestc,当前最好路径为bestr,当前最好位置为bestp。 然后,我们对每一个客户节点i进行遍历,先找出它在当前路径中的位置ÿ