Advertisement
cinnamonandrew

PSO

Mar 28th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. from cmath import sin
  2. from random import randint, random
  3.  
  4. import numpy as np
  5.  
  6.  
  7. class Particle:
  8. def __init__(self, pos, l, f):
  9. """
  10. pos : problem::individual
  11. """
  12. self.__position = pos
  13. self.__size = l
  14. self.fit = f
  15. self.evaluate()
  16. self.velocity = [[0 for i in range(l)] for j in range(l)]
  17.  
  18. self._bestPosition = self.__position.copy()
  19. self._bestFitness = self._fitness
  20.  
  21. def evaluate(self):
  22. self._fitness = self.fit(self.__position)
  23.  
  24. @property
  25. def position(self):
  26. return self.__position
  27.  
  28. @property
  29. def fitness(self):
  30. return self._fitness
  31.  
  32. @property
  33. def best_position(self):
  34. return self._bestPosition
  35.  
  36. @property
  37. def best_fitness(self):
  38. return self._bestFitness
  39.  
  40. @position.setter
  41. def position(self, newPozition):
  42. self.__position = newPozition.copy()
  43. # automatic evaluation of particle's fitness
  44. self.evaluate()
  45. # automatic update of particle's memory
  46. if (self._fitness < self._bestFitness):
  47. self._bestPosition = self.__position
  48. self._bestFitness = self._fitness
  49.  
  50. class PSO:
  51. def __init__(self, size, f):
  52. self.__size = size
  53. self.fitness = f
  54. self.__pop = self.population(size) #!!!!
  55. self.__neighbours = self.select_neighbours(self.__pop, 20)
  56. self.w = 1.0
  57. self.c1 = 1.0
  58. self.c2 = 2.5
  59.  
  60. def get_pop(self):
  61. return self.__pop
  62.  
  63. def individual(self):
  64. m=[]
  65. for i in range(self.__size*2):
  66. m.append(list((np.random.permutation(self.__size)+1)))
  67. return m
  68.  
  69. def population(self, num):
  70. '''Generates num individuals'''
  71. pop = []
  72. for i in range(num):
  73. pop.append(Particle(self.individual(), self.__size, self.fitness))
  74. return pop
  75.  
  76. def select_neighbours(self, pop, size):
  77. if (size > len(pop)):
  78. size = len(pop)
  79.  
  80.  
  81. neighbors = []
  82. for i in range(len(pop)):
  83. localNeighbuor = []
  84. for j in range(size):
  85. x = randint(0, len(pop) - 1)
  86. while (x in localNeighbuor):
  87. x = randint(0, len(pop) - 1)
  88. localNeighbuor.append(x)
  89. neighbors.append(localNeighbuor.copy())
  90. return neighbors
  91.  
  92. def iteration(self, pop, f):
  93. best_neighbors = []
  94.  
  95. for i in range(len(pop)):
  96. best_neighbors.append(self.__neighbours[i][0])
  97. for j in range(1, len(self.__neighbours[i])):
  98. if (pop[best_neighbors[i]].fitness > pop[self.__neighbours[i][j]].fitness):
  99. best_neighbors[i] = self.__neighbours[i][j]
  100.  
  101. for i in range(len(pop)):
  102. for j in range(len(pop[0].velocity)):
  103. new_velocity = self.w * pop[i].velocity
  104. new_velocity = new_velocity + self.c1 * random() * (pop[best_neighbors[i]].position[j] - pop[i].position[j])
  105. new_velocity = new_velocity + self.c2 * random() * (pop[i].best_position[j] - pop[i].position[j])
  106. pop[i].velocity[j] = new_velocity
  107.  
  108. for i in range(len(pop)):
  109. new_position = []
  110. for j in range(len(pop[0].velocity)):
  111. new_position.append(pop[i].position[j] + pop[i].velocity[j])
  112. pop[i].position = new_position
  113. return pop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement