我打算在get_state函数中创建一个用于交通灯控制的3x3网格(grid0)的多代理实现,我希望在此函数中发送给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场景,但我喜欢使用多agent环境)。
提前感谢!
发布于 2019-07-03 06:15:06
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_id映射到“agent_state_dict”(即状态)的字典。
2-现在回答您的第二个问题,将交叉点定义为代理(因此您将有多代理场景),您所需做的就是为交叉点定义相应的RLlib函数(get_state、action_space、observation_space、compute_reward和_apply_rl_actions)。如果这样做,您将拥有一个完整的多智能体环境。
https://stackoverflow.com/questions/56860049
复制相似问题