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
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()