def Evolutionize(self): bestGeneration = [] bestCentroid = None bestFitness = np.inf for i in range(self.itter): tempBestGen = np.inf for j in range(self.populationsize): particles = [k for k in range(self.populationsize) if k != j] #not current randomparticle = [] for a in range(3): ran = random.choice(particles) randomparticle.append(ran) particles.remove(ran) a, b, c = randomparticle mutant = [] for z in range(self.centroidNum): mutant.append([]) for x in range(self.dimension): #print(len(self.population[a].centroid)) #print(len(self.population[a].centroid[z])) tempa = self.population[a].centroid[z][x] tempb = self.population[b].centroid[z][x] tempc = self.population[c].centroid[z][x] temp = tempa - self.mut * (tempb - tempc) mutant[z].append(temp) #temp = [self.population[a].centroid[z][itt] + # self.mut * (self.population[b].centroid[z][itt] # - self.population[c].centroid[z][itt]) for itt in range(len(self.population[0].centroid[z])-1)] #print (temp) #print(mutant) for a in range(len(mutant)): for b in range(len(mutant[a])): mutant[a][b] = np.clip(mutant[a][b], self.bounddown[a], self.boundup[a]) crossTruth = [ np.random.rand(self.dimension) < self.crossp for a in range(self.centroidNum) ] #print(crossTruth) trial = self.population[j].centroid.copy() for a in range(len(crossTruth)): for b in range(len(crossTruth[a])): if (crossTruth[a][b]): trial[a][b] = mutant[a][b] temp = self.population[j].getfitness(trial) print("=========================") print("particle number: " + str(j)) print("fitness trial : " + str(temp)) print("self best : " + str(self.population[j].lastfitness)) #print("%s, %s" %(self.population[j].lastfitness,tempBestGen)) #print("%s" %(self.population[j].lastfitness<tempBestGen)) if self.population[j].lastfitness < tempBestGen: #recording best fitness each generation tempBestGen = self.population[j].lastfitness if (self.population[j].lastfitness < bestFitness): bestFitness = self.population[j].lastfitness bestCentroid = self.population[j].centroid if temp < self.population[j].lastfitness: self.population[j].lastfitness = temp self.population[j].centroid = trial bestGeneration.append(tempBestGen) print("=====================================") print("Itteration : %s" % (i)) print("=====================================") print("bestfitness : %s" % (min(self.fitness))) for i in range(len(bestGeneration)): print("best fitness at generation -%s : %s" % (i, bestGeneration[i])) print("---------------------------------------------------") print("Centroid") print("---------------------------------------------------") for i in range(len(bestCentroid)): print("centroid-%s :%s" % (i, bestCentroid[i])) clust = KMeans(self.data.data, bestCentroid, self.ansdict) clust.run(self.itterkmeans) print("===================================================") print("====================K-Means========================") print("===================================================") print("SSE : %s" % (clust.getaccsse())) print("Akurasi : %s" % (clust.getacc())) print("Assigned data : %s" % (clust.assignedNum)) print("---------------------------------------------------") print("Centroid") print("---------------------------------------------------") for i in range(len(clust.centroid)): print("centroid-%s :%s" % (i, clust.centroid[i])) clust.print_Output()
import random from dataset import Dataset from KMeans import KMeans Data = Dataset('nursery.txt') Data.run() numCen = 5 centroid = [ Data.data[random.randrange(0, len(Data.data))].copy() for i in range(numCen) ] Clust = KMeans(Data.data, centroid, 5) Clust.run(10) print(Clust.getaccsse()) print(Clust.getacc())
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()