def roleta(populacao, p_melhores=30): n_elementos = int((len(populacao) * p_melhores) / 100) ''' TODO: Lancar uma excecao caso: se p_melhores > 100 se p_melhores <=0 se n_elementos <= 0 ''' #com os sem sobreposicao na frente populacao_ordenada = extremo(populacao, len(populacao)) # pesos pesos = [] for i in range(len(populacao_ordenada)): pesos.append(randrange(1, 10) * i + 1) # roleta selecionados = [] while len(selecionados) < n_elementos: for i in range(len(populacao_ordenada)): if pesos[i] == min(pesos): selecionados.append(populacao_ordenada[i]) pesos[i] = max(pesos) return selecionados
def arquivar(f, n_evolucao, experimento, score_ini, melhores_evolucao, tempo): if not os.path.exists(join('dados', str(n_evolucao))): # cria a pasta, se necessario os.makedirs(join('dados', str(n_evolucao))) txt = open(join('dados', str(n_evolucao), str(f) + '.txt'), mode='w') txt.write(experimento+'\n\n') for score in score_ini: txt.write(str(score[2])+'\t'+str(score[1])+'\n') txt.write('\nTempo de execucao:\t' + str(tempo)+'\n') txt.write('Melhor Cromossomo:\t' + str(extremo(deepcopy(melhores_evolucao), 1)[0].score[2])+'\t'+str(extremo(deepcopy(melhores_evolucao), 1)[0].score[1])+'\n\n') """ for cromossomo in melhores_evolucao: txt.write(str(cromossomo.score[2])+'\t'+str(cromossomo.score[1])+'\n') log_resultado(f, str(melhores_evolucao.index(cromossomo)), n_evolucao, experimento, cromossomo) """ log_resultado(f, 'melhor_resultado', n_evolucao, experimento, extremo(deepcopy(melhores_evolucao), 1)[0]) txt.close
def simulated_annealing(cromossomo, NR, T, mutacao_SA, *args): #configuração da mutação _mutacao_SA = mutacao_SA #print(args) if _mutacao_SA is janela: _janela = args[0][0] _randomizar_janela = args[0][1] ran = Random() _NR = NR _T = T cromossomo_sa = cromossomo cromossomo_sa_2 = None for _ in range(_NR): #Funcao de visinhanca - Mutacao if _mutacao_SA is embaralhar: cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa)) elif _mutacao_SA is randomPosition: cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa)) elif _mutacao_SA is centraliza: cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa)) elif _mutacao_SA is troca_temperatura: cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa), _T) elif _mutacao_SA is colocaFontes: cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa)) elif _mutacao_SA is janela: popula = [] popula.append(deepcopy(cromossomo_sa)) nova_populacao = [] nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela, 1)[0]) nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+1, 1)[0]) nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+2, 1)[0]) nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+3, 1)[0]) cromossomo_sa_2 = extremo(deepcopy(popula), 1)[0] #calculo do delta cromossomo_sa_2.funcao_avaliacao() cromossomo_sa.funcao_avaliacao() deltaE = cromossomo_sa_2.score[0] - cromossomo_sa.score[0] #decisão de escolha - probabilidade em funcao da temperatura #print('probabilidade de escolha SA: '+str(math.exp(-deltaE / T))) if deltaE <= 0 or (cromossomo_sa.score[1] == 1 and cromossomo_sa_2.score[1] == 0): cromossomo_sa = cromossomo_sa_2 else: #if ran.random() < (1513096 * (-deltaE / _T) + (1072693248 - 90.253)):77 if ran.random() < math.exp(-deltaE / _T): cromossomo_sa = cromossomo_sa_2 return cromossomo_sa
def evoluir(self): self.a = 0 global result_list historico_populacao = [] # melhor populacao em cada evolucao historico_populacao.append(self._cromossomo_inicial) melhor_cromossomo = self._cromossomo_inicial while self.__condicao_parada(extremo(deepcopy(historico_populacao), 1)[0]): #print('evol\t' + str(self.a) + ' - ' + self._experimento) self.a = self.a+1 """prints de controle print("evolucao - " + str(self.a) + ' temperatura - ' + str(self._T)) # Debug print ---- Remover apos corrigir os erros print("Inicio do AG e antes do SA - \n") print(self._populacao) print("\n\n") """ #-------- Simulated Annealing ---------------# pool = Pool() results = [] i = 0 #Dispara as N threads de SA (onde N e o tamanho da populacao) for cromossomo in self._populacao: results.append(pool.apply_async(func = simulated_annealing, args = (cromossomo, self._NR, self._T, self._mutacao_SA, self._argumentos))) i += 1 pool.close() pool.join() self._populacao = list(map(lambda x, y: x.get(timeout = y), results, range(self._tam_populacao))) """ # Debug print ---- Remover apos corrigir os erros print("Depois do SA - \n") print(self._populacao) print("\n\n") """ #-------- Algoritmo genetico -----------------# for _ in range(self._evolucoesAG): # execultar o calculo de aptidao / func avaliacao # for cromossomo in self._populacao: cromossomo.funcao_avaliacao() # atualiza o score do cromossomo # selecao # if self._selecao is extremo: nova_populacao = self._selecao(deepcopy(self._populacao), self._n_melhores) elif self._selecao is media: nova_populacao = self._selecao(deepcopy(self._populacao)) elif self._selecao is roleta: nova_populacao = self._selecao(deepcopy(self._populacao)) # mutacao # n_elementos_mutados = self._tam_populacao - len(nova_populacao) if self._mutacao is embaralhar: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados)) elif self._mutacao is janela: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), self._janela, self._randomizar_janela, n_elementos_mutados)) elif self._mutacao is randomPosition: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados)) elif self._mutacao is trocaFontes: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados)) elif self._mutacao is centraliza: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados)) elif self._mutacao is troca_temperatura: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), self._T, n_elementos_mutados)) elif self._mutacao is colocaFontes: nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados)) self._populacao = deepcopy(nova_populacao) """ # Debug print ---- Remover apos corrigir os erros print("Final do AG - \n") print(self._populacao) print("\n\n") """ #print(extremo(deepcopy(self._populacao), 1)) melhor_cromossomo = extremo(deepcopy(self._populacao), 1)[0] historico_populacao.append(melhor_cromossomo) # vetor com o melhor de cada populacao self._T = self._T * self._alfa if self.a % 5 == 0: desenha_cromossomo("evolucao_" + str(self.a),melhor_cromossomo) melhor_solucao = extremo(deepcopy(historico_populacao), 1) if melhor_solucao[0].score[1] == 1: print("Nenhuma solucao viavel encontrada") else: print("Melhor solucao:") print(melhor_solucao) #desenha_cromossomo("melhor solucao",melhor_solucao[0]) return historico_populacao