From ff2c184c65b7eca055cc048425c3be7b4f80be10 Mon Sep 17 00:00:00 2001 From: Toby Lane Date: Sun, 30 Jun 2024 00:08:20 +0200 Subject: [PATCH] added dijkstra.py file to utils --- utils/dijkstra.py | 86 +++++++++++++++++++++++++++++++++++++++++++ utils/map_splitter.py | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 utils/dijkstra.py diff --git a/utils/dijkstra.py b/utils/dijkstra.py new file mode 100644 index 0000000..846027b --- /dev/null +++ b/utils/dijkstra.py @@ -0,0 +1,86 @@ +from math import inf + +class Edge: + + length = 0 + + def __init__(self, start, end, length): + self.length = length + self.start = start + self.end = end + +class Node: + + def __init__(self, xpos, ypos): + self.xpos = xpos + self.ypos = ypos + +class Graph: + + def __init__(self): + self.edges = list() + self.nodes = list() + + def add_node(self, xpos, ypos): + self.nodes.append(Node(xpos, ypos)) + + def add_edge(self, start_index, end_index, length): + self.edges.append(Edge(start_index, end_index, length)) + + +def Dijkstra(graph, source_index, target_index): + + n = len(graph.nodes) + + if (target_index >= n): + return None + + unvisited = list(range(n)) + + distances_from_start = [inf] * n + distances_from_start[source_index] = 0 + + node_sequences = [list() for i in range(n)] + node_sequences[source_index] = [source_index] + + while(True): + try: + current_index = min(unvisited, key = lambda i: distances_from_start[i]) + except ValueError: + break + + if current_index == target_index: + break + + unvisited.remove(current_index) + + for edge in filter( + lambda e: e.start == current_index or e.end == current_index, + graph.edges): + + start = current_index + end = edge.end if edge.start == current_index else edge.start + + if end in unvisited and distances_from_start[end] > distances_from_start[start] + edge.length: + distances_from_start[end] = distances_from_start[start] + edge.length + node_sequences[end] = node_sequences[start].copy() + node_sequences[end].append(end) + + return node_sequences[target_index] + + +graph = Graph() + +graph.add_node(1, 2) +graph.add_node(4, 7) +graph.add_node(3,1) +graph.add_node(-2,0) +graph.add_node(0,0) + +graph.add_edge(0, 1, 1) +graph.add_edge(1, 2, 2) +graph.add_edge(2, 3, 3) +graph.add_edge(3, 0, 1) +graph.add_edge(1, 3, 3) + +print(Dijkstra(graph, 0, 5)) \ No newline at end of file diff --git a/utils/map_splitter.py b/utils/map_splitter.py index 002b9e3..bc818a8 100644 --- a/utils/map_splitter.py +++ b/utils/map_splitter.py @@ -13,7 +13,7 @@ def clamp(mn, value, mx): def main(): - # 2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png + # utils/2024-06-27_21.01.45_Lycacraft_minecraft~overworld_day.png # 6144,10240 input_path = input("Input image: ") output_path = input(f"Output dir (default: {DEFAULT_PATH}): ")