这篇文章是对遗传算法进行基本的介绍,并使用Java实现算法来解决一个类似寻找最优路径的问题。
问题描述
如图所示,在X轴上有5个点,分别为x1, x2, x3, x4, x5。这5个点的实际间距已知为L,但实际中由于测量误差的存在,每个点x1, x2, x3, x4, x5会有一系列如图中黑色圈内所示的测量点。那么如何在实际测量点中取值可以使得相邻位置的间距最接近L,问题可以描述为如下数学公式:
解决思路
通过查询资料发现,我要解决的问题和TSP问题(旅行商问题)很像。TSP问题中是预先给定数量已知位置固定的点,然后求得是旅行商人从任意一个点出发遍历所有的点(中间每个点只能经过一次)最后回到这个点时路径最短,具体可以参考维基百科旅行商问题。
我要解决问题的特点是点之间的间距固定,但每个点的位置上有n个测量点,我的最终目的是选择最优的测量点使得路径距离和4L之间的偏差最小,换言之也是使得路径的最短(只不过是与4L做差值之后最短),这就与TSP问题不谋而合了。虽然每个位置上有个n个测量点,但每次只从每个位置上取出一个测量点,这样就形成一条线路,然后计算路径间距,最后通过比较即可选择出最优的路径,这就和TSP问题求解的思路是一样的了。
但是如果遍历每个位置上的点来求所有的路线,这样当测量点数n比较大时计算量就相对很大了,所以就想到了用启发式搜索算法的方式来搜索最优解,最后使用遗传算法来解决这个问题。
遗传算法
遗传算法,顾名思义,可以联想到自然界种群繁衍、基因遗传的过程,实际上它也是借鉴进化生物学中的一些现象发展起来的(交叉,变异,选择以及遗传等等)维基百科遗传算法,是一种通过模拟生物进化过程搜索最优解的启发式搜索算法。
遗传算法的本质就是模仿自然界优胜劣汰、适者生存的过程。它往往从实际问题的解集出发通过一定的编码方式形成问题域中“基因”、“染色体”和“个体”的概念,进而确定初始种群(由一定数量的个体组成),然后根据问题域中的适应度函数(Fitness Function),通过一代代的选择(Selection)、交叉(Crossover)和变异(Mutation)等方式模拟这个种群的进化过程,最后逐渐进化出较好的个体(也就是解集中近似的最优解&