예제 #1
0
    def test_get_operators_cost(self):
        """
        to test operators cost method
        :return:
        """

        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            network_obj.add_route(route)

        for route in radial_routes_bus:
            network_obj.add_route(route)

        f = defaultdict(float)
        k = defaultdict(float)

        line_cycle_time = defaultdict(float)
        for route in network_obj.get_routes():
            f[route.id] = 28
            k[route.id] = 100
            line_cycle_time[route.id] = 10

        cost = OperatorsCost.get_operators_cost(network_obj.get_routes(),
                                                line_cycle_time, f, k)

        self.assertEqual(cost, 75331.2)
예제 #2
0
    def setUp(self) -> None:
        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        demand_obj = Demand.build_from_parameters(graph_obj=graph_obj, y=100, a=0.5, alpha=1 / 3, beta=1 / 3)
        passenger_obj = Passenger.get_default_passenger()
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        self.network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = self.network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = self.network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            self.network_obj.add_route(route_obj=route)

        for route in radial_routes_bus:
            self.network_obj.add_route(route_obj=route)

        self.extended_graph_obj = ExtendedGraph(graph_obj=graph_obj, routes=self.network_obj.get_routes(),
                                                TP=passenger_obj.pt, frequency_routes=None)
        hyperpath_obj = Hyperpath(extended_graph_obj=self.extended_graph_obj, passenger_obj=passenger_obj)

        self.hyperpaths, self.labels, self.successors, self.frequency, self.Vij = hyperpath_obj.get_all_hyperpaths(
            OD_matrix=demand_obj.get_matrix())

        self.OD_assignment = Assignment.get_assignment(hyperpaths=self.hyperpaths, labels=self.labels, p=2,
                                                       vp=passenger_obj.va, spa=passenger_obj.spa,
                                                       spv=passenger_obj.spv)
예제 #3
0
 def test_raises_get_route_exceptions(self):
     """
     raises get_route exceptions from transport network class
     :return:
     """
     with self.assertRaises(exceptions.RouteIdNotFoundException):
         graph_obj = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
         network = TransportNetwork(graph_obj)
         network.get_route("r1")
예제 #4
0
    def test_resources_consumer(self):

        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        demand_obj = Demand.build_from_parameters(graph_obj=graph_obj,
                                                  y=100,
                                                  a=0.5,
                                                  alpha=1 / 3,
                                                  beta=1 / 3)
        passenger_obj = Passenger.get_default_passenger()
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            network_obj.add_route(route_obj=route)

        for route in radial_routes_bus:
            network_obj.add_route(route_obj=route)

        extended_graph_obj = ExtendedGraph(graph_obj=graph_obj,
                                           routes=network_obj.get_routes(),
                                           TP=passenger_obj.pt,
                                           frequency_routes=None)
        hyperpath_obj = Hyperpath(extended_graph_obj=extended_graph_obj,
                                  passenger_obj=passenger_obj)

        hyperpaths, labels, successors, frequency, Vij = hyperpath_obj.get_all_hyperpaths(
            OD_matrix=demand_obj.get_matrix())

        OD_assignment = Assignment.get_assignment(hyperpaths=hyperpaths,
                                                  labels=labels,
                                                  p=2,
                                                  vp=passenger_obj.va,
                                                  spa=passenger_obj.spa,
                                                  spv=passenger_obj.spv)

        f = defaultdict(float)
        z = defaultdict(lambda: defaultdict(lambda: defaultdict(float)))
        v = defaultdict(lambda: defaultdict(lambda: defaultdict(float)))

        for route in network_obj.get_routes():
            f[route.id] = 28

        CU_obj = UsersCost()
        ta, te, tv, t = CU_obj.resources_consumer(hyperpaths, Vij,
                                                  OD_assignment, successors,
                                                  extended_graph_obj,
                                                  passenger_obj.va, f, z, v)

        self.assertEqual(round(ta, 4), 3.069)
        self.assertEqual(round(te, 4), 13.9597)
        self.assertEqual(round(tv, 4), 74.685)
        self.assertEqual(round(t, 4), 41.6667)
    def test_get_mode_network_distance(self):

        graph_obj = Graph.build_from_parameters(2, 10, 1, 2)
        network_obj = TransportNetwork(graph_obj)
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        CI_obj = InfrastructureCost()

        circular = network_obj.get_circular_routes(mode_obj=metro_obj)
        radial = network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in circular:
            network_obj.add_route(route)

        for route in radial:
            network_obj.add_route(route)

        f = defaultdict(float)
        for route in network_obj.get_routes():
            f[route.id] = 28

        mode_distance = CI_obj.get_mode_network_distance(graph_obj,
                                                         network_obj,
                                                         f=f)

        self.assertEqual(mode_distance[bus_obj], 160)
        self.assertEqual(mode_distance[metro_obj], 20)
예제 #6
0
    def test_lines_travel_time(self):
        """
        test lines_travel_time method of class operators_cost
        :return:
        """
        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            network_obj.add_route(route_obj=route)

        for route in radial_routes_bus:
            network_obj.add_route(route_obj=route)

        lines_travel_time = OperatorsCost.lines_travel_time(
            routes=network_obj.get_routes(),
            edge_distance=graph_obj.get_edges_distance())

        self.assertEqual(lines_travel_time["R_bus_1"], 1.5)
        self.assertEqual(lines_travel_time["F_metro_1"], 0.25)
예제 #7
0
    def test_remove_route_transport_network(self):
        """
        to test delete_route method of class transport_network class
        :return:
        """

        graph_obj = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        network = TransportNetwork(graph_obj)
        route = Route("r1", bus_obj, "1,2,0,4,3", "3,4,0,2,1", "1,0,3", "3,0,1")
        network.add_route(route)
        network.remove_route("r1")
        self.assertEqual(len(network.get_routes()), 0)

        with self.assertRaises(exceptions.RouteIdNotFoundException):
            network.remove_route("r1")
예제 #8
0
    def test_network_to_file(self):
        """
        to test method to write a file with network information
        :return:
        """

        graph_obj = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        metro = mode_manager.get_mode("metro")
        network = TransportNetwork(graph_obj)
        route1 = Route("r1", bus_obj, "1,2,0,4,3", "3,4,0,2,1", "1,0,3", "3,0,1")
        route2 = Route("r2", metro, "1,2,0,4,3", "3,4,0,2,1", "1,0,3", "3,0,1")
        network.add_route(route1)
        network.add_route(route2)
        # write file
        network.routes_to_file(os.path.join(self.data_path, 'write_test.csv'))
        file_obj = Path(os.path.join(self.data_path, 'write_test.csv'))
        # test
        self.assertTrue(file_obj.is_file())
        # to compare file with a test file
        self.assertTrue(
            filecmp.cmp(os.path.join(self.data_path, 'write1_test.csv'),
                        os.path.join(self.data_path, "write_test.csv")))
        # remove file
        os.remove(os.path.join(self.data_path, 'write_test.csv'))
예제 #9
0
    def test_get_feeder_routes(self):
        """
        to test add feeder routes
        :return:
        """
        graph_obj = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        network = TransportNetwork(graph_obj)

        routes = network.get_feeder_routes(bus_obj)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [1, 2])
        self.assertEqual(routes[0].nodes_sequence_r, [2, 1])
        self.assertEqual(routes[0].stops_sequence_i, [1, 2])
        self.assertEqual(routes[0].stops_sequence_r, [2, 1])
        self.assertEqual(routes[1].nodes_sequence_i, [3, 4])
        self.assertEqual(routes[1].nodes_sequence_r, [4, 3])
        self.assertEqual(routes[1].stops_sequence_i, [3, 4])
        self.assertEqual(routes[1].stops_sequence_r, [4, 3])

        with self.assertRaises(exceptions.ModeIsNotValidException):
            network.get_feeder_routes("bus_obj")
예제 #10
0
    def get_mode_network_distance(graph_obj: Graph,
                                  network_obj: TransportNetwork,
                                  f: defaultdict_float) -> defaultdict_float:
        """
        to get total distance builded in each transport mode
        :param network_obj: TransportNetwork object
        :param graph_obj: Graph object
        :param f: dict with frequency for each route_id
        :return: ddict with total distance for each mode in transport network
        """
        edges = graph_obj.get_edges()
        edges_distance = graph_obj.get_edges_distance()

        routes = network_obj.get_routes()
        list_modes = network_obj.get_modes()

        mode_distance = defaultdict(float)

        for mode in list_modes:
            edge_list = []
            for edge in edges:
                d_e = edges_distance[edge.node1.id][edge.node2.id]
                for route in routes:
                    if route.mode == mode:
                        if f[route.id] != 0:
                            node_sequence_i = route.nodes_sequence_i
                            node_sequence_r = route.nodes_sequence_r

                            ver_sum = False
                            for i in range(len(node_sequence_i) - 1):
                                j = i + 1
                                if node_sequence_i[
                                        i] == edge.node1.id and node_sequence_i[
                                            j] == edge.node2.id and (
                                                edge.node1.id, edge.node2.id
                                            ) not in edge_list:
                                    mode_distance[mode] += d_e * mode.d
                                    edge_list.append(
                                        (edge.node1.id, edge.node2.id))
                                    edge_list.append(
                                        (edge.node2.id, edge.node1.id))
                                    ver_sum = True
                                    break
                            if ver_sum is True:
                                break
                            for i in range(len(node_sequence_r) - 1):
                                j = i + 1
                                if node_sequence_r[
                                        i] == edge.node1.id and node_sequence_r[
                                            j] == edge.node2.id and (
                                                edge.node1.id, edge.node2.id
                                            ) not in edge_list:
                                    mode_distance[mode] += d_e * mode.d
                                    edge_list.append(
                                        (edge.node1.id, edge.node2.id))
                                    edge_list.append(
                                        (edge.node2.id, edge.node1.id))
                                    ver_sum = True
                                    break
                            if ver_sum is True:
                                break

        return mode_distance
예제 #11
0
    def test_get_cycle_time(self):
        """
        test get_cycle_time method of class operators_cost
        :return:
        """
        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        demand_obj = Demand.build_from_parameters(graph_obj=graph_obj,
                                                  y=100,
                                                  a=0.5,
                                                  alpha=1 / 3,
                                                  beta=1 / 3)
        passenger_obj = Passenger.get_default_passenger()
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            network_obj.add_route(route_obj=route)

        for route in radial_routes_bus:
            network_obj.add_route(route_obj=route)

        extended_graph_obj = ExtendedGraph(graph_obj=graph_obj,
                                           routes=network_obj.get_routes(),
                                           TP=passenger_obj.pt,
                                           frequency_routes=None)
        hyperpath_obj = Hyperpath(extended_graph_obj=extended_graph_obj,
                                  passenger_obj=passenger_obj)

        hyperpaths, labels, successors, frequency, Vij = hyperpath_obj.get_all_hyperpaths(
            OD_matrix=demand_obj.get_matrix())

        OD_assignment = Assignment.get_assignment(hyperpaths=hyperpaths,
                                                  labels=labels,
                                                  p=2,
                                                  vp=passenger_obj.va,
                                                  spa=passenger_obj.spa,
                                                  spv=passenger_obj.spv)

        f = defaultdict(float)
        for route in network_obj.get_routes():
            f[route.id] = 28

        z, v, loaded_section_route = Assignment.get_alighting_and_boarding(
            Vij=Vij,
            hyperpaths=hyperpaths,
            successors=successors,
            assignment=OD_assignment,
            f=f)

        lines_travel_time = OperatorsCost.lines_travel_time(
            routes=network_obj.get_routes(),
            edge_distance=graph_obj.get_edges_distance())

        line_cycle_time = OperatorsCost.get_cycle_time(
            z, v, network_obj.get_routes(), lines_travel_time)

        self.assertEqual(round(line_cycle_time["F_metro_1"], 7), 0.2500082)
        self.assertEqual(round(line_cycle_time["R_bus_1"], 7), 1.5032756)
        self.assertEqual(line_cycle_time["l1"], 0)
