如何编写基于agent-id的基于多agent的Get_state()返回?

时间:2019-07-02 21:05:43

标签: flow-project

我想对交通灯控制进行3x3网格(grid0)的多代理实现 在get_state函数中,我希望在此函数中发送给RL代理的信息有所不同。因此,代理商1仅获得在朝向交叉路口1的边上行驶的车辆的信息。

据我了解,每个代理均会调用get_state函数。

如何区分代理商?可以这样做吗?

agent_id = get_agent_id()
    if agent_id =0
        #return 'all info of vehicles on edges heading to traffic light1
    if agent_id =1
        ...

get_state函数中,是否有任何类似方法或功能(座席列表之类)?

第二,agent_id与交通信号灯ID(intersection_id)相同吗? (以及如何为每个交叉路口分配不同的代理?现在我仅使用默认的grid0方案,但是我喜欢使用多代理环境)。

谢谢!

1 个答案:

答案 0 :(得分:1)

1-在流程中,为了处理多主体情况,在某些方法中(例如,在get_state()中),我们返回了一个字典,该字典不是将单个主体的状态信息作为np.array返回。状态(以agent_id作为键,agent_state作为字典的值)。

因此您可以执行以下操作:

    def get_state(self):

        agent_state_dict = {}
        i = 0
        for intersection, edges in self.scenario.get_node_mapping():
            i = i + 1
            agent_id = self.agent_name_prefix + str(i) # self.agent_name_prefix is defined as string "intersection"

            speeds = []
            dist_to_intersec = []
            traffic_light_states = []

            ..... code .....

            # construct the state (observation) for each agent
            observation = np.array(
                np.concatenate([
                    speeds, dist_to_intersec, traffic_light_states  

            # each intersection is an agent, so we will make a dictionary that maps form "self.agent_name_prefix+'i'" to the state of that agent.
            agent_state_dict.update({agent_id: observation})

        return agent_state_dict

agent_state_dict是从agent_id映射到“观察”(即状态)的字典

2-现在要回答第二个问题,将相交定义为主体(这样您将拥有多主体场景),您所需要做的就是定义相应的RLlib函数(get_state,{{1 }},action_spaceobservation_spacecompute_reward)。如果这样做,您将拥有一个完整的多代理环境。