Python 图算法优化:寻找容量最大的路径
Here is the optimized version of the method:
-
Use a set instead of a list for the 'visited' array to improve the efficiency of checking if a node has been visited.
-
Use a dictionary instead of a list for the 'best_capacity' array to improve the efficiency of updating the capacities of the nodes.
-
Use a named tuple instead of a tuple to store the information of the nodes in the priority queue to improve the readability of the code.
-
Use a variable instead of '-10.**10' as the initial capacity value to improve the readability of the code.
-
Remove the check for 'parent_list[destination] is None' since it is redundant.
-
Simplify the code to construct the path by using a while loop instead of a for loop and a reverse operation.
Here is the optimized code:
from typing import List, Tuple
import heapq as hp
Node = Tuple[float, int, int] # (capacity, current_node, parent_node)
def find_fitting_most_capacited_path(graph1: List[List[Tuple[float, float]]], graph2: List[List[float]],
origin: int, destination: int, minimum_capacity: float) -> Tuple[List[int], float]:
# this is a dijkstra like algorithm that computes the most capacited path from the origin to the destination
# the best capacity is according to graph1 but only edges with capacities >= minimum_capacity in graph2 are taken into account
priority_q = [Node(float('-inf'), origin, None)]
parent_list = [None] * len(graph1)
visited = set()
best_capacity = {i: float('-inf') for i in range(len(graph1))}
best_capacity[origin] = 0.0
while priority_q:
capa_of_current_node, current_node, parent_node = hp.heappop(priority_q)
if current_node not in visited:
visited.add(current_node)
parent_list[current_node] = parent_node
if current_node == destination:
break
for neighbor, (capa, _) in graph1[current_node]:
if neighbor not in visited and graph2[current_node][neighbor] >= minimum_capacity:
new_capa = min(capa_of_current_node, capa)
if new_capa > best_capacity[neighbor]:
best_capacity[neighbor] = new_capa
hp.heappush(priority_q, Node(-new_capa, neighbor, current_node))
path = []
current_node = destination
while current_node is not None:
path.append(current_node)
current_node = parent_list[current_node]
path.reverse()
return path, best_capacity[destination]
原文地址: https://www.cveoy.top/t/topic/m89s 著作权归作者所有。请勿转载和采集!