-
Notifications
You must be signed in to change notification settings - Fork 0
/
fitness.py
62 lines (52 loc) · 2.01 KB
/
fitness.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
import numpy as np
from utils.attribute_utils import evadido, diasAposEvasao, periculosidade,\
prioritario, qtdProcessos, totalVitmasConsumado, totalVitmasTentado,\
prisaoPreventiva, prisaoCondenatoria, mpCVLI, enderecoConhecido,\
qtdPrisaoDecretadas, diasAposExpedicaoMandado, carcerario,\
possuiRG, possuiFoto
class FuncaoRelevancia:
def __init__(self, pesos):
self.pesos = pesos
def __call__(self, row):
return np.average(row, weights=self.pesos)
class FuncaoViabilidade:
def __init__(self, pesos):
self.pesos = pesos
def __call__(self, row):
return np.average(row, weights=self.pesos)
# class FitnessMult:
# def __init__(self, Cg, Cv, Cind, Kr, Kv, dataset):
# self.Cg = Cg
# self.Cind = Cind
# self.Cv = Cv
# self.G = lambda x : 0 # falta implementar
# self.R = FuncaoRelevancia(Kr)
# self.V = FuncaoViabilidade(Kv)
# self.dataset = dataset
# def _fitness_ind(self, row):
# relevancy = self.R(row)
# viability = self.V(row)
# return (1-np.exp(-viability/self.Cv))*relevancy
# def __call__(self, chromossome):
# data = self.dataset.iloc[chromossome]
# if len(data) == 0:
# return -np.inf
# group = self.G(data)
# individual = np.mean(data.apply(self._fitness_ind, axis=1).values)
# return self.Cg*group + self.Cind*individual
class FitnessSum:
def __init__(self, grouping_constant, dataset):
self.grouping_constant = grouping_constant
self.dataset = dataset
def __call__(self, chromossome):
data = self.dataset.iloc[chromossome]
if len(data) == 0:
return -np.inf
if 'cluster' in data:
grouping = groupingFactor(data)
else:
grouping = 0
return data.individual_fitness.mean() + self.grouping_constant*grouping
def groupingFactor(data):
num_clusters = len(data.cluster.unique())
return 1 - num_clusters/data.shape[0]