SingularCode

De Arad para Bucareste

De Arad para Bucareste

Problema

Imagine um agente passando féria na Romênia. O agente está em Arad e precisa ir para Bucareste.

  1. Estado Inicial: Arad
  2. Estado Final: Bucareste
  3. Espaço de estados: Todos os caminhos possíveis
  4. Ações: Passar de uma cidade para outra (ex. Arad até Sibiu)
  5. Solução: O caminho do estado atual até o estado final como melhor solução

Montando uma Árvore de Busca

Para montar uma árvore de busca usando o mapa da Romênia como exemplo:

Nó Raiz: O nó raiz da árvore seria Arad, o ponto de partida.

Nós Filhos: Os nós filhos de qualquer nó na árvore representam os possíveis movimentos ou caminhos a partir daquela cidade. Por exemplo, a partir de Arad, pode-se ir para Zerind, Sibiu ou Timisoara, conforme as conexões disponíveis no mapa.

Custo de Caminho: Cada aresta da árvore (ou seja, o caminho de uma cidade para outra) terá um custo associado, que geralmente representa a distância entre as cidades. 

Montando o Grafo e Heurística

# Grafo das conexões entre as cidades. O valor representa a distância real entre elas.
grafo = {
'Arad': [('Zerind', 75), ('Timisoara', 118), ('Sibiu', 140)],
'Zerind': [('Arad', 75), ('Oradea', 71)],
'Timisoara': [('Arad', 118), ('Lugoj', 111)],
'Sibiu': [('Arad', 140), ('Oradea', 151), ('Fagaras', 99), ('Rimnicu Vilcea', 80)],
'Oradea': [('Zerind', 71), ('Sibiu', 151)],
'Lugoj': [('Timisoara', 111), ('Mehadia', 70)],
'Fagaras': [('Sibiu', 99), ('Bucareste', 211)],
'Rimnicu Vilcea': [('Sibiu', 80), ('Pitesti', 97), ('Craiova', 146)],
'Mehadia': [('Lugoj', 70), ('Drobeta', 75)],
'Drobeta': [('Mehadia', 75), ('Craiova', 120)],
'Craiova': [('Drobeta', 120), ('Rimnicu Vilcea', 146), ('Pitesti', 138)],
'Pitesti': [('Rimnicu Vilcea', 97), ('Craiova', 138), ('Bucareste', 101)],
'Bucareste': [('Fagaras', 211), ('Pitesti', 101), ('Giurgiu', 90)]
}
# Função heurística: distância em linha reta de cada cidade até Bucareste
heuristica = {
'Arad': 366,
'Bucareste': 0,
'Craiova': 160,
'Drobeta': 242,
'Fagaras': 178,
'Giurgiu': 77,
'Lugoj': 244,
'Mehadia': 241,
'Oradea': 380,
'Pitesti': 98,
'Rimnicu Vilcea': 193,
'Sibiu': 253,
'Timisoara': 329,
'Zerind': 374
}

Busca Gulosa

Criar um algoritmo em Python, aplicando a Busca Gulosa

def busca_gulosa(grafo, heuristica, inicio, objetivo):
   visitados = set() # Conjunto para manter o controle das cidades já visitadas
   visitar = [(inicio, 0, [inicio])] # Lista de prioridades com cidades a serem visitadas, começando com a cidade inicial

while visitar:
# Ordena a lista de visitar pela heurística da cidade destino
  visitar.sort(key=lambda x: heuristica[x[0]])
  cidade_atual, custo_atual, caminho_atual = visitar.pop(0)

if cidade_atual == objetivo:
  print(f”Caminho encontrado até {cidade_atual} com custo total de {custo_atual}”)
  print(“Caminho:”, ” -> “.join(caminho_atual))
  return

if cidade_atual not in visitados:
  visitados.add(cidade_atual)

# Adiciona vizinhos à lista de visitar
for vizinho, custo in grafo[cidade_atual]:
  if vizinho not in visitados:
    # Atualiza o caminho com o vizinho atual
    novo_caminho = caminho_atual + [vizinho]
    visitar.append((vizinho, custo_atual + custo, novo_caminho))

print(“Caminho não encontrado”)
return

# Chamada da função
busca_gulosa(grafo, heuristica, ‘Arad’, ‘Bucareste’)

Busca A*

Criar um algoritmo em Python, aplicando a Busca A*


Atualizado em: 20/04/2024 por Nelson H. Koshoji