TSP
1.1问题描述
给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起 始城市的最短回路。这里给定 10 个城市和两两之间的距离。如图 2.1 所示。
1.2 遗传算法求解
1.2.1 求解思路
遗传算法是通过将优化函数的可能解表示成一个个体,每个个体用一定编码 方式形成基因,借助遗传算子,选择、交叉、变异操作,对种群进行演化,选择 出更适应环境的种群。
在 TSP 问题中,我们将每一条访问城市的顺序编码为一个个体,每个种群有 n 个个体,即有 n 种访问顺序,同时,每个个体又有 9 个染色体,即[2,10]的随 机排列(城市 1 作为起始和终止城市,不进行粒子操作),代表访问城市的顺序。 通过每一代的演化,对粒子群进行位置、速度更新操作,选择合适个体(最优的 顺序)。
(1)编码:符号编码(G 编码)
(2)选择方式:采用轮盘赌/竞标赛选择方法,同时保留最优个体
(3)交叉方式:定义了两种交叉方法。循环交叉和单点交叉。 循环交叉(不进行 G 编码):从第一个父代第一个元素开始搜索第二个父 代对应索引的值,如果相等,则找到一个循环体,否则搜寻第二个父代对应 索引的值在第一个父代的索引,直达第二个父代的元素等于第一个父代的第 一个元素。循环体元素不变,其余元素互换形成交换。(如下示意图)
循环交叉(进行 G 编码):先对个体进行 G 编码,任意产生一个交叉点的 位置,两个父代的交叉点到末尾的元素互换形成新的个体,在对新个体进行 G 解码。
(4)变异方式:定义了两种变异方法。常规变异和逆转变异。
常规变异(进行 G 编码):首先对个体进行 G 编码。然后产生变异点位置 i, 然后产生变异值,变异值只在[1,n-i+1]中取值。最后对新个体进行 G 解码。
逆转变异(不进行 G 编码):首先对随机产生两个变异点,对两点之间的子
串进行逆转,形成新的个体。
(5)适应度:为了能够让适应度高的个体保存下来,定义适应度为:
f
i
t
v
a
l
u
e
=
2
/
d
i
s
t
a
n
c
e
(1.1)
fitvalue= 2/distance \tag{1.1}
fitvalue=2/distance(1.1)其中 distance 为每个个体(路径)的距离。显然,如果距离最短,则适应 度最高,更利于遗传给后代。
(6)G 编码与解码:encode()函数用于对个体进行编码,对个体的第 i 个 元素编码值为个体第 i 个元素到末尾元素的升序排列对应的索引值。decode() 函数用于解码,解码思路,初始化数组 s=[2 3 4 5 6 7 8 9 10],从 G 码的第一 个元素开始,找到 s 中的位置,则为解码后的值,同时将 s 中该元素删除,依次 循环 G 码的所有元素。
1.2.2 流程图
1.3 结果
1.4 结果分析
通过遗传算法,我们可以对比结果,显然这种结果是令人满意的。直观上看 过去,遗传算法给出的结果是最优的。但是遗传算法作为一种“概率”算法,不 一定每次都能够收敛到最优,在调试的时候,发现种群个体数和迭代次数在一定 范围内会更易于收敛到最优解。