コード例 #1
0
class Particle:
    def __init__(self, data, numCen, ansdict):
        self.centroid = [
            data[random.randrange(0, len(data))].copy() for i in range(numCen)
        ]
        self.clust = KMeans(data, self.centroid, ansdict)
        self.lastfitness = self.getfitness()

    def getfitness(self, centroid=None):
        if centroid != None:
            self.clust.newcentroid(centroid)
        self.clust.clusterize()
        fitness = self.clust.getaccsse()
        self.clust.newcentroid(self.centroid)
        return fitness
コード例 #2
0
class Ant():
    def __init__(self,data, ansdict,numCen, tabuindex, pheromap, alpha, beta, max_itter, decay):
        self.centroid = [data[random.randrange(0,len(data))].copy()for i in range(numCen)]
        self.defCentroid = self.centroid.copy()
        self.clust = KMeans(data, self.centroid, ansdict)
        self.max_itter = max_itter
        self.alpha = alpha
        self.beta = beta
        self.pheromap = pheromap
        self.tabu = {}
        self.decay = decay
        self.fitness = 0
        self.numCen = numCen
        self.data = data
        self.tabuIndex = tabuindex
    def init(self):
        self.centroid = self.defCentroid.copy()
        self.tabu = {}
    
    def spreadPheromon(self):
        self.clust.getRandomData(5)
        self.possibleMove = self.clust.random
        self.distMove = self.clust.randomDist
        #print(self.possibleMove)
        #print(type(self.pheromap))
        for nodeList in range(len(self.possibleMove)):
            for node in range(len(self.possibleMove[nodeList])):
                a = self.possibleMove[nodeList][node]
                try:
                    self.pheromap[a] = self.pheromap[a] *self.decay
                    try:
                        self.pheromap [a]+=1.0/self.distMove[nodeList][node]
                    except:
                        self.pheromap [a]+=0
                except KeyError:
                    self.pheromap[a] = self.distMove[nodeList][node]
        #print(self.pheromap)
        #print(self.distMove)
    def probMov(self):
        self.poss_mov = [[] for i in range(self.numCen)]
        self.prob_mov=[[]for i in range(self.numCen)]
        for nodeList in range(len(self.possibleMove)):
            for node in range(len(self.possibleMove[nodeList])):
                a = self.possibleMove[nodeList][node]
                try:
                    temp = self.tabu[a]
                except KeyError:
                    self.poss_mov[nodeList].append(a)    
                    temp = (self.pheromap[a]**self.alpha)*(self.distMove[nodeList][node]**self.beta)
                    self.prob_mov[nodeList].append(temp)
                
        temp_mov = len(self.possibleMove)
        for a in range(len(self.poss_mov)):
            for b in range(len(self.poss_mov[a])):
                self.prob_mov[a][b] = self.prob_mov[a][b] / (temp_mov)
        #print(self.prob_mov)
        
    def decaytabu(self):
        todel = []
        for node in self.tabu:
            self.tabu[node]-=1
            if (self.tabu[node]==0):
                todel.append(node)
        for node in todel:
            del self.tabu[node]
    
    def mov(self):
        self.decaytabu()
        newcen = []
        #print(self.poss_mov)
        for i in range(self.numCen):
            
            a = list(range(len(self.poss_mov[i])))
            
            movement = choice(a,1,self.prob_mov[i])
            movement = movement[0]
            #print(self.poss_mov[i][movement])
            newcen.append(self.data[self.poss_mov[i][movement]])
            self.tabu[self.poss_mov[i][movement]]=self.tabuIndex
        self.centroid = newcen.copy()
        self.clust.newcentroid(self.centroid)
        #self.clust.clusterize()
        #print(self.centroid)
        
    
    def run(self):
        for a in range(self.max_itter):
            self.spreadPheromon()
            self.probMov()
            self.mov()
        self.fitness = self.clust.getaccsse()