为了更好的学习VRP问题,准备将VRP问题的相关算法、算子、策略和技巧进行复现,编写自己的VRP武器库。与此同时,在博客上更新自己的学习进程,也是给自己的督促。除此之外,我将把问题限定在VRPTW中,因为实际问题中,通常都包含了时间窗约束,同时还能解决Duration的约束。先把我的VRP代码的规范和说明介绍下,本人先使用lua语言,在MicroCity上运行,之后会改用Python和C++改写。lua里的数据结构就是table搞定所有,所以开发起来特别方便。
Classes:
Route路径:route = {{id=1},{id=2},{id=1}; weight=10, ttype=1}
Solution(路径集) : routes = {}
输入参数:
节点信息:
nodes[1] = {x=,y=,weight=,ptype=1, time1, time2, stime} 包括坐标、需求(这里提前考虑后期的重量、体积约束)、节点类型(depot:1,delivery:2,pickup:3,chargeStation:4)
车辆信息:
vehicle = {{id, weight, volume, fc, tc}} 为多车型做准备
算法目录:
constructive algorithms:最近邻插入,节约里程(CW)法,Solomon Insertion I
metaheuristic algorithms:模拟退火,禁忌搜索,变邻域搜索,大规模邻域搜索
exact algorithms:列生成,branch&price
以上其实都已经完成,持续贴出代码。
行,开始断更很久的VRP刷书记录。
本书第一章就不写了,都是基础,应对滚瓜烂熟。
本章开始介绍最基础的VRP求解方法,第一节是就简单的启发式算法,构造算法Constructive algorithm,包括CW。这里默认大家都会,不会就自己百度,直接进入第二节
本章给出了local search(邻域搜索)的基本框架,介绍了经典moves,并讨论了feasibility tests,genericity,multiple neighborhoods,very constrained problems,complex moves and accelerattion。
我们选用Augerat et al.的Set A中的例子1,‘A-n32-k5.vrp’进行我们的算法测试。
NAME : A-n32-k5
COMMENT : (Augerat et al, Min no of trucks: 5, Optimal value: 784)
TYPE : CVRP
DIMENSION : 32
EDGE_WEIGHT_TYPE : EUC_2D
CAPACITY : 100
大家可以看看例子的说明。32个点,capacity是100,欧几里得距离。
local search 的几个步骤如上,
node relocation and node exchange
在调用这些算子的时候,我想写成迭代器(Iterator)来遍历这些邻域。
closure是一种可以访问其外部嵌套环境的局部变量的函数。
创建“非局部的变量”(non-local variable)
function values(t)
local i = 0
return function () i = i + 1; return t[i] end
end
Local search 的大部分操作的时间复杂度都是O(n2),但是需要使用很多次,碰到Large scale的问题就跑不动了,因此我们想寻找一些加速的Techniques。
也就是在Feasibility tests的时候,根据问题和数据调整The order of tests,当然是容易violate的放前面,这样会提前跳出。当然,怎么确定顺序或者动态调整顺序,我们后期到了VRPTW了再详谈。
邻域采样,核心思想就是大部分情况下不需要遍历所有的邻域,因为有些邻居几乎不可能优化咱们的解,就不访问他们了,因此可以加速。有下面几个approach:
1 restricted number M of randomly selected moves, 后期再讲;
2 Lists of neighbors,这个之前我用过,不错,也下次再详述。
3 Vertex marking, 第一次见,之后试试,感觉挺有意思。
4 Sequential search,