def run_optimality_evaluation(G, model, randomness): model.reset_states() try: start_node_id = np.random.choice(G.nodes) goal_node_id = np.random.choice(G.nodes) try: truth_route = nx.shortest_path(G, start_node_id, goal_node_id, weight='best_travel_time') except nx.NetworkXNoPath: print("[ERROR] No path found") return None, None curr_node_id = start_node_id ml_route = [] visited = collections.deque(maxlen=7) # Start node ml_route.append(curr_node_id) use_random_actions = False gt_duration = osmnx_utils.get_route_duration(truth_route, G) history = collections.deque(maxlen=5) while curr_node_id != goal_node_id: curr_node_id = algorithm_commons.predict_next_node_id( G, curr_node_id, goal_node_id, model, randomness=randomness) if curr_node_id: ml_route.append(curr_node_id) if osmnx_utils.get_route_duration(ml_route, G) > gt_duration * 1.5: print("x2 length, try again...") return None, None ml_duration = osmnx_utils.get_route_duration(ml_route, G) # print("------ METRICS ------") # print("GT duration: ", gt_duration, ". ML duration: ", ml_duration, ". Abs Diff: ", ml_duration - gt_duration, ". Ratio: ", gt_duration / ml_duration) # print("---------------------") # ##### PLOT GT AND ML PATHS ###### # ox.plot_graph_route(G, truth_route) # ox.plot_graph_route(G, ml_route) if gt_duration == 0 or ml_duration == 0: return None, None else: return ml_duration, gt_duration except nx.NetworkXError: return None, None
def run_optimality_evaluation(G): start_node_id = np.random.choice(G.nodes) goal_node_id = np.random.choice(G.nodes) truth_route = nx.shortest_path(G, start_node_id, goal_node_id, weight='best_travel_time') curr_node_id = start_node_id ml_route = [] visited = collections.deque(maxlen=7) # Start node ml_route.append(curr_node_id) use_random_actions = False history = collections.deque(maxlen=5) while curr_node_id != goal_node_id: curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model, randomness=0.1) ml_route.append(curr_node_id) gt_duration = get_route_duration(truth_route, G) ml_duration = get_route_duration(ml_route, G) print("------ METRICS ------") print("GT duration: ", gt_duration, ". ML duration: ", ml_duration, ". Abs Diff: ", ml_duration - gt_duration, ". Ratio: ", gt_duration / ml_duration) print("---------------------") ###### PLOT GT AND ML PATHS ###### ox.plot_graph_route(G, truth_route) ox.plot_graph_route(G, ml_route)
def run_generalization_evaluation(G, model): experiment_count = 50 experiment_node_pairs = [(np.random.choice(G.nodes), np.random.choice(G.nodes)) for i in range(1, experiment_count)] # Eval optimality and arrival rate to later check how # dynamic network changes affect these # optimalities = [] # for start_goal_pair in experiment_node_pairs: # ml_route = [] # optimal_route = [] # curr_node_id = start_goal_pair[0] # goal_node_id = start_goal_pair[1] # before_modification_node_id = curr_node_id # while curr_node_id != start_goal_pair[1]: # for i in range(0, 5): # curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model) # ml_route.append(curr_node_id) # optimal_route = utils.split_list_at_value(nx.shortest_path(G, before_modification_node_id, # goal_node_id, weight='best_travel_time'), curr_node_id) # optimalities.append(get_route_duration(ml_route, G) / get_route_duration(optimal_route, G)) # ml_route = [] # optimal_route = [] # before_modification_node_id = curr_node_id # # Modify graph # print("Optimality rate (dynamic): ", reduce(lambda a,b: a + b, optimalities) / len(optimalities)) optimalities_static = [] for start_goal_pair in experiment_node_pairs: ml_route = [] optimal_route = [] curr_node_id = start_goal_pair[0] goal_node_id = start_goal_pair[1] before_modification_node_id = curr_node_id while curr_node_id != start_goal_pair[1]: curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model) ml_route.append(curr_node_id) optimal_route = nx.shortest_path(G, start_goal_pair[0], goal_node_id, weight='best_travel_time') optimalities_static.append( get_route_duration(ml_route, G) / get_route_duration(optimal_route, G)) random_network_modification(G) print( "Optimality rate (dynamic): ", reduce(lambda a, b: a + b, optimalities_static) / len(optimalities_static)) optimalities_static = [] for start_goal_pair in experiment_node_pairs: ml_route = [] optimal_route = [] curr_node_id = start_goal_pair[0] goal_node_id = start_goal_pair[1] before_modification_node_id = curr_node_id while curr_node_id != start_goal_pair[1]: curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model) ml_route.append(curr_node_id) optimal_route = nx.shortest_path(G, start_goal_pair[0], goal_node_id, weight='best_travel_time') optimalities_static.append( get_route_duration(ml_route, G) / get_route_duration(optimal_route, G)) print( "Optimality rate (static): ", reduce(lambda a, b: a + b, optimalities_static) / len(optimalities_static))
def run_generalization_evaluation(G, model): experiment_count = 50 experiment_node_pairs = [(np.random.choice(G.nodes), np.random.choice(G.nodes)) for i in range(1, experiment_count)] optimalities_static = [] for start_goal_pair in experiment_node_pairs: ml_route = [] optimal_route = [] curr_node_id = start_goal_pair[0] goal_node_id = start_goal_pair[1] before_modification_node_id = curr_node_id while curr_node_id != start_goal_pair[1]: curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model) ml_route.append(curr_node_id) optimal_route = nx.shortest_path(G, start_goal_pair[0], goal_node_id, weight='best_travel_time') optimalities_static.append( get_route_duration(ml_route, G) / get_route_duration(optimal_route, G)) random_network_modification(G) print( "Optimality rate (dynamic): ", reduce(lambda a, b: a + b, optimalities_static) / len(optimalities_static)) optimalities_static = [] for start_goal_pair in experiment_node_pairs: ml_route = [] optimal_route = [] curr_node_id = start_goal_pair[0] goal_node_id = start_goal_pair[1] before_modification_node_id = curr_node_id while curr_node_id != start_goal_pair[1]: curr_node_id = predict_next_node_id(G, curr_node_id, goal_node_id, model) ml_route.append(curr_node_id) optimal_route = nx.shortest_path(G, start_goal_pair[0], goal_node_id, weight='best_travel_time') optimalities_static.append( get_route_duration(ml_route, G) / get_route_duration(optimal_route, G)) print( "Optimality rate (static): ", reduce(lambda a, b: a + b, optimalities_static) / len(optimalities_static))