-
Notifications
You must be signed in to change notification settings - Fork 0
/
Particle.py
71 lines (56 loc) · 2.04 KB
/
Particle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from random import random
from Setup import Setup
class Particle:
def __init__(self):
self._s = Setup()
length = len(self._s.getSet())
# randomly generate byte array
self.position = []
for i in range(length):
if random() > 0.5:
self.position.append(0)
else:
self.position.append(1)
# generate the velocity
self._velocity = [random() for i in range(length)]
# define best global,best neighbor and best personal
self._bestGlobal = None
self.bestPersonal = self.position
self._bestFitness = self.fitness()
def fitness(self):
fit = 0
set1 = set()
set2 = set()
l = list(self._s.getSet())
for i in range(len(self._s.getSet())):
if self.position[i] == 0:
set1.add(l[i])
else:
set2.add(l[i])
for i in self._s.getSubSets():
if i.issubset(set1) or i.issubset(set2):
fit -= 1
return fit
def setBestGlobal(self, particle):
self._bestGlobal = particle.position
def getBestGlobal(self):
return self._bestGlobal
def setBestPersonal(self, particle):
self.bestPersonal = particle.position
def getBestPersonal(self):
return self.bestPersonal
def getPosition(self):
return self.position
def evaluate(self):
f = self.fitness()
if (f > self._bestFitness):
self.bestPersonal = self.position
self._bestFitness = f
def update(self, particle, w, c1, c2):
for i in range(len(self.position)):
val = w * self._velocity[i] + c1 * random() * Setup.xor(self._bestGlobal[i], self.position[
i]) + c2 * random() * Setup.xor(particle.position[i], particle.bestPersonal[i])
self._velocity[i] = val
for i in range(len(self._velocity)):
if random() < Setup.sigmoid(self._velocity[i]).real:
self.position[i] = particle.position[i]