TSP问题是一个排序问题,排序与编码有几分相似,我们可以用遗传算法解决TSP问题么?
毫无疑问,是的。
Part 1 旅行商问题
TSP是一个典型的组合优化问题:
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
当城市数目n较小时可以求解比较容易,一旦n增加,TSP问题就变得复杂。
TSP的数学模型可以可以表示为如下形式:
Part 2 遗传算法求解旅行商问题的实现
基本遗传算法的主要步骤如下:
对于TSP问题,每一个个体代表着一种排列方式,而排列方式本身就是一种编码,所以,我们得到路径即得到编码,无需再对数据进行编码。
也正是由于路径顺序即为编码,所以在交叉、变异时要受到不能重复的限制,这是使用遗传算法求解TSP问题与求解一般问题的最大不同。
Point 1 准备
- 有n个城市,其坐标按以下方式给出:
- 计算出所有城市之间的距离,定义存放城市间距离的矩阵如下:
计算程序如下:
for
- 假设种群中有m个个体,我们定义种群矩阵X如下,可以看出TSP问题本身是一个一元问题,一个个体对应一个染色体。
Point 2 洗牌(乱序)操作
为了避免在迭代过程中交叉操作总是在相邻的两个个体的染色体之间发生,在交叉操作之前,先对种群中的每一个个体的前后顺序进行重新排列,即X的列向量打乱顺序。
程序如下:
shuffle
Point 3 交叉操作
- 随机选取两个交叉点
- 将交叉点中间的基因段进行互换
- 互换后,将互换的基因段与基因段以外的部分中重复(冲突)的元素用另一父本的相应位置来代替,直到没有冲突。
交叉操作程序(太长了,影响阅读体验,详见最后总程序)
Point 4 变异操作
- 随机选取两个变异点
- 将变异点中间的基因段进行倒序
变异操作程序(太长了,影响阅读体验,详见最后总程序)
Point 5 选择操作
- 计算每个个体对应的路径长度,定义如下矩阵来存放:
路径长度计算程序:
function
- 由于TSP问题求最短路径,所以适应度与路径长度成反比,定义适应度为:
定义存储适应度的矩阵为:
适应度计算程序:
function
- 轮盘赌法+精英保留策略进行选择
function
Point 6 总程序
以求10个城市的TSP问题为例,10个城市的坐标如下:
%----------求解TSP问题----------%
计算结果如下: