class AlgoritmoGenetico(): def __init__(self): self.taxaCrossover = 0.8 self.taxaMutacao = 0.1 self.geracoes = 100 self.numPopulacao = 100 self.qtdElite = 30 self.qtdCidades = 10 self.populacao = Populacao(self.numPopulacao) def executarAG(self): print('GERAÇÃO 1') self.populacao.calcularRangeRoleta() self.populacao.printPopulacao() print('\n') for i in range(self.geracoes - 1): print('GERAÇÃO {}'.format(i + 2)) self.populacao.setListaDeIndividuos(self.elitista()) self.mutacao_PermutacaoDeElementos() self.populacao.fitnessTotal = 0 self.populacao.calcularFitness() self.populacao.mediaPopulacao = 0 self.populacao.calcularRangeRoleta() self.populacao.printPopulacao() print('\n\n') #self.printGrafico(self.populacao.x, self.populacao.y, [2,3,1,4,8,7,6,5,10,9], self.geracoes, self.populacao.getMediaPopulacao) ''' Sorteia número que irá escolher os pais na roleta para o crossover. ''' def roleta(self): selecaoRoleta = random() * 100 for individuo in self.populacao.getListaDeIndividuos(): faixaRoleta = individuo.getFaixaRoleta() if (selecaoRoleta >= faixaRoleta[0] and selecaoRoleta <= faixaRoleta[1]): return individuo return self.populacao.getListaDeIndividuos()[0] def elitista(self): self.populacao.setListaDeIndividuos( sorted(self.populacao.getListaDeIndividuos(), key=Individuo.getFitnessPercent)) novaGeracao = [] for i in range(self.qtdElite): novaGeracao.append(self.populacao.getListaDeIndividuos().pop()) return self.crossover_BaseadoEmOrdem(novaGeracao) ''' ''' def crossover_BaseadoEmOrdem(self, novaGeracao): for i in range(int(self.numPopulacao / 2)): individuo_1 = self.roleta() individuo_2 = self.roleta() if (random() < self.taxaCrossover): filho_1 = self.crossover(individuo_1.getCromossomo(), individuo_2.getCromossomo()) filho_2 = self.crossover(individuo_2.getCromossomo(), individuo_1.getCromossomo()) filhos = [Individuo(), Individuo()] filhos[0].setCromossomo(filho_1) filhos[0].setGeracao(individuo_1.getGeracao()) filhos[1].setCromossomo(filho_2) filhos[1].setGeracao(individuo_1.getGeracao()) novaGeracao.append(filhos[0]) novaGeracao.append(filhos[1]) else: novaGeracao.append(individuo_1) novaGeracao.append(individuo_2) return novaGeracao def crossover(self, individuo1, individuo2): mascara = [] for i in range(10): if (random() < 0.5): mascara.append('0') else: mascara.append('1') filho = [] listaAux = [] listaAuxOrdenada = [] for i in range(10): if (mascara[i] == '1'): filho.append(individuo1[i]) else: filho.append(0) listaAux.append(individuo1[i]) for i in range(len(individuo2)): if individuo2[i] in listaAux: listaAuxOrdenada.append(individuo2[i]) aux = 0 for i in range(10): if (filho[i] == 0): filho[i] = listaAux[aux] aux = aux + 1 return filho def mutacao_PermutacaoDeElementos(self): for individuo in self.populacao.getListaDeIndividuos(): individuo.mutacao(self.taxaMutacao) ''' FUNÇÕES DO GRÁFICO. ''' def printGrafico(self, x, y, ordem, geracao, media): plt.title(geracao, fontdict=None, loc='center', pad=None) self.printPontos(x, y) self.printPontoStart(x[0], y[0]) self.printCaminhos(x, y, ordem) plt.plot(media, color='b', linewidth=1.0) plt.show() def printPontos(self, x, y): plt.scatter(x, y, marker='o') def printPontoStart(self, x, y): plt.scatter(x, y, color='r', marker='o') def printCaminhos(self, x, y, ordem): x_c = [] y_c = [] for i in range(self.qtdCidades): x_c.append(x[ordem[i]]) y_c.append(y[ordem[i]]) plt.plot(x_c, y_c, color='r') def plotMedia(self, media): plt.title("Média Fitness", fontdict=None, loc='center', pad=None) plt.plot(media, color='b', linewidth=1.0) plt.show()
class AlgoritmoGenetico(): def __init__(self): self.taxaCrossover = 0.8 self.taxaMutacao = 0 self.geracoes = 100 self.numPopulacao = 100 self.populacao = Populacao(self.numPopulacao) def executarAG(self): print('GERAÇÃO 1') self.populacao.calcularRangeRoleta() self.populacao.printPopulacao() print('\n') for i in range(self.geracoes - 1): print('GERAÇÃO {}'.format(i + 2)) self.populacao.setListaDeIndividuos(self.crossover()) self.mutacao() self.populacao.fitnessTotal = 0 self.populacao.calcularFitness() self.populacao.mediaPopulacao = 0 self.populacao.calcularRangeRoleta() self.populacao.printPopulacao() print('\n\n') print('OS 10 MELHORES RESULTADOS: \n') for i in range(10): self.populacao.getListaDeIndividuos()[i].printCromossomo() print('Média de Aptidão da População: \n') print(self.populacao.getMediaPopulacao()) self.plotGraficos() ''' Sorteia número que irá escolher os pais na roleta para o crossover. ''' def roleta(self): selecaoRoleta = random() * 100 for individuo in self.populacao.getListaDeIndividuos(): faixaRoleta = individuo.getFaixaRoleta() if (selecaoRoleta >= faixaRoleta[0] and selecaoRoleta <= faixaRoleta[1]): return individuo return self.populacao.getListaDeIndividuos()[0] ''' Cruzamento entre dois pais para criação de dois filhos. ''' def crossover(self): novaGeracao = [] for i in range(int(self.numPopulacao / 2)): individuo_1 = self.roleta() individuo_2 = self.roleta() if (random() < self.taxaCrossover): pontoCorte = round(random() + len(individuo_1.getCromossomo())) filho_1 = individuo_2.getCromossomo( )[0:pontoCorte] + individuo_1.getCromossomo()[pontoCorte::] filho_2 = individuo_1.getCromossomo( )[0:pontoCorte] + individuo_2.getCromossomo()[pontoCorte::] filhos = [Individuo(), Individuo()] filhos[0].setCromossomo(filho_1) filhos[0].setGeracao(individuo_1.getGeracao()) filhos[1].setCromossomo(filho_2) filhos[1].setGeracao(individuo_1.getGeracao()) novaGeracao.append(filhos[0]) novaGeracao.append(filhos[1]) else: novaGeracao.append(individuo_1) novaGeracao.append(individuo_2) return novaGeracao def mutacao(self): for individuo in self.populacao.getListaDeIndividuos(): individuo.mutarBit(self.taxaMutacao) ''' FUNÇÕES DO GRÁFICO. ''' def funcao1(self, x): return 100 + math.fabs(x * math.sin(math.sqrt(math.fabs(x)))) def plotFuncao1(self): y = [] x = [] for individuo in self.populacao.getListaDeIndividuos(): i = individuo.getFenotipo() x.append(i) y.append(self.funcao1(i)) plt.plot(x, y, color='r', linewidth=2.0) def plotPop(self): x_populacao = [] y_populacao = [] for individuo in self.populacao.getListaDeIndividuos(): x_populacao.append(individuo.getFenotipo()) y_populacao.append(self.funcao1(individuo.getFenotipo())) plt.stem(x_populacao, y_populacao, use_line_collection=True) def plotGraficos(self): plt.title('Gerações', fontdict=None, loc='center', pad=None) self.plotFuncao1() self.plotPop() plt.show()