python求解TSP(旅行商问题)遗传算法超详细

import numpy as np
import random
class GeneticAlorithm():
    def __init__(self,popsize,crosspro,mutationpro,iternumber,citynumber,size):
        """

        :param popsize: 种群规模
        :param crosspro: 交叉概率
        :param mutationpro: 变异概率
        :param iternumber: 迭代次数
        :param itynumber: 城市数量
        :param size: 锦标赛规模
        """
        self.popsize=popsize
        self.crosspro=crosspro
        self.mutationpro=mutationpro
        self.iternumber=iternumber
        self.chromosome=[]
        self.citynumber=citynumber
        self.size=size
        self.mindistance=0


    def initial_population(self):
        """
        种群初始化grefenstette编码
        :return:
        """
        numberset=[i for i in range(1,self.citynumber+1)]

        for i in range(self.popsize):
            temp=numberset.copy()
            random.shuffle(temp)
            for j in range(0,self.citynumber-1):
                for k in range(j+1,self.citynumber):
                    if temp[j]-1):
                if temp[i]>=temp[j]:
                    temp[i]+=1
                j-=1

        distance=0
        for i in range(0,self.citynumber-1):
            distance+=np.abs(temp[i]-temp[i+1])
        distance+=np.abs(temp[len(temp)-1]-temp[0])
        return distance


    def select(self):
        """
        选择:采用锦标赛
        :return:
        """
        fitness=np.array([self.decode(i) for i in range(0,self.popsize)])

        #精英保留
        bestIndex=np.argmin(fitness)
        self.mindistance=fitness[bestIndex]
        newpopulation=[]
        newpopulation.append(self.chromosome[bestIndex].copy())
        for i in range(self.popsize-1):
            indexset=random.sample(range(self.popsize), self.size)
            distance=self.citynumber*self.citynumber
            bestIndex=indexset[np.argmin(fitness[indexset])]
            newpopulation.append(self.chromosome[bestIndex][:])

        self.chromosome=newpopulation

    def run(self):
        self.initial_population()
        for i in range(self.iternumber):
            self.select()
            self.crossover()
            self.mutation()
        bestIndex=0
        for i in range(0,self.popsize):
            tempdistance=self.decode(i)
            if self.mindistance>tempdistance:
                self.mindistance=tempdistance
                bestIndex=i
        print('最短距离',str(self.mindistance))
        print(self.chromosome[bestIndex])

ga=GeneticAlorithm(50,0.8,0.1,100,10,2)
ga.run()

 

你可能感兴趣的:(python求解TSP(旅行商问题)遗传算法超详细)