车辆路径问题VRPTW学习之一【开篇】

为了更好的学习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 = {}

输入参数:

二维距离和时间矩阵矩阵: dis[i][j]=\begin{matrix} ((i.x-j.x)^2+(i.y-j.y)^2)^1/2, i\neq j \\ false, i = j \end{matrix}  

节点信息:

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刷书记录。

本书第一章就不写了,都是基础,应对滚瓜烂熟。

2 Simple Heuristic and Local Search Procedures

本章开始介绍最基础的VRP求解方法,第一节是就简单的启发式算法,构造算法Constructive algorithm,包括CW。这里默认大家都会,不会就自己百度,直接进入第二节

2.2 Local search

本章给出了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,欧几里得距离。

  • step1 initial solution
  • step2 CW
  • step3 Local Search

local search 的几个步骤如上,

2.2.2 Classical moves

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 

2.2.7 Acceleration techniques

Local search 的大部分操作的时间复杂度都是O(n2),但是需要使用很多次,碰到Large scale的问题就跑不动了,因此我们想寻找一些加速的Techniques。

  • Testing first the constraint which are more likely to be violated

也就是在Feasibility tests的时候,根据问题和数据调整The order of tests,当然是容易violate的放前面,这样会提前跳出。当然,怎么确定顺序或者动态调整顺序,我们后期到了VRPTW了再详谈。

  • Neighborhood sampling

邻域采样,核心思想就是大部分情况下不需要遍历所有的邻域,因为有些邻居几乎不可能优化咱们的解,就不访问他们了,因此可以加速。有下面几个approach:

1 restricted number M of randomly selected moves, 后期再讲;

2 Lists of neighbors,这个之前我用过,不错,也下次再详述。

3 Vertex marking, 第一次见,之后试试,感觉挺有意思。

4 Sequential search,

发布了11 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_41644416/article/details/82430567