"""
Created on Thu May 23 14:52:10 2019
@author: lg
"""
from itertools import permutations
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from itertools import combinations, permutations
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
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)
a = list(pop[mating_matrix][:,:-1])
b = list(pop[np.array(1-mating_matrix,dtype=bool)][:,:-1])
b = [list(i) for i in b]
if len(a)%2 !=0:
b.append(a.pop())
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))
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:
for i in x1[:p1]:
if i in center1:
x1[x1[:p1].index(i)] = center2[center1.index(i)]
break
if np.intersect1d(x1[:p1],center1).size == 0:
break
while True:
for i in x1[p2:]:
if i in center1:
x1[x1[p2:].index(i) + p2] = center2[center1.index(i)]
break
if np.intersect1d(x1[p2:],center1).size == 0:
break
while True:
for i in x2[:p1]:
if i in center2:
x2[x2[:p1].index(i)] = center1[center2.index(i)]
break
if np.intersect1d(x2[:p1],center2).size == 0:
break
while True:
for i in x2[p2:]:
if i in center2:
x2[x2[p2:].index(i) + p2] = center1[center2.index(i)]
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)
temp = list_a[p1:p2]
temp.reverse()
list_a[p1:p2] = temp
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)))
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)
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()

参考链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异