-
Notifications
You must be signed in to change notification settings - Fork 1
/
individuo.py
101 lines (88 loc) · 3 KB
/
individuo.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from tools import shuffle
__author__ = '@arthurj'
class Individuo:
"""
Desenvolvido com a ajuda (na modelagem) do professor
Francisco Javier Ropero Pelaez
Somo:
(Cromossomo) representa um indivíduo formado por genes e uma nota,
que deve ser dada de acordo com o desempenho obtido no ambiente.
"""
def __init__(self, tabela, horarios, professores, genes=None):
if genes is None:
genes = list(range(len(tabela)))
genes = tuple(shuffle(genes, prob=.8))
self.genes = genes
self.nota = 0
if self.crash_case(horarios, professores):
raise Exception('CRASH')
self.contador_zeros = 0
self.idade = 0
self.avaliar(tabela) # avaliação plana
def avaliar(self, tabela):
nota = 0
qtd_individuos = len(tabela)
for i, j in enumerate(self.genes):
if tabela[i][j] == 0:
self.contador_zeros += 1
nota -= qtd_individuos * 5
else:
nota += tabela[i][j]
self.nota += nota / len(tabela)
def crash_case(self, horarios, professores):
for hora in horarios:
for nome in professores:
count = 0
for i in professores[nome]:
for j in horarios[hora]:
if i is self.genes[j]:
count += 1
if count >= 2:
return True
return False
def __lt__(self, other):
if self.nota == other.nota and \
self.contador_zeros > other.contador_zeros:
return True
if self.nota < other.nota:
return True
else:
return False
def __le__(self, other):
if self.nota == other.nota and \
self.contador_zeros > other.contador_zeros:
return True
if self.nota <= other.nota:
return True
else:
return False
def __gt__(self, other):
if self.nota == other.nota and \
self.contador_zeros < other.contador_zeros:
return True
if self.nota > other.nota:
return True
else:
return False
def __ge__(self, other):
if self.nota == other.nota and \
self.contador_zeros < other.contador_zeros:
return True
if self.nota >= other.nota:
return True
else:
return False
def __eq__(self, other):
if self.nota == other.nota and \
self.genes == other.genes:
return True
else:
return False
def __str__(self):
zeros = ''
inconsistencia = ''
if self.contador_zeros > 0:
zeros = ' (' + str(self.contador_zeros) + ' zeros)'
return inconsistencia + str(self.genes) + ' Nota:{0:.2f} '.format(self.nota) + zeros
def __hash__(self):
return hash(self.genes)