예제 #12
0
    def test_add_route_transport_network(self):
        """
        to test add_route method of transport_network class
        :return:
        """
        graph_obj = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        network = TransportNetwork(graph_obj)
        route = Route("r1", bus_obj, "1,2,0,4,3", "3,4,0,2,1", "1,0,3", "3,0,1")
        network.add_route(route)

        self.assertTrue(isinstance(network.get_route("r1"), Route))
        self.assertEqual(len(network.get_routes()), 1)

        with self.assertRaises(exceptions.RouteIsNotvalidException):
            network.add_route("route")

        with self.assertRaises(exceptions.NodeSequencesIsNotValidException):
            route = Route("r2", bus_obj, "1,3,0,4,3", "3,4,0,2,1", "1,0,3",
                          "3,0,1")
            network.add_route(route)

        with self.assertRaises(exceptions.RouteIdDuplicatedException):
            route = Route("r1", bus_obj, "1,2,0,4,3", "3,4,0,2,1", "1,0,3",
                          "3,0,1")
            network.add_route(route)
예제 #13
0
    def test_get_tangencial_routes(self):
        """
        to test add tangencial routes
        :return:
        """
        g = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        m = TransportModeManager()
        bus = m.get_mode("bus")
        t = TransportNetwork(g)

        routes = t.get_tangencial_routes(mode_obj=bus, jump=2, short=False, express=False)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [1, 2, 4, 6, 5])
        self.assertEqual(routes[0].nodes_sequence_r, [5, 6, 4, 2, 1])
        self.assertEqual(routes[0].stops_sequence_i, [1, 2, 4, 6, 5])
        self.assertEqual(routes[0].stops_sequence_r, [5, 6, 4, 2, 1])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_i, [9, 10, 2, 4, 3])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_r, [3, 4, 2, 10, 9])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_i, [9, 10, 2, 4, 3])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_r, [3, 4, 2, 10, 9])

        routes = t.get_tangencial_routes(mode_obj=bus, jump=2, short=True, express=False)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 4, 6])
        self.assertEqual(routes[0].nodes_sequence_r, [6, 4, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 4, 6])
        self.assertEqual(routes[0].stops_sequence_r, [6, 4, 2])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_i, [10, 2, 4])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_r, [4, 2, 10])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_i, [10, 2, 4])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_r, [4, 2, 10])

        routes = t.get_tangencial_routes(mode_obj=bus, jump=2, short=False, express=True)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [1, 2, 4, 6, 5])
        self.assertEqual(routes[0].nodes_sequence_r, [5, 6, 4, 2, 1])
        self.assertEqual(routes[0].stops_sequence_i, [1, 5])
        self.assertEqual(routes[0].stops_sequence_r, [5, 1])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_i, [9, 10, 2, 4, 3])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_r, [3, 4, 2, 10, 9])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_i, [9, 3])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_r, [3, 9])

        routes = t.get_tangencial_routes(mode_obj=bus, jump=2, short=True, express=True)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 4, 6])
        self.assertEqual(routes[0].nodes_sequence_r, [6, 4, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 6])
        self.assertEqual(routes[0].stops_sequence_r, [6, 2])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_i, [10, 2, 4])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_r, [4, 2, 10])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_i, [10, 4])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_r, [4, 10])

        routes = t.get_tangencial_routes(mode_obj=bus, jump=1, short=True, express=True)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 4])
        self.assertEqual(routes[0].nodes_sequence_r, [4, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 4])
        self.assertEqual(routes[0].stops_sequence_r, [4, 2])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_i, [10, 2])
        self.assertEqual(routes[len(routes) - 1].nodes_sequence_r, [2, 10])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_i, [10, 2])
        self.assertEqual(routes[len(routes) - 1].stops_sequence_r, [2, 10])

        with self.assertRaises(exceptions.JumpIsNotValidException):
            t.get_tangencial_routes(mode_obj=bus, jump=6, short=True, express=True)

        with self.assertRaises(exceptions.ModeIsNotValidException):
            t.get_tangencial_routes(mode_obj="bus", jump=6, short=True, express=True)
