예제 #1
0
    def test_view(self):
        g = nx.Graph()
        g.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 4), (1, 5)])
        nx.set_node_attributes(g, {
            0: (0, 1),
            1: (0, 2),
            2: (0, 3),
            3: (0, 4),
            4: (0, 5),
            5: (1, 1)
        },
                               name="coords")
        orders = [(3, 2, 2, 3, 3)
                  ]  # <source, destination, time, length, price>
        drivers = np.array([1, 1, 1, 1, 1, 1])
        action = np.array([1, 0, 0], dtype=float)

        env = TaxiEnv(g, orders, 1, drivers, 10)
        env.seed(123)
        env.set_view([2, 3, 4])
        obs, _, _ = env.get_observation()

        # check observation space and content
        assert env.observation_space_shape == obs.shape
        view_size = 3
        assert env.observation_space_shape == (
            view_size * 4 + 10,
        )  # default income is not included, so its <driver, order, idle, time_id, node_id>
        assert env.action_space_shape == (
            3,
        )  # degree of 1 is 3, but of the rest is 2. So it should be 2 + 1 (staying action)
        assert env.current_node_id in [2, 3, 4]

        # an action [1, 0, 0] for the node 2 means to go to node 3, because its the only neighbor in the view
        env.step(action)
        assert env.current_node_id in [2, 3, 4]
        env.step(action)
        assert env.current_node_id in [2, 3, 4]
        obs, rew, done, info = env.step(action)
        assert (obs[:view_size] == np.array([0.5, 1, 0])).all(
        )  # there are 2 drivers in the node 3 at the end, one from node 2, one from node 4.
        assert (obs[view_size:2 * view_size] == np.array([0, 0, 0])).all()
        assert (obs[2 * view_size:3 * view_size] == np.array([0.5, 1,
                                                              0])).all()
        # next time iteration should happen
        assert env.time == 1
        assert env.current_node_id in [2, 3]
        assert (obs[2 * view_size:3 * view_size] == np.array([0.5, 1,
                                                              0])).all()
        assert (obs[3 * view_size:3 * view_size + 10] == np.array(
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0])).all()
        assert obs[3 * view_size + 10:].shape == (3, )
        assert (obs[3 * view_size + 10:] == np.array([
            1, 0, 0
        ])).all() or (obs[3 * view_size + 10:] == np.array([0, 1, 0])).all()
        assert [d.position for d in env.all_driver_list] == [0, 1, 3, 2, 3, 5]
예제 #2
0
    def test_sync(self):
        g = nx.Graph()
        g.add_edges_from([(0, 1), (1, 2), (2, 3)])
        nx.set_node_attributes(g, {
            0: (0, 1),
            1: (0, 2),
            2: (1, 1),
            3: (1, 2)
        },
                               name="coords")
        orders = [(0, 1, 0, 1, 1), (1, 1, 1, 2, 2), (2, 2, 1, 3, 3),
                  (3, 2, 2, 3, 3)]
        drivers = np.array([1, 0, 0, 5])
        action = np.array([0.3, 0.4, 0.3], dtype=float)

        env = TaxiEnv(g, orders, 1, drivers, 10)
        env.step(action)

        env2 = TaxiEnv(g, orders, 1, drivers, 10)
        env2.sync(env)

        o1, _, _ = env.get_observation()
        o2, _, _ = env2.get_observation()
        assert (o1 == o2).all()

        env.seed(1)
        env2.seed(1)

        while not env.done:
            obs, rew, done, info = env.step(action)
            obs2, rew2, done2, info2 = env2.step(action)

            assert (obs == obs2).all()
            assert rew == rew2
            assert done == done2
            assert info == info2