def inversaDFS(self): """ Exceção em: 1 2 3 4 5 0 0 1 1 """ from inversãoDeMatrizes import MatrizEstendidaEstado """ Usaremos uma busca em profundidade. Vamos precisar de um estado inicial para fazer a busca e uma fila fronteira """ estadoInicial = MatrizEstendidaEstado.estadoInicial(self) fronteira = [estadoInicial] quantidadeDeExpandidos = 0 quantidadeDeVisitados = 0 expansoesDeVisitados = 0 conjuntoDeVisitados = set() """ Agora, para cada estado no final da fila, verificamos se é o estado final. Se não for, adicionamos os sucessores dele que já não estão na fila ao fim dela. """ while (len(fronteira) != 0): atual = fronteira.pop() conjuntoDeVisitados.add(atual) quantidadeDeVisitados += 1 if (atual.testeEstadoFinal()): inversa = [linha[len(linha)//2:] for linha in atual.linhasDaMatriz] print("%s estados expandidos. %s visitados. %s expansões de visitados." \ % (quantidadeDeExpandidos, quantidadeDeVisitados, expansoesDeVisitados)) return Matriz(inversa) else: sucessoresDoAtual = atual.sucessores() quantidadeDeExpandidos += len(sucessoresDoAtual) # for sucessor in [sucessor for sucessor in sucessoresDoAtual if sucessor not in fronteira \ # and sucessor not in conjuntoDeVisitados]: # fronteira.append(sucessor) for sucessor in sucessoresDoAtual: if (sucessor in conjuntoDeVisitados): expansoesDeVisitados += 1 if (sucessor not in fronteira and sucessor not in conjuntoDeVisitados): fronteira.append(sucessor)
def inversaComHeuristica(self): from inversãoDeMatrizes import MatrizEstendidaEstado import heapq """ Vamos precisar de um estado inicial para fazer a busca e um heap fronteira """ estadoInicial = MatrizEstendidaEstado.estadoInicial(self) fronteira = [(estadoInicial.heuristica(), estadoInicial)] conjuntoDeVisitados = set() heapq.heapify(fronteira) quantidadeDeExpandidos = 0 quantidadeDeVisitados = 0 expansoesDeVisitados = 0 """ Agora, escolhemos o estado com a menor heurística e, verificamos se é o estado final. Se não for, adicionamos os sucessores dele que já não estão na fila ao fim dela. """ while (True): # (heuristica, estadoAtual) = fronteira[0] (heuristicaDoEstadoAtual, estadoAtual) = heapq.heappop(fronteira) quantidadeDeVisitados += 1 if (estadoAtual.testeEstadoFinal()): print("%s estados expandidos. %s visitados. %s expansões de visitados." \ % (quantidadeDeExpandidos, quantidadeDeVisitados, expansoesDeVisitados)) inversa = Matriz([linha[len(linha)//2::] for linha in estadoAtual.linhasDaMatriz]) return inversa else: sucessoresDoAtual = estadoAtual.sucessores() quantidadeDeExpandidos += len(sucessoresDoAtual) for sucessor in sucessoresDoAtual: tuplaSucessor = (sucessor.heuristica(), sucessor) if (tuplaSucessor in conjuntoDeVisitados): expansoesDeVisitados+=1 if (tuplaSucessor not in fronteira and tuplaSucessor not in conjuntoDeVisitados): heapq.heappush(fronteira, tuplaSucessor) conjuntoDeVisitados.add((heuristicaDoEstadoAtual, estadoAtual))