예제 #14
0
    def test_get_radial_routes(self):
        """
        to test add radial routes
        :return:
        """
        g = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        metro_obj = mode_manager.get_mode("metro")
        network = TransportNetwork(g)

        routes = network.get_radial_routes(mode_obj=bus_obj, short=False, express=False)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [1, 2, 0])
        self.assertEqual(routes[0].nodes_sequence_r, [0, 2, 1])
        self.assertEqual(routes[0].stops_sequence_i, [1, 2, 0])
        self.assertEqual(routes[0].stops_sequence_r, [0, 2, 1])
        self.assertEqual(routes[1].nodes_sequence_i, [3, 4, 0])
        self.assertEqual(routes[1].nodes_sequence_r, [0, 4, 3])
        self.assertEqual(routes[1].stops_sequence_i, [3, 4, 0])
        self.assertEqual(routes[1].stops_sequence_r, [0, 4, 3])

        routes = network.get_radial_routes(mode_obj=bus_obj, short=True, express=False)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 0])
        self.assertEqual(routes[0].nodes_sequence_r, [0, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 0])
        self.assertEqual(routes[0].stops_sequence_r, [0, 2])
        self.assertEqual(routes[1].nodes_sequence_i, [4, 0])
        self.assertEqual(routes[1].nodes_sequence_r, [0, 4])
        self.assertEqual(routes[1].stops_sequence_i, [4, 0])
        self.assertEqual(routes[1].stops_sequence_r, [0, 4])

        routes = network.get_radial_routes(mode_obj=bus_obj, short=False, express=True)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [1, 2, 0])
        self.assertEqual(routes[0].nodes_sequence_r, [0, 2, 1])
        self.assertEqual(routes[0].stops_sequence_i, [1, 0])
        self.assertEqual(routes[0].stops_sequence_r, [0, 1])
        self.assertEqual(routes[1].nodes_sequence_i, [3, 4, 0])
        self.assertEqual(routes[1].nodes_sequence_r, [0, 4, 3])
        self.assertEqual(routes[1].stops_sequence_i, [3, 0])
        self.assertEqual(routes[1].stops_sequence_r, [0, 3])

        routes = network.get_radial_routes(mode_obj=metro_obj, short=True, express=True)

        self.assertEqual(len(routes), 5)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 0])
        self.assertEqual(routes[0].nodes_sequence_r, [0, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 0])
        self.assertEqual(routes[0].stops_sequence_r, [0, 2])
        self.assertEqual(routes[1].nodes_sequence_i, [4, 0])
        self.assertEqual(routes[1].nodes_sequence_r, [0, 4])
        self.assertEqual(routes[1].stops_sequence_i, [4, 0])
        self.assertEqual(routes[1].stops_sequence_r, [0, 4])

        with self.assertRaises(exceptions.ModeIsNotValidException):
            network.get_radial_routes("bus_obj")
예제 #15
0
    def test_get_circular_routes(self):
        """
        to test add circular routes
        :return:
        """
        g = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
        mode_manager = TransportModeManager()
        bus_obj = mode_manager.get_mode("bus")
        network = TransportNetwork(g)

        routes = network.get_circular_routes(bus_obj)

        self.assertEqual(len(routes), 2)
        self.assertEqual(routes[0].nodes_sequence_i, [2, 4, 6, 8, 10, 2])
        self.assertEqual(routes[0].stops_sequence_i, [2, 4, 6, 8, 10, 2])
        self.assertEqual(routes[0].nodes_sequence_r, [])
        self.assertEqual(routes[0].stops_sequence_r, [])

        self.assertEqual(routes[1].nodes_sequence_i, [])
        self.assertEqual(routes[1].stops_sequence_i, [])
        self.assertEqual(routes[1].nodes_sequence_r, [10, 8, 6, 4, 2, 10])
        self.assertEqual(routes[1].stops_sequence_r, [10, 8, 6, 4, 2, 10])

        with self.assertRaises(exceptions.ModeIsNotValidException):
            g = graph.Graph.build_from_parameters(5, 1000, 0.5, 2)
            network = TransportNetwork(g)
            network.get_circular_routes("bus_obj")

        with self.assertRaises(exceptions.CircularRouteIsNotValidException):
            g = graph.Graph.build_from_parameters(1, 1000, 0.5, 2)
            mode_manager = TransportModeManager()
            bus_obj = mode_manager.get_mode("bus")
            network = TransportNetwork(g)
            network.get_circular_routes(bus_obj)
예제 #16
0
파일: main.py 프로젝트: SIDERMIT/optimizer
# print(tiempo_viaje)
# print(tiempo_ciclo)
# print(CO_obj.get_operators_cost(network_obj.get_routes(), tiempo_ciclo, f, k))

