def printPos(self): self.formattedList = [] for item in self.output: for i in item: # print(i) self.formattedList.append("%.2f" % i) print( "\tLocation:", self.currentPos, "\tFitness:{0:.3f}".format(fit.rastrigin(self.currentPos)), )
def printVals(self): self.formattedList = [] for item in self.output: for i in item: # print(i) self.formattedList.append("%.2f" % i) # print(self.name) # print('\tGlobal Best:',self.globalBest) print("\tLocal Best:", self.localBest) print("\tSelf Best:", self.selfBest) print("\tCurrent Location:", self.currentPos) print("\tCurrent Velocity:", self.currentVel) print("Fitness:{0:.3f}".format(fit.rastrigin(self.currentPos)))
def resetPos(swarm): fits = [] for particle in swarm: fits.append( [fit.rastrigin(particle.currentPos), particle.name, particle.currentPos] ) fits.sort() fits = fits[-2:] # print('\n',fits,'\n') for particle in swarm: if particle.name == fits[0][1]: particle.currentPos = [np.random.random() * 5.8, np.random.random() * 5.8] elif particle.name == fits[1][1]: particle.currentPos = [np.random.random() * 5.8, np.random.random() * 5.8]
def swapPos(swarm): fits = [] for particle in swarm: fits.append( [fit.rastrigin(particle.currentPos), particle.name, particle.currentPos] ) fits.sort() fits = fits[-2:] # print('\n',fits,'\n') for particle in swarm: if particle.name == fits[0][1]: particle.currentPos = fits[1][2] elif particle.name == fits[1][1]: particle.currentPos = fits[0][2]
def updateLocal(swarm: Swarm): finalDist = [] for particle1 in swarm: dist = [] for particle2 in swarm: if particle1.name == particle2.name: continue dist.append( [ distance(particle1.currentPos, particle2.currentPos), particle2.name, fit.rastrigin(particle2.currentPos), particle2.currentPos, ] ) dist.sort() finalDist.append(dist[:n]) counter = 0 for d in finalDist: d.sort(key=lambda x: x[2]) swarm[counter].localBest = d[0][3] counter += 1
def main(): swarm = [] # particle initialization for name in swarmNames: swarm.append(Particle.New(name)) # finds the best position from the init particle locations bestG = 9999 for particle in swarm: if fit.rastrigin(particle.currentPos) < bestG: loc = particle.currentPos bestG = fit.rastrigin(particle.currentPos) for particle in swarm: particle.updateGlobal(loc) updateGlobal(loc, swarm) # printParts(swarm) # [particle.printVals() for particle in swarm] # prints particles updateLocal(swarm) printParts(swarm) swapNums = 0 start = timeit.default_timer() iterations = 10000 for i in range(iterations): for particle in swarm: # if i == 0 or i == 100 or i == 1000 or i == 5000: # particle.printPos() # Part 1: If current position is less than the personal best, if fit.rastrigin(particle.currentPos) < fit.rastrigin(particle.selfBest): # Update personal best particle.selfBest = particle.currentPos # Part 2: If current pos is less than global best, if fit.rastrigin(particle.currentPos) < fit.rastrigin(particle.globalBest): updateGlobal(swarm, particle.currentPos) # Update global best # Part 3: If personal best is less than local best, # if fit.rastrigin(particle.currentPos) < fit.rastrigin(particle.localBest): # Update global best # updateLocal(swarm) # Part 4: Update velocity and position matrices update_velocity(particle) update_position(particle) # if i % 50== 0: # print('Iterations:',i) # particle.printVals() """ if randVal() < p: resetPos(swarm) swapNums += 1 """ stop = timeit.default_timer() print("##################################") bestVal = 9999 for particle in swarm: # particle.printVals() particle.printPos() if fit.rastrigin(particle.currentPos) <= bestVal: bestVal = fit.rastrigin(particle.currentPos) best = particle print("W:", w, " C:", C, " S1:", S, " S2:", S2, " N:", n, " p:", p) print("Number of swaps:", swapNums) # best.printPos() print("Time to run: {0:.3f}".format(stop - start))