参考资料:

遗传算法解决TSP旅行商问题(附:Python实现)

遗传算法详解(GA)(个人觉得很形象,很适合初学者)

from itertools import permutations
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from itertools import combinations, permutations
#%matplotlib inline def fitnessFunction(pop,num,city_num,x_position_add_end,y_position_add_end):
'''适应度函数,计算每个排列的适应度,并保存到pop矩阵第二维的最后一项'''
for x1 in range(num):
square_sum = 0
for x2 in range(city_num):
square_sum += (x_position_add_end[int(pop[x1][x2])] - x_position_add_end[int(pop[x1][x2+1])])**2 + (y_position_add_end[int(pop[x1][x2])] - y_position_add_end[int(pop[x1][x2+1])])**2
# print(round(1/np.sqrt(square_sum),7))
pop[x1][-1] = round(1/np.sqrt(square_sum),7) def choiceFuction(pop):
'''
这里的做法:比如A当前种群中的最优解,B为经过交叉、变异后的最差解,把A作为最当前代中的最优解保存下来作为这一代的最优解,同时A也参与交叉
和变异。经过交叉、变异后的最差解为B,那么我再用A替代B。
:argument pop矩阵
:return 本代适应度最低的个体的索引值和本代适应度最高的个体
'''
yield np.argmin(pop[:, -1])
yield pop[np.argmax(pop[:, -1])] def choice(pop,num,city_num,x_position_add_end,y_position_add_end,b):
fitnessFunction(pop,num,city_num,x_position_add_end,y_position_add_end)
c,d =choiceFuction(pop)
# 上一代的最优值替代本代中的最差值
pop[c] = b
return pop def drawPic(maxFitness,x_position,y_position,i):
index = np.array(maxFitness[:-1],dtype=np.int32)
x_position_add_end = np.append(x_position[index],x_position[[index[0]]])
y_position_add_end = np.append(y_position[index],y_position[[index[0]]])
fig = plt.figure()
plt.plot(x_position_add_end,y_position_add_end,'-o')
plt.xlabel('x',fontsize = 16)
plt.ylabel('y',fontsize = 16)
plt.title('{iter}'.format(iter=i)) def matuingFuction(pop,pc,city_num,pm,num):
mating_matrix =np.array(1-(np.random.rand(num)>pc),dtype=np.bool) # 交配矩阵,如果为true则进行交配
a = list(pop[mating_matrix][:,:-1])# 进行交配的个体
b = list(pop[np.array(1-mating_matrix,dtype=bool)][:,:-1]) # 未进行交配的个体,直接放到下一代
b = [list(i) for i in b] # 对b进行类型转换,避免下面numpy.array 没有index属性
# print(a)
if len(a)%2 !=0:
b.append(a.pop())
# print('ab的长度:',len(a),len(b))
for i in range(int(len(a)/2)):
# 随机初始化两个交配点,这里写得不好,这边的两个点初始化都是一个在中间位置偏左,一个在中间位置偏右
p1 = np.random.randint(1,int(city_num/2)+1)
p2 = np.random.randint(int(city_num/2)+1,city_num)
x1 = list(a.pop())
x2 = list(a.pop())
matuting(x1,x2,p1,p2)
# 交配之后产生的个体进行一定概率上的变异
variationFunction(x1,pm,city_num)
variationFunction(x2,pm,city_num)
b.append(x1)
b.append(x2)
zero = np.zeros((num,1))
# print('b的形状:',len(b))
temp = np.column_stack((b, zero))
return temp def matuting(x1,x2,p1,p2):
# 以下进行交配
# 左边交换位置
temp = x1[:p1]
x1[:p1] = x2[:p1]
x2[:p1] = temp
# 右边交换位置
temp = x1[p2:]
x1[p2:] = x2[p2:]
x2[p2:] = temp
# 寻找重复的元素
center1 = x1[p1:p2]
center2 = x2[p1:p2]
while True: # x1左边
for i in x1[:p1]:
if i in center1:
# print(center1.index(i)) # 根据值找到索引
x1[x1[:p1].index(i)] = center2[center1.index(i)]
break
if np.intersect1d(x1[:p1],center1).size == 0: # 如果不存在交集,则循环结束
break
while True: # x1右边
for i in x1[p2:]:
if i in center1:
# print(center1.index(i)) # 根据值找到索引
x1[x1[p2:].index(i) + p2] = center2[center1.index(i)]
# print(x1)
break
if np.intersect1d(x1[p2:],center1).size == 0: # 如果不存在交集,则循环结束
break
while True: # x2左边
for i in x2[:p1]:
if i in center2:
# print(center2.index(i)) # 根据值找到索引
x2[x2[:p1].index(i)] = center1[center2.index(i)]
break
if np.intersect1d(x2[:p1],center2).size == 0: # 如果不存在交集,则循环结束
break
while True: # x2右边
for i in x2[p2:]:
if i in center2:
# print(center2.index(i)) # 根据值找到索引
x2[x2[p2:].index(i) + p2] = center1[center2.index(i)]
# print(x2)
break
if np.intersect1d(x2[p2:],center2).size == 0: # 如果不存在交集,则循环结束
break def variationFunction(list_a,pm,city_num):
'''变异函数'''
if np.random.rand() < pm:
p1 = np.random.randint(1,int(city_num/2)+1)
p2 = np.random.randint(int(city_num/2)+1,city_num)
# print(p1,p2)
temp = list_a[p1:p2]
temp.reverse()
list_a[p1:p2] = temp
# print(list_a)
def main():
# 初始化
pop = [] # 存放访问顺序和每个个体适应度
num = 250 # 初始化群体的数目
city_num = 10 # 城市数目
pc = 0.9 # 每个个体的交配概率
pm = 0.2 # 每个个体的变异概率
x_position = np.random.randint(0,100,size=city_num)
y_position = np.random.randint(0,100,size=city_num)
x_position_add_end = np.append(x_position,x_position[0])
y_position_add_end = np.append(y_position,y_position[0])
for i in range(num):
pop.append(np.random.permutation(np.arange(0,city_num))) # 假设有5个城市,初始群体的数目为60个
# 初始化化一个60*1的拼接矩阵,值为0
zero = np.zeros((num,1))
pop = np.column_stack((pop, zero)) # 矩阵的拼接
fitnessFunction(pop,num,city_num,x_position_add_end,y_position_add_end)
for i in range(180):
a,b = choiceFuction(pop) # a 为当代适应度最小的个体的索引,b为当代适应度最大的个体,这边要保留的是b
# print('索引值和适应度最大的个体:',a,b)
# pop[a]=b
if (i+1)%10==0:
drawPic(b,x_position,y_position,i+1) # 根据本代中的适应度最大的个体画图
pop_temp = matuingFuction(pop,pc,city_num,pm,num) #交配变异
pop = choice(pop_temp,num,city_num,x_position_add_end,y_position_add_end,b) main()

  

