コード例 #1
0
    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())
コード例 #3
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()