From c380d75454bf3fe860131ab101f6baffbf21c264 Mon Sep 17 00:00:00 2001 From: MLErik <baerenjesus@gmail.com> Date: Thu, 3 Oct 2019 08:49:32 -0400 Subject: [PATCH] changed all node to city --- flatland/envs/rail_generators.py | 121 ++++++++++++++------------- flatland/envs/schedule_generators.py | 8 +- 2 files changed, 65 insertions(+), 64 deletions(-) diff --git a/flatland/envs/rail_generators.py b/flatland/envs/rail_generators.py index fa18298c..bbbb2c06 100644 --- a/flatland/envs/rail_generators.py +++ b/flatland/envs/rail_generators.py @@ -1,7 +1,7 @@ """Rail generators (infrastructure manager, "Infrastrukturbetreiber").""" import time import warnings -from typing import Callable, Tuple, Optional, Dict, List, Any +from typing import Callable, Tuple, Optional, Dict, List import msgpack import numpy as np @@ -560,7 +560,7 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ rails_between_cities = rails_in_city if max_rails_between_cities > rails_in_city else max_rails_between_cities # Evenly distribute cities - node_time_start = time.time() + city_time_start = time.time() if grid_mode: city_positions, city_cells = _generate_evenly_distr_city_positions(max_num_cities, city_radius, width, height) else: @@ -569,15 +569,15 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ # reduce num_cities if less were generated in random mode num_cities = len(city_positions) if DEBUG_PRINT_TIMING: - print("City position time", time.time() - node_time_start, "Seconds") + print("City position time", time.time() - city_time_start, "Seconds") # Set up connection points for all cities - node_connection_time = time.time() - inner_connection_points, outer_connection_points, connection_info, city_orientations = _generate_node_connection_points( + city_connection_time = time.time() + inner_connection_points, outer_connection_points, connection_info, city_orientations = _generate_city_connection_points( city_positions, city_radius, rails_between_cities, rails_in_city) if DEBUG_PRINT_TIMING: - print("Connection points", time.time() - node_connection_time) + print("Connection points", time.time() - city_connection_time) # Connect the cities through the connection points city_connection_time = time.time() @@ -609,14 +609,14 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ # Generate start target pairs schedule_time = time.time() - agent_start_targets_nodes, num_agents = _generate_start_target_pairs(num_agents, num_cities, train_stations, - city_orientations) + agent_start_targets_cities, num_agents = _generate_start_target_pairs(num_agents, num_cities, train_stations, + city_orientations) if DEBUG_PRINT_TIMING: print("Schedule time", time.time() - schedule_time) return grid_map, {'agents_hints': { 'num_agents': num_agents, - 'agent_start_targets_nodes': agent_start_targets_nodes, + 'agent_start_targets_cities': agent_start_targets_cities, 'train_stations': train_stations, 'city_orientations': city_orientations }} @@ -632,9 +632,9 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ row = city_radius + 1 + np.random.randint(height - 2 * (city_radius + 1)) col = city_radius + 1 + np.random.randint(width - 2 * (city_radius + 1)) too_close = False - # Check distance to nodes - for node_pos in city_positions: - if _are_cities_overlapping((row, col), node_pos, 2 * (city_radius + 1) + 1): + # Check distance to cities + for city_pos in city_positions: + if _are_cities_overlapping((row, col), city_pos, 2 * (city_radius + 1) + 1): too_close = True if not too_close: @@ -665,17 +665,18 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ city_cells.extend(_get_cells_in_city(city_positions[-1], city_radius)) return city_positions, city_cells - def _generate_node_connection_points(city_positions: List[Tuple[int, int]], city_radius: int, rails_between_cities: int, rails_in_city: int = 2): + def _generate_city_connection_points(city_positions: List[Tuple[int, int]], city_radius: int, + rails_between_cities: int, rails_in_city: int = 2): inner_connection_points = [] outer_connection_points = [] connection_info = [] city_orientations = [] - for node_position in city_positions: + for city_position in city_positions: # Chose the directions where close cities are situated neighb_dist = [] - for neighb_node in city_positions: - neighb_dist.append(distance_on_rail(node_position, neighb_node, metric="Manhattan")) + for neighb_city in city_positions: + neighb_dist.append(distance_on_rail(city_position, neighb_city, metric="Manhattan")) closest_neighb_idx = argsort(neighb_dist) # Store the directions to these neighbours and orient city to face closest neighbour @@ -684,7 +685,7 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ if grid_mode: current_closest_direction = np.random.randint(4) else: - current_closest_direction = direction_to_point(node_position, city_positions[closest_neighb_idx[idx]]) + current_closest_direction = direction_to_point(city_position, city_positions[closest_neighb_idx[idx]]) connection_sides_idx.append(current_closest_direction) connection_sides_idx.append((current_closest_direction + 2) % 4) city_orientations.append(current_closest_direction) @@ -703,16 +704,16 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ for connection_idx in range(connections_per_direction[direction]): if direction == 0: tmp_coordinates = ( - node_position[0] - city_radius, node_position[1] + connection_slots[connection_idx]) + city_position[0] - city_radius, city_position[1] + connection_slots[connection_idx]) if direction == 1: tmp_coordinates = ( - node_position[0] + connection_slots[connection_idx], node_position[1] + city_radius) + city_position[0] + connection_slots[connection_idx], city_position[1] + city_radius) if direction == 2: tmp_coordinates = ( - node_position[0] + city_radius, node_position[1] + connection_slots[connection_idx]) + city_position[0] + city_radius, city_position[1] + connection_slots[connection_idx]) if direction == 3: tmp_coordinates = ( - node_position[0] + connection_slots[connection_idx], node_position[1] - city_radius) + city_position[0] + connection_slots[connection_idx], city_position[1] - city_radius) connection_points_coordinates_inner[direction].append(tmp_coordinates) if connection_idx in range(start_idx, start_idx + number_of_out_rails + 1): connection_points_coordinates_outer[direction].append(tmp_coordinates) @@ -762,7 +763,7 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ return all_paths - def _build_inner_cities(node_positions, inner_connection_points, outer_connection_points, node_radius, rail_trans, + def _build_inner_cities(city_positions, inner_connection_points, outer_connection_points, city_radius, rail_trans, grid_map): """ Builds inner city tracks. This current version connects all incoming connections to all outgoing connections @@ -773,9 +774,9 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ :param grid_map: :return: Returns the cells of the through path which cannot be occupied by trainstations """ - through_path_cells = [[] for i in range(len(node_positions))] - free_tracks = [[] for i in range(len(node_positions))] - for current_city in range(len(node_positions)): + through_path_cells = [[] for i in range(len(city_positions))] + free_tracks = [[] for i in range(len(city_positions))] + for current_city in range(len(city_positions)): all_outer_connection_points = [item for sublist in outer_connection_points[current_city] for item in sublist] # This part only works if we have keep same number of connection points for both directions @@ -805,63 +806,63 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ free_tracks[current_city].append(current_track) return through_path_cells, free_tracks - def _set_trainstation_positions(node_positions, node_radius, free_tracks, grid_map): + def _set_trainstation_positions(city_positions, city_radius, free_tracks, grid_map): """ :param city_positions: :param num_trainstations: :return: """ - nb_nodes = len(node_positions) - train_stations = [[] for i in range(nb_nodes)] + nb_cities = len(city_positions) + train_stations = [[] for i in range(nb_cities)] left = 0 right = 0 built_num_trainstations = 0 - for current_city in range(len(node_positions)): + for current_city in range(len(city_positions)): for track_nbr in range(len(free_tracks[current_city])): - possible_location = free_tracks[current_city][track_nbr][node_radius] + possible_location = free_tracks[current_city][track_nbr][city_radius] train_stations[current_city].append((possible_location, track_nbr)) return train_stations, built_num_trainstations - def _generate_start_target_pairs(num_agents, nb_nodes, train_stations, city_orientation): + def _generate_start_target_pairs(num_agents, nb_cities, train_stations, city_orientation): """ Fill the trainstation positions with targets and goals :param num_agents: - :param nb_nodes: + :param nb_cities: :param train_stations: :return: """ - # Generate start and target node directory for all agents. - # Assure that start and target are not in the same node - agent_start_targets_nodes = [] + # Generate start and target city directory for all agents. + # Assure that start and target are not in the same city + agent_start_targets_cities = [] - # Slot availability in node - node_available_start = [] - node_available_target = [] - for node_idx in range(nb_nodes): - node_available_start.append(len(train_stations[node_idx])) - node_available_target.append(len(train_stations[node_idx])) + # Slot availability in city + city_available_start = [] + city_available_target = [] + for city_idx in range(nb_cities): + city_available_start.append(len(train_stations[city_idx])) + city_available_target.append(len(train_stations[city_idx])) # Assign agents to slots for agent_idx in range(num_agents): - avail_start_nodes = [idx for idx, val in enumerate(node_available_start) if val > 0] - avail_target_nodes = [idx for idx, val in enumerate(node_available_target) if val > 0] + avail_start_cities = [idx for idx, val in enumerate(city_available_start) if val > 0] + avail_target_cities = [idx for idx, val in enumerate(city_available_target) if val > 0] # Set probability to choose start and stop from trainstations - sum_start = sum(np.array(node_available_start)[avail_start_nodes]) - sum_target = sum(np.array(node_available_target)[avail_target_nodes]) - p_avail_start = [float(i) / sum_start for i in np.array(node_available_start)[avail_start_nodes]] + sum_start = sum(np.array(city_available_start)[avail_start_cities]) + sum_target = sum(np.array(city_available_target)[avail_target_cities]) + p_avail_start = [float(i) / sum_start for i in np.array(city_available_start)[avail_start_cities]] - start_target_tuple = np.random.choice(avail_start_nodes, p=p_avail_start, size=2, replace=False) - start_node = start_target_tuple[0] - target_node = start_target_tuple[1] - agent_start_targets_nodes.append((start_node, target_node, city_orientation[start_node])) - return agent_start_targets_nodes, num_agents + start_target_tuple = np.random.choice(avail_start_cities, p=p_avail_start, size=2, replace=False) + start_city = start_target_tuple[0] + target_city = start_target_tuple[1] + agent_start_targets_cities.append((start_city, target_city, city_orientation[start_city])) + return agent_start_targets_cities, num_agents def _fix_transitions(city_cells, inter_city_lines, grid_map): """ Function to fix all transition elements in environment """ - # Fix all nodes with illegal transition maps + # Fix all cities with illegal transition maps rails_to_fix = np.zeros(2 * grid_map.height * grid_map.width * 2, dtype='int') rails_to_fix_cnt = 0 cells_to_fix = city_cells + inter_city_lines @@ -878,22 +879,22 @@ def sparse_rail_generator(max_num_cities: int = 5, grid_mode: bool = False, max_ for cell in range(rails_to_fix_cnt): grid_map.fix_transitions((rails_to_fix[2 * cell], rails_to_fix[2 * cell + 1])) - def _closest_neighbour_in_direction(current_city_idx: int, node_positions: List[Tuple[int, int]]): + def _closest_neighbour_in_direction(current_city_idx: int, city_positions: List[Tuple[int, int]]): """ Returns indices of closest neighbours in every direction NESW - :param current_city_idx: Index of node in city_positions list + :param current_city_idx: Index of city in city_positions list :param city_positions: list of all points being considered :return: list of index of closest neighbours in all directions """ - node_dist = [] + city_dist = [] closest_neighb = [None for i in range(4)] - for av_node in range(len(node_positions)): - node_dist.append( - distance_on_rail(node_positions[current_city_idx], node_positions[av_node], metric="Manhattan")) - sorted_neighbours = np.argsort(node_dist) + for av_city in range(len(city_positions)): + city_dist.append( + distance_on_rail(city_positions[current_city_idx], city_positions[av_city], metric="Manhattan")) + sorted_neighbours = np.argsort(city_dist) direction_set = 0 for neighb in sorted_neighbours[1:]: - direction_to_neighb = direction_to_point(node_positions[current_city_idx], node_positions[neighb]) + direction_to_neighb = direction_to_point(city_positions[current_city_idx], city_positions[neighb]) if closest_neighb[direction_to_neighb] == None: closest_neighb[direction_to_neighb] = neighb direction_set += 1 diff --git a/flatland/envs/schedule_generators.py b/flatland/envs/schedule_generators.py index c7be5f57..bdd4b48b 100644 --- a/flatland/envs/schedule_generators.py +++ b/flatland/envs/schedule_generators.py @@ -61,7 +61,7 @@ def sparse_schedule_generator(speed_ratio_map: Mapping[float, float] = None) -> def generator(rail: GridTransitionMap, num_agents: int, hints: Any = None): train_stations = hints['train_stations'] - agent_start_targets_nodes = hints['agent_start_targets_nodes'] + agent_start_targets_cities = hints['agent_start_targets_cities'] max_num_agents = hints['num_agents'] city_orientations = hints['city_orientations'] if num_agents > max_num_agents: @@ -73,8 +73,8 @@ def sparse_schedule_generator(speed_ratio_map: Mapping[float, float] = None) -> agents_direction = [] for agent_idx in range(num_agents): # Set target for agent - start_city = agent_start_targets_nodes[agent_idx][0] - target_city = agent_start_targets_nodes[agent_idx][1] + start_city = agent_start_targets_cities[agent_idx][0] + target_city = agent_start_targets_cities[agent_idx][1] start = random.choice(train_stations[start_city]) target = random.choice(train_stations[target_city]) while start[1] % 2 != 0: @@ -82,7 +82,7 @@ def sparse_schedule_generator(speed_ratio_map: Mapping[float, float] = None) -> while target[1] % 2 != 1: target = random.choice(train_stations[target_city]) - agent_orientation = (agent_start_targets_nodes[agent_idx][2] + 2 * start[1]) % 4 + agent_orientation = (agent_start_targets_cities[agent_idx][2] + 2 * start[1]) % 4 if not rail.check_path_exists(start[0], agent_orientation, target[0]): agent_orientation = (agent_orientation + 2) % 4 if not (rail.check_path_exists(start[0], agent_orientation, target[0])): -- GitLab