遗传算法求解旅行商(TSP)问题 -- python的更多相关文章

  1. 遗传算法的简单应用-巡回旅行商(TSP)问题的求解

    上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次 ...

  2. 二进制状态压缩dp(旅行商TSP)POJ3311

    http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  3. Hamilton回路 旅行商TSP问题 /// dp oj1964

    题目大意: 给出一个n个顶点的无向图,请寻找一条从顶点0出发,遍历其余顶点一次且仅一次.最后回到顶点0的回路——即Hamilton回路. Input 多测试用例.每个测试用例: 第一行,两个正整数 n ...

  4. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  5. ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)

    做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...

  6. 利用遗传算法求解TSP问题

    转载地址 https://blog.csdn.net/greedystar/article/details/80343841 目录 一.问题描述 二.算法描述 三.求解说明 四.参考资料 五.源代码 ...

  7. 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法

    MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...

  8. hdu 4281 Judges' response(多旅行商&DP)

    Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

随机推荐

  1. 机器学习实战之KNN

    KNN也称K-近邻算法,简单来说,KNN采用测量不同特征值之间的距离的方法进行分类. 优点:精度高,对异常值不敏感,无数据输入假定. 确定:时间复杂度.空间复杂度较高 适用数据范围:数值型和标称型 工 ...

  2. Day3 - Python基础3 函数基本、递归函数、内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 2.2. 函数变量作用域 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1. 函数基本语法及 ...

  3. 机器学习--主成分分析(PCA)算法的原理及优缺点

    一.PCA算法的原理 PCA(principle component analysis),即主成分分析法,是一个非监督的机器学习算法,是一种用于探索高维数据结构的技术,主要用于对数据的降维,通过降维可 ...

  4. UVA 12165 Triangle Hazard

    https://cn.vjudge.net/problem/UVA-12165 题目 给出D.E.F分BC,CA,AB的比$m_1:m_2$,$m_3:m_4$,$m_5:m_6$和PQR三点的坐标, ...

  5. 166. 数独 dancing links 方法

    dfs硬怼通过数独 N皇后的代码后 想学习下新的数据结构和算法来解决这类覆盖问题 习题练习 https://www.acwing.com/problem/content/168/ 数独 https:/ ...

  6. 【Excel】删除重复值

  7. 第05组 Alpha事后诸葛亮

    组长博客链接(2分) 组长博客链接 现代软件工程 项目Postmortem 模板(27分) 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...

  8. python多项式求解

    例如:p(x) = x3 - 3x+5 可以使用向量P=[1,0,-3,5]表示,向量长度减一表示多项式最高项次数. 从右到左分别是变量x的0次幂.1次幂.2次幂……n次幂. 这里可以使用numpy的 ...

  9. 易飞ERP API接口调用DEMO

    一.使用场景: 1.需要开放ERP数据给第三方系统对接,如APP手机端开发,MES,OA等: 2.接口按现在主流开发,restful风格,传JSON数据,跨平台,不限开发工具: 3.不限易飞ERP,支 ...

  10. Java入门系列之字符串特性(二)

    前言 上一节我们讲解到字符串本质上就是字符数组,同时详细讲解了字符串判断相等需要注意的地方,本节我们来深入探讨字符串特性,下面我们一起来看看. 不可变性 我们依然借助初始化字符串的方式来探讨字符串的不 ...