def hillClimb(): tabuleiro = gerarTabuleiro() while (1): vizinho = Tabuleiro() vizinho.tabuleiro = deepcopy(tabuleiro.tabuleiro) moverUmaRainha(vizinho) if (vizinho.custo >= tabuleiro.custo): return tabuleiro tabuleiro = vizinho
def gerarTabuleiro(): tabuleiro = Tabuleiro() tabuleiro.tabuleiro = [['_' for x in range(8)] for x in range(8)] for coluna in range(8): linha = randint(0, 7) tabuleiro.tabuleiro[linha][coluna] = "Q" tabuleiro.custo = calculaColisoes(tabuleiro.tabuleiro) return tabuleiro
def simulatedAnnealing(): Ti = 100 Tf = 0.1 taxa = 0.8 S0 = gerarTabuleiro() #Solução Inicial S = S0 #(Solucao Atual) n_iteracoes = 50 melhor_solucao = S0 T = Ti while (T > Tf): for x in range(n_iteracoes): vizinho = Tabuleiro() vizinho.tabuleiro = deepcopy(S.tabuleiro) moverUmaRainha(vizinho) deltaCusto = vizinho.custo - S.custo if deltaCusto < 0: S = vizinho else: numero_random = uniform(0, 1) ## Aceita estados piores ## A função exp diminue conforme T diminue if numero_random < math.exp(-deltaCusto / T): S = vizinho if (S.custo < melhor_solucao.custo): melhor_solucao = S T = taxa * T return melhor_solucao
TOTAL_EXECUCOES = int(input("\nTotal Execuções: ")) colisoes_exec = {} i = 0 while (TOTAL_EXECUCOES > i): print("\nExecução: %d" % (i)) solucao = hillClimb() colisoes = solucao.custo print("\tColisões: %d" % (colisoes)) if (i == 0): melhor_solucao = Tabuleiro() melhor_solucao.tabuleiro = deepcopy(solucao.tabuleiro) melhor_solucao.custo = colisoes elif colisoes < melhor_solucao.custo: melhor_solucao.tabuleiro = deepcopy(solucao.tabuleiro) melhor_solucao.custo = colisoes if (str(colisoes) in colisoes_exec): colisoes_exec[str(colisoes)] += 1 else: colisoes_exec[str(colisoes)] = 1 i += 1 print("\n\nTabela de Colisoes\n")