Files
KI/P1/search.py
2025-05-12 12:59:24 +02:00

66 lines
2.2 KiB
Python

from graph import *
from utils import getNode
def traverse(graph, frontier, start_node_name, target_node_name):
explored = []
path = []
# node
start_node = getNode(start_node_name, graph.nodes)
start_node.value = 0
target_node = getNode(target_node_name, graph.nodes)
frontier.push(start_node)
while not frontier.empty():
current_node = frontier.pop()
if not current_node == target_node:
explored.append(current_node.name)
for edge in current_node.edges:
child = edge.end
new_cost = current_node.value + edge.value
if not explored.__contains__(child.name):
child.parent = current_node
child.value = new_cost
frontier.push(child)
# UCS-only, updating the value and parent of node in the queue
elif frontier.type == 'PRIO' and new_cost < child.value:
for node in frontier.items:
if node.name == child.name:
node.value = new_cost
node.parent = current_node
frontier.items.sort(key=lambda item: item.value)
break
else:
path.append(current_node.name)
while not current_node == start_node:
current_node = current_node.parent
path.insert(0, current_node.name)
break
if len(path) == 0:
print('zwischen ' + start_node_name + ' und ' + target_node_name + ' konnte kein Pfad gefunden werden')
else:
print('From ' + start_node_name + ' to ' + target_node_name + ': ')
print('Path: ' + path.__str__().format())
print('Cost: ' + target_node.value.__str__())
def bfs(graph, start_node_name, target_node_name):
traverse(graph, Queue('FIFO'), start_node_name, target_node_name)
def dfs(graph, start_node_name, target_node_name):
traverse(graph, Queue('LIFO'), start_node_name, target_node_name)
def ucs(graph, start_node_name, target_node_name):
traverse(graph, Queue('PRIO'), start_node_name, target_node_name)