遗传算法
算法相关参数
- 种群个体数量:p_num
- 进化代数:gen
- 变异率:pm
- 被选中的概率:mask_list[i]/sum_len(即当前距离差值/距离差值之和)
算法效果分析
- 种群数量越多,迭代次数越多,搜索次数越多,程序运行越慢,相对来 得到的解更可信
- 种群中个体的路径长度越短,被选中作为父代的概率越大,即优胜劣汰
- 算法随机性体现在:父代的随机选取,孩子继承父母的基因序列长度随机(即单点交叉策略),一定概率进行变异,变异中随机选取基因进行交换
算法步骤
- 数据初始化:计算距离矩阵(dist[i][j]表示i城市与j城市之间的距离);随机得到初始解(起点为0城市);编写距离计算函数;初始化第一代的种群
- 求得当前代时种群中的最优解,并初始化子代矩阵
- 遗传算法的核心:算法迭代gen次,每次产生p_num个子代。
3.1 随机选择一对父母(路径越短,选中的概率越大),并选取父母各自一段基因序列进行遗传(基因即路径,长度随机生成);
3.2 第一个孩子继承母亲的部分基因序列
3.3 随机生成概率,判断是否变异
3.4 将孩子基因放入孩子序列,孩子的数量+1
3.5 同理第二个孩子继承父亲的基因(见3.2~3.4)
3.6 计算过所有p_num个子代后,找出当前代的最优解并与全局最优解比较
- 直到迭代gen次,算法结束
import numpy as np
import random
import math
import matplotlib.pyplot as plt
import time
"""
Desicribe:遗传算法解TSP问题
"""
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
coordinates = np.array([[565.0, 575.0], [25.0, 185.0], [345.0, 750.0], [945.0, 685.0], [845.0, 655.0],
[880.0, 660.0], [25.0, 230.0], [525.0, 1000.0], [580.0, 1175.0], [650.0, 1130.0],
[1605.0, 620.0], [1220.0, 580.0], [1465.0, 200.0], [1530.0, 5.0], [845.0, 680.0],
[725.0, 370.0], [145.0, 665.0], [415.0, 635.0], [510.0, 875.0], [560.0, 365.0],
[300.0, 465.0], [520.0, 585.0], [480.0, 415.0], [835.0, 625.0], [975.0, 580.0],
[1215.0, 245.0], [1320.0, 315.0], [1250.0, 400.0], [660.0, 180.0], [410.0, 250.0],
[420.0, 555.0], [575.0, 665.0], [1150.0, 1160.0], [700.0, 580.0