遗传算法简介算法
遗传算法(Genetic Algorithm,简称GA)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的基于种群的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特色是直接对结构对象进行操做,不存在求导和函数连续性的限定;具备内在的隐并行性和更好的全局寻优能力;采用几率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不须要肯定的规则。遗传算法的这些性质,已被人们普遍地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。遗传算法是现代智能计算中的关键技术之一。windows
遗传算法基本思想机器学习
在现实生活中,生物的染色体经过基因控制了生物的性状,而生物的性状决定了生物在环境中的适应度,适应度高的生物,其基因更容易流传下来,随着时间的不断流逝,整个种群的适应度随之提升。函数
遗传算法和现实很是相似,首先将问题的解经过必定的方法,编码到染色体中,经过适应度函数,获得每一个个体的适应度,经过选择,将适应度高的个体保留到下一代中,不断迭代,便可得到满意解。学习
遗传算法流程优化
车辆路径规划问题介绍编码
车辆路径规划问题,通过60年来的研究与发展,研究的目标对象,限制条件等均有所变化,已经从最初的简单车辆安排调度问题转变为复杂的系统问题。最初的车辆路径规划问题能够描述为:有一个起点和若干个客户点,已知各点的地理位置和需求,在知足各类约束的条件下,如何规划最优的路径,使其能服务到每一个客户点,最后返回起点。经过施加不一样的约束条件,改变优化的目标,能够衍生出不一样种类的车辆路径规划问题。同时车辆路径规划问题属于典型的NP-hard问题,其精确算法能求解的规模很小,故启发式算法也就成了研究热点。设计
VRPTW简介3d
VRPTW(Vehicle routing problem with time windows)即带时间窗的车辆路径规划问题,其对于每一需求点加入了时间窗的约束,即对于每个需求点,设定服务开始的最先时间和最晚时间,要求车辆在时间窗内开始服务顾客。orm
需求点的时窗限制能够分为两种,一种是硬时间窗(Hard Time Window),即要求车辆必须在时间窗内开始服务顾客,早到必须等待,迟到就拒收,另外一种是软时间窗(Soft Time Window),不必定要在时间窗内开始服务顾客,可是在时间窗外开始服务必需要惩罚,以惩罚代替等待与拒收是软时间窗和硬时时间窗的最大的区别。
VRPTW的数学模型以下:
(2.2)保证了每一个顾客只被访问1次
(2.3)保证了装载的货物不超过容量
(2.4)(2.5)(2.6)确保了每辆车从depot出发最后回到depot
(2.7)(2.8)确保在时间窗内开始服务
在干货 | 十分钟掌握禁忌搜索算法求解带时间窗的车辆路径问题(附C++代码和详细代码注释)中详解介绍了如何用禁忌搜索(Tabu Search)算法求解VRPTW。
染色体设计
在论文:A simple and effective evolutionary algorithm for the
*vehicle routing problem *中,做者提出了在用GA解决VRP时的几点注意事项,以下图所示:
简单来讲染色体的设计能够遵循如下两点:
使用和TSP问题中相似的染色体、编码,没有分隔符
在使用GA求解VRPTW的过程当中,常见的问题就在于交叉后产生的大量不可行解,这里采用分割的思想,一个染色体所存的解是split函数操做后所产生的最优分割。这样所获得的解都为可行解,大大减小了无效搜索。
在全部分割里,能最小化目标函数的即为最优分割。其实这就是一个编码和解码的过程。
下面咱们来具体介绍一下这个split方法:
你们可能会以为得到最优分割是一个很困难的事情,其实引入图论的思想,利用Bellman-Ford算法,在O(n^2)内就能得到最优分割。
上面两个图展现了如何把原问题转化为一个图论中的问题:
将每一个基因位设为一个点,假如将i到j链接,其路径知足容量约束和时间窗约束,则视为从i到j存在一条权值为路径长度的边。则最优分割即为从染色体开头的基因的点到结尾的基因的点的最短路。利用Bellman-Ford算法,可在O(n^2)中求出最优分割。
流程图以下:
群体多样性
遗传算法中常见的问题就是早熟,过早收敛。为了不这种状况的发生,就要保证子代个体中各个个体的不一样。
如何判断个体之间是否相同有不少算法,小编这里采用经过适应度的不一样来判断的方法:
即两个个体的适应度相差大于一个值,即视为不一样的个体。
crossover
crossover,即交叉操做,这里使用实数编码中经常使用的OX(Order Crossover)交叉算子。
OX 交叉算子的过程如图:
随机选择两个点i,j,其中0<=i<=j<=N,N为染色体长度。
将亲代P1从i到j的基因填入子代相同的位置。
将亲代P2的基因不重复地依次填入子代中。
交换p1,p2,便可产生两个子代。
4
mutation
mutation,即突变操做,这里简单地随机交换染色体中的两个基因,过程以下图:
5
selection
选择的方法有不少,这里使用二进制锦标赛选择,每次从亲代中选择两个个体进行比较,将适应度大的个体保留到亲代中便可。
代码由小编独立完成,有不周到之处还请多指教!
分为如下几个类:
Chromosome类为染色体类,提供了和Solution类的相互转换,即编码和解码过程,Customer类储存了具体的顾客,Conf类是参数的设定,Solution类储存了解,GA_Stategy中实现了遗传算法用的函数。
运行结果如图:
参考文献:
[1]Anderson E, Phillips C, Sicker D, et al. A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 2004, 31(12):1985-2002.**
[2]Solomon M M. Algorithms for the Vehicle Routing and Scheduling Problems with Time Window Constraints. Operations Research, 1987, 35(2):254-265.**
有问题欢迎交流:邮箱 1642940680@qq.com