def nova(self, comprimento): comp = ComparaTexto() caracteres = comp.CARACTERES_POSSIVEIS() resultado = [] for _ in range(comprimento): aleatorio = randint(0, len(caracteres) - 1) resultado.append(caracteres[aleatorio]) return ''.join(resultado)
def inicia(self): gerador = GeradorStrings() inicio = gerador.nova(len(self.texto_esperado)) comp = ComparaTexto() atual = inicio mutacao = Mutacao(2) i = 1 while atual != self.texto_esperado: reproducao = Reproducao(atual, mutacao) nova_geracao = reproducao.criar_geracao(self.filhos_por_geracao) analise = [] for filho in nova_geracao: heappush(analise, (comp.caracteres_diferentes(filho, self.texto_esperado), filho)) atual = heappop(analise)[1] print('Melhor filho: ' + atual) i += 1 print('Geração: ' + str(i))
def test_deve_alterar_exatamente_a_quantidade_de_caracteres_solicitada_1( self): original = "ABCDEFGHIJKLMOPQ" mutacao = Mutacao(1) mutante = mutacao.mutar(original) self.assertEqual( 1, ComparaTexto().caracteres_diferentes(original, mutante))
def test_deve_alterar_exatamente_a_quantidade_de_caracteres_solicitada_2( self): #Teste ruim! #Tanto este teste quanto o teste abaixo não são independentes #A maneira correta de efetuar estes testes seria injetar um encapsulamento #da class SystemRandom e validar a quantidade de chamadas em um mock #Estes testes falham eventualmente por colisões na geração de números aleatórios original = "ABCDEFGHIJKLMOPQ" mutacao = Mutacao(2) mutante = mutacao.mutar(original) self.assertEqual( 2, ComparaTexto().caracteres_diferentes(original, mutante))
class Mutacao(): def __init__(self, mutacoes): self.quantidade_mutacoes = mutacoes self.random = SystemRandom() self.comp = ComparaTexto() self.caracteres = self.comp.CARACTERES_POSSIVEIS() def mutar(self, texto): lst = list(texto) for _ in range(self.quantidade_mutacoes): novo_caractere = self.__caractere_aleatorio__() posicao = self.random.randint(0, len(texto) - 1) lst[posicao] = novo_caractere return ''.join(lst) def __caractere_aleatorio__(self): aleatorio = self.random.randint(0, len(self.caracteres) - 1) return self.caracteres[aleatorio]
def test_deve_retornar_zero_para_strings_iguais(self): comp = ComparaTexto() texto = "ABCDEFGH" diff = comp.caracteres_diferentes(texto, texto) self.assertEquals(0, diff)
def test_deve_retornar_quantidade_de_caracteres_diferentes(self): texto = "ABCDEFGH" texto_2 = "IJCDEFGH" comp = ComparaTexto() diff = comp.caracteres_diferentes(texto, texto_2) self.assertEquals(2, diff)
def __init__(self, mutacoes): self.quantidade_mutacoes = mutacoes self.random = SystemRandom() self.comp = ComparaTexto() self.caracteres = self.comp.CARACTERES_POSSIVEIS()