原视频:【算法】遗传算法解决旅行商(TSP)问题_哔哩哔哩_bilibili
代码链接:ga.py · main · mirrors / zifeiyu0531 / ga-tsp · GitCode
up主的讲解很有东西,这里对代码进行汇总,对一些小白看起来可能遇到的小问题进行备注。
一、代码构成
共有三个py文件构成:main.py主程序入口、ga.py遗传算法的流程、config.py一些基本参数的配置。
1.main.py
import turtle
import numpy as np
import my_utils.ga_tsp_config as conf
import my_utils.ga
import matplotlib.pyplot as plt
config = conf.get_config()
# 城市距离矩阵计算方法
def build_dist_mat(input_list):
n = config.city_num
dist_mat = np.zeros([n, n])
for i in range(n):
for j in range(i + 1, n):
d = input_list[i, :] - input_list[j, :]
# 计算点积
dist_mat[i, j] = np.dot(d, d)
dist_mat[j, i] = dist_mat[i, j]
return dist_mat
# 随机生成城市坐标
city_pos_list = np.random.rand(config.city_num, config.pos_dimension)
# 城市距离矩阵
city_dist_mat = build_dist_mat(city_pos_list)
print("\n", city_pos_list)
print(city_dist_mat)
# 遗传算法运行
ga = my_utils.ga.Ga(city_dist_mat) # 实例化一个Ga类
result_list, fitness_list = ga.train() # result_list路线结果图 fitness_list适应度结果,对应两个图
result = result_list[-1] # list[-1]:返回最后一个数据,这个集合中存放每一代对应的解,最终的结果为最后一代基因的路线
result_pos_list = city_pos_list[result, :]
# 绘图
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
fig = plt.figure()
plt.plot(result_pos_list[:, 0], result_pos_list[:, 1], 'o-r')
plt.title(u"路线")
# plt.legend()
plt.legend(["This is my legend"], fontsize="x-large")
fig.show()
fig = plt.figure()
plt.plot(fitness_list)
plt.title(u"适应度曲线")
# plt.legend()
# 这里为空的话,会