Example #1
0
 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)),
     )
Example #2
0
 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)))
Example #3
0
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]
Example #4
0
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]
Example #5
0
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
Example #6
0
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))