from sidermit.city import Graph, Demand
from sidermit.optimization.optimizer import Optimizer
from sidermit.publictransportsystem import TransportMode, TransportNetwork, Passenger

n, l, g, p = 4, 10, 0.85, 2
graph_obj = Graph.build_from_parameters(n, l, g, p)
graph_obj.graph_to_pajek_file("graph.pajek")
graph_obj = Graph.build_from_file("graph.pajek")
print(graph_obj.get_parameters())

demand_obj = Demand.build_from_parameters(graph_obj, 300000, 0.78, 0.25, 0.22)
network_obj = TransportNetwork(graph_obj)

va = 4
pv = 2.74
pw = 2 * 2.74
pa = 3 * 2.74
pt = 16
spv = 2.74
spw = 2 * 2.74
spa = 3 * 2.74
spt = 16

passenger_obj = Passenger(va=va,
                          pv=pv,
                          pw=pw,
                          pa=pa,
예제 #17
0
    def test_fmax_constrains(self):

        graph_obj = Graph.build_from_parameters(2, 10, 1, 2)

        network_obj = TransportNetwork(graph_obj)
        [bus_obj, metro_obj] = TransportMode.get_default_modes()
        radial_bus = network_obj.get_radial_routes(bus_obj)
        feeder_bus = network_obj.get_feeder_routes(bus_obj)
        radial_metro = network_obj.get_radial_routes(metro_obj, short=True)

        for route in radial_bus:
            network_obj.add_route(route)

        for route in feeder_bus:
            network_obj.add_route(route)

        for route in radial_metro:
            network_obj.add_route(route)

        f = defaultdict(float)
        for route in network_obj.get_routes():
            f[route.id] = 28

        ineq_f = Constrains.fmax_constrains(graph_obj,
                                            network_obj.get_routes(),
                                            network_obj.get_modes(), f)

        self.assertEqual(ineq_f, [
            -136.0, -40.0, -136.0, -40.0, -143.0, -12.0, -143.0, -12.0, -150.0,
            -40.0, -150.0, -40.0, -136.0, -40.0, -136.0, -40.0, -143.0, -12.0,
            -143.0, -12.0
        ])
예제 #18
0
    def test_most_loaded_section_constrains(self):

        graph_obj = Graph.build_from_parameters(2, 10, 1, 2)

        network_obj = TransportNetwork(graph_obj)
        [bus_obj, metro_obj] = TransportMode.get_default_modes()
        radial_bus = network_obj.get_radial_routes(bus_obj)
        feeder_bus = network_obj.get_feeder_routes(bus_obj)
        radial_metro = network_obj.get_radial_routes(metro_obj, short=True)

        for route in radial_bus:
            network_obj.add_route(route)

        for route in feeder_bus:
            network_obj.add_route(route)

        for route in radial_metro:
            network_obj.add_route(route)

        most_loaded_section = defaultdict(float)

        for route in network_obj.get_routes():
            most_loaded_section[route.id] = 10

        ineq_k = Constrains.most_loaded_section_constrains(
            network_obj.get_routes(), most_loaded_section)

        self.assertEqual(len(ineq_k), 6)

        self.assertEqual(ineq_k, [-150, -150, -150, -150, -1430, -1430])
예제 #19
0
class test_graph(unittest.TestCase):

    def setUp(self) -> None:
        graph_obj = Graph.build_from_parameters(n=2, l=10, g=0.5, p=2)
        demand_obj = Demand.build_from_parameters(graph_obj=graph_obj, y=100, a=0.5, alpha=1 / 3, beta=1 / 3)
        passenger_obj = Passenger.get_default_passenger()
        [bus_obj, metro_obj] = TransportMode.get_default_modes()

        self.network_obj = TransportNetwork(graph_obj=graph_obj)

        feeder_routes_metro = self.network_obj.get_feeder_routes(mode_obj=metro_obj)
        radial_routes_bus = self.network_obj.get_radial_routes(mode_obj=bus_obj)

        for route in feeder_routes_metro:
            self.network_obj.add_route(route_obj=route)

        for route in radial_routes_bus:
            self.network_obj.add_route(route_obj=route)

        self.extended_graph_obj = ExtendedGraph(graph_obj=graph_obj, routes=self.network_obj.get_routes(),
                                                TP=passenger_obj.pt, frequency_routes=None)
        hyperpath_obj = Hyperpath(extended_graph_obj=self.extended_graph_obj, passenger_obj=passenger_obj)

        self.hyperpaths, self.labels, self.successors, self.frequency, self.Vij = hyperpath_obj.get_all_hyperpaths(
            OD_matrix=demand_obj.get_matrix())

        self.OD_assignment = Assignment.get_assignment(hyperpaths=self.hyperpaths, labels=self.labels, p=2,
                                                       vp=passenger_obj.va, spa=passenger_obj.spa,
                                                       spv=passenger_obj.spv)

    def test_assignment(self):
        """
        test assignment method of class Assignment
        :return:
        """

        nodes = self.extended_graph_obj.get_extended_graph_nodes()

        P1 = None
        SC1 = None
        CBD = None

        stop_bus_p1 = None
        stop_metro_p1 = None

        for city_node in nodes:
            if city_node.graph_node.name == "P_1":
                P1 = city_node
            if city_node.graph_node.name == "SC_1":
                SC1 = city_node
            if city_node.graph_node.name == "CBD":
                CBD = city_node

            for stop_node in nodes[city_node]:
                if stop_node.mode.name == "bus":
                    if city_node.graph_node.name == "P_1":
                        stop_bus_p1 = stop_node

                if stop_node.mode.name == "metro":
                    if city_node.graph_node.name == "P_1":
                        stop_metro_p1 = stop_node

        self.assertEqual(round(self.OD_assignment[P1][CBD][stop_bus_p1], 2), 100)
        self.assertEqual(round(self.OD_assignment[P1][SC1][stop_bus_p1], 2), 84.88)
        self.assertEqual(round(self.OD_assignment[P1][SC1][stop_metro_p1], 2), 15.12)

    def test_get_alighting_and_boarding(self):
        """
        to test get_alighting_and_boarding of class get_alighting_and_boarding
        :return:
        """

        f = defaultdict(float)
        for route in self.network_obj.get_routes():
            f[route.id] = 28

        z, v, loaded_section_route = Assignment.get_alighting_and_boarding(Vij=self.Vij, hyperpaths=self.hyperpaths,
                                                                           successors=self.successors,
                                                                           assignment=self.OD_assignment, f=f)

        nodes = self.extended_graph_obj.get_extended_graph_nodes()

        stop_bus_p1 = None
        stop_bus_sc1 = None
        stop_bus_cbd = None

        stop_metro_p1 = None
        stop_metro_sc1 = None

        for city_node in nodes:
            for stop_node in nodes[city_node]:
                if stop_node.mode.name == "bus":
                    if city_node.graph_node.name == "P_1":
                        stop_bus_p1 = stop_node
                    if city_node.graph_node.name == "SC_1":
                        stop_bus_sc1 = stop_node
                    if city_node.graph_node.name == "CBD":
                        stop_bus_cbd = stop_node
                if stop_node.mode.name == "metro":
                    if city_node.graph_node.name == "P_1":
                        stop_metro_p1 = stop_node
                    if city_node.graph_node.name == "SC_1":
                        stop_metro_sc1 = stop_node

        self.assertEqual(round(z["R_bus_1"]["I"][stop_bus_p1], 2), 0.85)
        self.assertEqual(round(z["R_bus_1"]["I"][stop_bus_sc1], 2), 0.89)
        self.assertEqual(round(z["R_bus_1"]["R"][stop_bus_cbd], 2), 0.74)
        self.assertEqual(round(v["R_bus_1"]["I"][stop_bus_cbd], 2), 1.49)
        self.assertEqual(round(v["R_bus_1"]["I"][stop_bus_sc1], 2), 0.25)
        self.assertEqual(round(v["R_bus_1"]["R"][stop_bus_sc1], 2), 0.74)
        self.assertEqual(round(z["F_metro_1"]["I"][stop_metro_p1], 2), 0.04)
        self.assertEqual(round(v["F_metro_1"]["I"][stop_metro_sc1], 2), 0.04)
        self.assertEqual(round(z["F_metro_1"]["R"][stop_metro_sc1], 2), 0)

    def test_most_loaded_section(self):
        """
        to test most_loaded_section class assignment
        :return:
        """

        f = defaultdict(float)
        for route in self.network_obj.get_routes():
            f[route.id] = 28

        z, v, loaded_section_route = Assignment.get_alighting_and_boarding(Vij=self.Vij, hyperpaths=self.hyperpaths,
                                                                           successors=self.successors,
                                                                           assignment=self.OD_assignment, f=f)

        loaded_section = Assignment.most_loaded_section(loaded_section_route)

        self.assertEqual(len(loaded_section), 4)
        self.assertEqual(loaded_section['F_metro_1'], loaded_section['F_metro_2'])
        self.assertEqual(loaded_section['F_metro_1'], 0.044997165532879815)
        self.assertEqual(loaded_section['R_bus_1'], loaded_section['R_bus_2'])
        self.assertEqual(loaded_section['R_bus_1'], 1.4880952380952384)
예제 #20
0
파일: views.py 프로젝트: SIDERMIT/backend
    def create_default_routes(self, request):
        """ create defaults routes """
        default_routes = request.data.get('default_routes', [])
        scene_public_id = request.data.get('scene_public_id')

        scene_obj = Scene.objects.select_related('city').get(
            public_id=scene_public_id)

        graph_obj = scene_obj.city.get_sidermit_graph()
        network_obj = SidermitTransportNetwork(graph_obj)

        transport_mode_dict = dict()

        try:
            route_tuple = []
            all_routes = []
            for default_route in default_routes:
                transport_mode_public_id = default_route['transportMode']
                if transport_mode_public_id not in transport_mode_dict:
                    transport_mode_obj = TransportMode.objects.get(
                        public_id=transport_mode_public_id)
                    transport_mode_dict[
                        transport_mode_public_id] = transport_mode_obj.get_sidermit_transport_mode(
                        )

                if default_route['type'] == 'Feeder':
                    route_tuple.append((network_obj.get_feeder_routes(
                        transport_mode_dict[transport_mode_public_id]),
                                        transport_mode_public_id))
                elif default_route['type'] == 'Circular':
                    route_tuple.append((network_obj.get_circular_routes(
                        transport_mode_dict[transport_mode_public_id]),
                                        transport_mode_public_id))
                elif default_route['type'] == 'Radial':
                    route_tuple.append((network_obj.get_radial_routes(
                        transport_mode_dict[transport_mode_public_id],
                        short=default_route['extension'],
                        express=default_route['odExclusive']),
                                        transport_mode_public_id))
                elif default_route['type'] == 'Diametral':
                    route_tuple.append((network_obj.get_diametral_routes(
                        transport_mode_dict[transport_mode_public_id],
                        jump=default_route['zoneJumps'],
                        short=default_route['extension'],
                        express=default_route['odExclusive']),
                                        transport_mode_public_id))
                elif default_route['type'] == 'Tangential':
                    route_tuple.append((network_obj.get_tangencial_routes(
                        transport_mode_dict[transport_mode_public_id],
                        jump=default_route['zoneJumps'],
                        short=default_route['extension'],
                        express=default_route['odExclusive']),
                                        transport_mode_public_id))
                else:
                    raise ParseError('type "{0}" is not valid.'.format(
                        default_route['type']))

            for (routes, transport_mode_public_id) in route_tuple:
                for route in routes:
                    all_routes.append(
                        dict(name=route.id,
                             transport_mode_public_id=transport_mode_public_id,
                             nodes_sequence_i=','.join(
                                 str(x) for x in route.nodes_sequence_i),
                             nodes_sequence_r=','.join(
                                 str(x) for x in route.nodes_sequence_r),
                             stops_sequence_i=','.join(
                                 str(x) for x in route.stops_sequence_i),
                             stops_sequence_r=','.join(
                                 str(x) for x in route.stops_sequence_r),
                             type=3 if route._type.value == 3 else 1))
        except SIDERMITException as e:
            raise ParseError(e)
        except TransportMode.DoesNotExist:
            raise ParseError('Transport mode does not exist')

        return Response(all_routes, status.HTTP_200_OK)