用免疫算法解决TSP问题

目录

 

1.思路解读

 2.代码解读

3.PPT和代码文件


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 

猜你喜欢

转载自blog.csdn.net/guaizaiguaizai/article/details/108889628