Skip to content

Menor caminho entre duas cidades

Considere o mapa abaixo:

Implemente um agente autônomo que consegue resolver este problema. Antes de iniciar a implementação, pense na resposta para as seguintes perguntas:

  • O que é relevante representar nos estados do mundo? Como os estados são estruturados (estrutura de dados) e qual o significado dela (dos campos)?
  • Mostre como ficam representados os estados inicial e final segundo a representação adotada.
  • Quais as operações sobre os estados? (detalhe como cada operação irá alterar os estados e quais as condições para cada operação ser executada)
  • Qual a estimativa do tamanho do espaço de busca (número de estados possíveis)?
  • Que algoritmo de busca pode ser utilizado para resolver este problema considerando que a solução apresentada precisa ser ótima?

Sugestão de codificação do mapa

Considere a definição abaixo como mapa para a sua implementação:

    @staticmethod
    def createArea():

        Mapa = {
            'a':[(3,'b'),(6,'c')],
            'b':[(3,'a'),(3,'h'),(3,'k')],
            'c':[(6,'a'),(2,'g'),(3,'d'),(2,'o'),(2,'p')],
            'd':[(3,'c'),(1,'f'),(1,'e')],
            'e':[(2,'i'),(1,'f'),(1,'d'),(14,'m')],
            'f':[(1,'g'),(1,'e'),(1,'d')],
            'g':[(2,'c'),(1,'f'),(2,'h')],
            'h':[(2,'i'),(2,'g'),(3,'b'),(4,'k')],
            'i':[(2,'e'),(2,'h')],
            'l':[(1,'k')],
            'k':[(1,'l'),(3,'n'),(4,'h'),(3,'b')],
            'm':[(2,'n'),(1,'x'),(14,'e')],
            'n':[(2,'m'),(3,'k')],
            'o':[(2,'c')],
            'p':[(2,'c')],
            'x':[(1,'m')]
            }

Implementações

Implemente um agente, usando o algoritmo de busca em largura, para encontrar um caminho entre a cidade i e o.

Perguntas:

  • Qual foi o tempo de processamento até a implementação encontrar uma solução?
  • A árvore de busca gerada é "inteligente"?
  • A solução encontrada é ótima?

Usando a mesma implementação, encontre um caminho entre a cidade b e o.

Perguntas:

  • Qual foi o tempo de processamento até a implementação encontrar uma solução?
  • A árvore de busca gerada é "inteligente"?
  • A solução encontrada é ótima?

Usando o algoritmo de custo uniforme

Utilize o algoritmo de custo uniforme para encontrar uma solução para os problemas abaixo:

  • da cidade i para a cidade o
  • da cidade b para a cidade o
  • da cidade i para a cidade x

Perguntas:

  • Qual foi o tempo de processamento até a implementação encontrar uma solução?
  • A árvore de busca gerada é "inteligente"?
  • A solução encontrada é ótima?

Entendendo a busca que o algoritmo faz

Para entendermos melhor o que está acontecendo, segue a implementação da Busca de Custo Uniforme:

class BuscaCustoUniforme (SearchAlgorithm):

    def search (self, initialState, trace=False):
        open = []
        new_n = Node(initialState, None)
        open.append((new_n, new_n.g))
        while (len(open) > 0):
            #list sorted by g()
            open.sort(key = sortFunction, reverse = True)
            n = open.pop()[0]
            if trace: print(f'Estado = {n.state.env()} com custo = {n.g}') 
            if (n.state.is_goal()):
                return n
            for i in n.state.sucessors():
                new_n = Node(i,n)
                open.append((new_n,new_n.g))
        return None

Ao executar:

    state = Map('i', 0, 'i', 'x')
    algorithm = BuscaCustoUniforme()
    ts = time.time()
    result = algorithm.search(state, trace=True)
    tf = time.time()

O algoritmo abriu muitos nodos de forma desnecessária?

Usando heurísticas para otimizar a busca na árvore

O que é uma heurística?

O que é uma heurística?

Qual é a utilidade de uma heurística?

Qual é a utilidade de uma heurística?

Que heurística podemos usar no problema das cidades?

Que heurística podemos usar no problema das cidades?

Para responder as perguntas acima considere o slide 32 em diante: