import heapq
def read_nodes(file_path):
with open(file_path, 'r') as file:
return [tuple(map(float, line.split())) for line in file]
def read_edges(file_path):
with open(file_path, 'r') as file:
return [tuple(map(float, line.split())) for line in file]
def read_points_of_interest(file_path):
with open(file_path, 'r') as file:
return [line.split() for line in file]
def build_graph(nodes, edges):
graph = {int(node_id): {} for node_id, _, _ in nodes}
for edge_id, start_node, end_node, l2_distance in edges:
graph[int(start_node)][int(end_node)] = l2_distance
graph[int(end_node)][int(start_node)] = l2_distance # Assuming undirected edges
return graph
def build_traffic_data(points_of_interest, categories):
traffic_data = {int(node_id): {} for _, node_id, _ in points_of_interest}
for poi_category, longitude, latitude in points_of_interest:
for node_id, _, _ in points_of_interest:
weight = 1.0 # Default weight
if poi_category in categories:
weight = categories[poi_category]
traffic_data[int(node_id)][int(node_id)] = weight
return traffic_data
def modified_dijkstra(graph, source, destination, traffic_data):
distances = {node: float('infinity') for node in graph}
distances[source] = 0
priority_queue = [(0, source)]
while priority_queue:
current_distance, current_node = heapq.heappop(priority_queue)
if current_distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
dynamic_weight = weight * (1 + traffic_data[current_node].get(neighbor, 0))
distance = current_distance + dynamic_weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return distances[destination]
# Example usage:
source_node = 1
destination_node = 3
optimized_distance = modified_dijkstra(graph, source_node, destination_node, traffic_data)
print(f"Optimized Distance from Node {source_node} to Node {destination_node}: {optimized_distance}")