目录
1.思路解读
2.代码解读
//immune-TSP.py
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 2 16:30:16 2020
@author: cgz
"""
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#显示画图中文标题
NP = 100 #免疫个体数目
G = 500; #最大免疫代数
Pc = 0.1 #交叉率
N = 30 #城市数目
Ncl = 10 #克隆数目
#初始抗体群
def ord(N,NP):
b = np.zeros((N,NP)) #b就是30行100列的用0填充的数组
for i in range(NP):
b[:,i] = np.random.permutation(range(0,N))#冒号表示所有行,第i列;表示对0-30的序列进行随机排序
return b.astype(int)
#定义城市之间的距离
def distance(city_size,loca):
dismat = np.zeros((city_size,city_size))
for i in range(city_size):
for j in range(i,city_size):
dismat[i][j] = dismat[j][i] = np.linalg.norm(loca[i] - loca[j])
return dismat
#代表这条路径的总长度
def fun3(D,f,N):
len = D[f[N - 1], f[0]]
for i in range(N - 1):
len = len + D[f[i]][f[i + 1]]
return len
loca=np.random.uniform(0,1000,(N,2))#这个表示范围在0-1000之间,30*2格式 表示每一个城市的地点,可以看做是x,y坐标
f = np.zeros((N,NP)) #中间变量
D = distance(N,loca) #D为30个城市的距离矩阵
len = np.zeros((NP,1)) # len 100*1 100行1列的
f = ord(N,NP) #f为30*100
for i in range(NP):
len[i] = fun3(D,f[:,i],N)
Index = np.argsort(len,axis=0)#对len按照行进行索引排序
Sortlen = np.zeros((NP,1))#100行1列的
Sortf = np.zeros((N,NP))#30行100列
for i in range(NP):
Sortf[:,i] = f[:,Index[i][0]]
Sortlen[i,0] = len[Index[i][0],0] #从小到大
#循环
Trace = np.zeros((G,1))
for gen in range(G):
af = np.zeros((30,50),dtype=int)
alen = np.zeros((50,1))
for i in range(50):
a = Sortf[:,i]#对前50列依次选取
b = np.tile(a,(Ncl,1))#对选取的某一列进行克隆
Ca = np.transpose(b)#对b进行转置
for j in range(Ncl):
p1 = np.random.randint(0,30)
p2 = np.random.randint(0,30)
while p1 == p2:
p1 = np.random.randint(0,30)
p2 = np.random.randint(0,30)
tmp = Ca[p1,j]
Ca[p1,j] = Ca[p2,j]
Ca[p2,j] = tmp
Ca[:,0] = Sortf[:,i]#把克隆的已经变异的第一个赋成原值
#克隆抑制
Ca = Ca.astype(int) #Ca 30*10
Calen = np.zeros((Ncl,1)) #Calen 10*1
for j in range(Ncl):
Calen[j,0] = fun3(D,Ca[:,j],N)#得出克隆的这10个里面的总长度
Index = np.argsort(Calen,axis=0)#对克隆的10个距离数从小到大的排序,值为索引值
#这一部分是根据索引值,将路径也按照距离从小到大的进行排序,得到路径从小到大排序,距离从小到大排序
SortCalen = np.zeros((Ncl,1))
SortCa = np.zeros((N,Ncl))
for k in range(Ncl):
SortCa[:,k] = Ca[:,Index[k][0]] #SortCa 30*10
SortCalen[k,0] = Calen[Index[k][0],0] #SortCalen 10*1
af[:,i] = SortCa[:,0] #af 30*50 对于前50列,依次替换成已经克隆过的每一列的最小值
alen[i,0] = SortCalen[0,0]#alen 50*1 距离也做相应的替换
#种群刷新
bf = np.zeros((N,50),dtype=int) #bf 30*50 对于后50列,重新随机生成抗体,进行排序
blen = np.zeros((50,1)) #blen 50*1
for i in range(50):
a = ord(30,1)
a.shape = 30 #将a由二维变成一维
bf[:,i] = a
blen[i,0] = fun3(D,bf[:,i],N) #依次得到最新生成的50列的距离
#免疫种群和新种群合并
f = np.append(af,bf,axis = 1) #30*100
len = np.append(alen,blen,axis = 0) #100*1
Index = np.argsort(len,axis=0)
Sortlen = np.zeros((NP,1)) #Sortlen 100*1
Sortf = np.zeros((N,NP)) #Sortf 30*100
for i in range(NP):
Sortf[:,i] = f[:,Index[i][0]]
Sortlen[i,0] = len[Index[i][0],0] #从小到大
Trace[gen,0] = Sortlen[0,0]
x=range(500)
Trace.shape=500
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,Trace)
plt.show()
fBest = np.zeros((30,1),dtype=int)
fBest = Sortf[:,0].astype(int)
Bestlen = Trace[-1,0]
print(fBest)
print(Bestlen)
plt.figure()
for i in range(N-1):
plt.plot(loca[fBest,0],loca[fBest,1])
plt.title("最优路径")
plt.show()
3.PPT和代码文件
链接: https://pan.baidu.com/s/1BdEHCppo3YlVW18-rCJL3g 提取码: m4vp