def HillClimbing(t, vt, tempo_limite): tempo = time() estado = [0] * len(vt) while True: vizinhos = VizinhosPositivos(estado) # TIMER CHECK if (time() - tempo) >= tempo_limite: break vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos)) # TIMER CHECK if (time() - tempo) >= tempo_limite: break if len(vizinhos) <= 0: break estado = max(vizinhos, key=lambda e: Valor(e, vt)) tempo = time() - tempo return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
def DeepestDescent(t, vt, inicio, tempo, tempo_limite): estado = inicio while True: # TIMER CHECK if (time() - tempo) >= tempo_limite: break vizinhos = VizinhosPositivos(estado) # TIMER CHECK if (time() - tempo) >= tempo_limite: break vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos)) # TIMER CHECK if (time() - tempo) >= tempo_limite: break continuar = False for vizinho in vizinhos: # TIMER CHECK if (time() - tempo) >= tempo_limite: break if Valor(vizinho, vt) > Valor(estado, vt): estado = vizinho continuar = True if not continuar: break return estado, Valor(estado, vt), Tamanho(estado, vt)
def BeamSearch(t, vt, tempo_limite, m): tempo = time() estado = [0] * len(vt) fila = Queue() fila.put(estado) while True: if (time() - tempo) >= tempo_limite: break expandidos = [] for _ in range(fila.qsize()): vizinhos = VizinhosPositivos(fila.get()) vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos)) expandidos.extend(vizinhos) if len(expandidos) <= 0: break expandidos.sort(key=lambda e: Valor(e, vt), reverse=True) melhores = expandidos[:m] [fila.put(e) for e in melhores] estado = melhores[0] tempo = time() - tempo return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
def SimulatedAnnealing(t, vt, tempo_limite, iteracoes, temperatura, alpha): tempo = time() estado = [0] * len(vt) aux = [0] * len(vt) while temperatura > 0.1: if (time() - tempo) >= tempo_limite: break for _ in range(iteracoes): vizinho = VizinhoAleatorio(aux) if not EhValido(vizinho, t, vt): continue if Valor(vizinho, vt) > Valor(aux, vt): aux = vizinho if Valor(aux, vt) > Valor(estado, vt): estado = aux elif AceitaPior(Valor(vizinho, vt), Valor(aux, vt), temperatura): aux = vizinho temperatura *= alpha tempo = time() - tempo return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
def Genetic(t, vt, tempo_limite, iteracoes, tamanho_populacao, taxa_crossover, taxa_mutacao): tempo = time() estado, valor, tamanho = [0] * len(vt), 0, 0 populacao = [ EstadoAleatorio(t, vt, tempo, tempo_limite) for _ in range(tamanho_populacao) ] for _ in range(iteracoes): if (time() - tempo) >= tempo_limite: break populacao.sort(key=lambda e: Valor(e, vt), reverse=True) gs = populacao.pop(0) if Valor(gs, vt) > Valor(estado, vt): estado = gs # TIMER CHECK if (time() - tempo) >= tempo_limite: break futuro = [gs] evoluidos = Evolve(populacao, t, vt, tamanho_populacao, taxa_crossover, taxa_mutacao, tempo, tempo_limite) futuro.extend(evoluidos) # TIMER CHECK if (time() - tempo) >= tempo_limite: break estrangeiros = [ EstadoAleatorio(t, vt, tempo, tempo_limite) for _ in range(tamanho_populacao - len(futuro)) ] futuro.extend(estrangeiros) # TIMER CHECK if (time() - tempo) >= tempo_limite: break populacao = futuro tempo = time() - tempo return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
def HillClimbing(t, vt, m, tempo, tempo_limite): estado = [0] * len(vt) while Tamanho(estado, vt) < (t // 2): # TIMER CHECK if (time() - tempo) >= tempo_limite: break vizinhos = VizinhosPositivos(estado) # TIMER CHECK if (time() - tempo) >= tempo_limite: break vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos)) # TIMER CHECK if (time() - tempo) >= tempo_limite: break if len(vizinhos) <= 0: break vizinhos.sort(key=lambda e: Valor(e, vt), reverse=True) # TIMER CHECK if (time() - tempo) >= tempo_limite: break estado = Roleta(vizinhos[:m], vt, tempo, tempo_limite) # TIMER CHECK if (time() - tempo) >= tempo_limite: break return estado, Valor(estado, vt), Tamanho(estado, vt)
def Grasp(t, vt, tempo_limite, iteracoes, m): tempo = time() estado = [0] * len(vt) for _ in range(iteracoes): # TIMER CHECK if (time() - tempo) >= tempo_limite: break candidato = GreedyRandomConstruct(t, vt, m, tempo, tempo_limite) # TIMER CHECK if (time() - tempo) >= tempo_limite: break candidato = DeepestDescent(t, vt, candidato, tempo, tempo_limite) if candidato[1] > Valor(estado, vt): estado = candidato[0] tempo = time() - tempo return estado, Valor(estado, vt), Tamanho(estado, vt), tempo