""" This module holds the logic for the solving """ from args import Settings from parser import DataSet class Dijkstra(): def __init__(self, graph: dict, connection: tuple): """ table: matrix with vertex as key, price and prev vertex as value OL: open list, to keep track of finished vertecis """ self.graph = graph self.table = {} for vertex in graph: self.table.update({vertex: { "distance": (9999999, 999999), "prev": None}}) self.table[connection[0]]["distance"] = (0, 0) def algorithm(self, settings: Settings): if settings.debug: print("Performing Dijkstra on the following graph...") for vertex in self.graph: if settings.debug: print(f"{vertex}: {self.graph[vertex]}") print("") for v1 in self.graph.keys(): neighbors = self.graph[v1] for n in neighbors: key = [elem for elem in n.keys()][0] # name of neighbor node edge = (n[key]["time"], n[key]["co2"]) # update both time and co2 time = self.table[v1]["distance"][0] + edge[0] co2 = self.table[v1]["distance"][1] + edge[1] # but only eval the one we want if settings.sort == "time": if time < self.table[key]["distance"][0]: self.table[key]["distance"] = (time, co2) self.table[key]["prev"] = v1 elif settings.sort == "co2": if co2 < self.table[key]["distance"][1]: self.table[key]["distance"] = (time, co2) self.table[key]["prev"] = v1 if settings.debug: print("Final Dijkstra table:", self.table) def print_result(self, connection: tuple, dataset: DataSet): sequence = [] (start, dest) = connection # start at destination sequence.append(dest) # go through all possibilities until we're back at start while start not in sequence: current = self.table[sequence[-1]] # last element of list prev = current["prev"] sequence.append(prev) sequence.reverse() connection = dataset.connection frm = dataset.locations[connection[0]] to = dataset.locations[connection[1]] print(f"{frm.name}-->{to.name}") print("----") print(f"Lufstrecke: {frm.distance(to)}") total = "" for loc in sequence: total += f"{dataset.locations[loc].name}-->" # remove last arrow again total = total[0:-3] print(total) print("Total Time:", self.table[dest]["distance"][0]) print("Total CO2:", self.table[dest]["distance"][1])