我想对交通灯控制进行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
方案,但是我喜欢使用多代理环境)。
谢谢!
答案 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_space
,observation_space
和compute_reward
)。如果这样做,您将拥有一个完整的多代理环境。