def get_state(self): """See class definition.""" self.leader = [] self.follower = [] # Initialize a set on empty observations obs = { "lane_{}".format(i): [0 for _ in range(5 * self.num_rl)] for i in range(self._num_lanes) } for lane in range(self._num_lanes): # Collect the names of the RL vehicles on the lane. rl_ids = self.rl_ids()[lane] for i, veh_id in enumerate(rl_ids): # Add relative observation of each vehicle. obs["lane_{}".format(lane)][5 * i: 5 * (i + 1)], \ leader, follower = get_relative_obs(self, veh_id) # Append to the leader/follower lists. if leader not in ["", None]: self.leader.append(leader) if follower not in ["", None]: self.follower.append(follower) return obs
def _update_obs_history(self): """Update the storage of observations for individual vehicles. This method performs the following operation: 1. It adds the most recent observation for each vehicle to the _obs_history attribute. It also maintains the number of viewed frames, and removes vehicles once they've left the network. 2. It stored the names of the observed leading vehicles under the leader attribute. """ self.leader = [] for veh_id in self.k.vehicle.get_rl_ids(): # Add relative observation of each vehicle. obs_vehicle, leader = get_relative_obs(self, veh_id) self._obs_history[veh_id].append(obs_vehicle) # Maintain queue length. if len(self._obs_history[veh_id]) > self._skip * self._obs_frames: self._obs_history[veh_id] = \ self._obs_history[veh_id][-self._skip * self._obs_frames:] # Append to the leader list. if veh_id in self.rl_ids(): if leader not in ["", None]: self.leader.append(leader) # Remove memory for exited vehicles. for key in list(self._obs_history.keys()): if key not in self.k.vehicle.get_rl_ids(): del self._obs_history[key]
def full_observation_fn(env): """Compute the full state observation. This observation consists of the speeds and bumper-to-bumper headways of all automated vehicles in the network. """ # Initialize a set on empty observations obs = [0 for _ in range(env.observation_space.shape[0])] # Add relative observation of each vehicle. for i, v_id in enumerate(env.rl_ids()): obs[5 * i:5 * (i + 1)], *_ = get_relative_obs(env, v_id) return np.asarray(obs)
def get_state(self): """See class definition.""" self.leader = [] self.follower = [] for veh_id in self.k.vehicle.get_rl_ids(): # Add relative observation of each vehicle. obs_vehicle, leader, follower = get_relative_obs(self, veh_id) self._obs_history[veh_id].append(obs_vehicle) # Maintain queue length. if len(self._obs_history[veh_id]) > self._obs_frames: self._obs_history[veh_id] = \ self._obs_history[veh_id][self._obs_frames:] # Append to the leader/follower lists. if veh_id in self.rl_ids(): if leader not in ["", None]: self.leader.append(leader) if follower not in ["", None]: self.follower.append(follower) # Remove memory for exited vehicles. for key in self._obs_history.keys(): if key not in self.k.vehicle.get_rl_ids(): del self._obs_history[key] # Initialize a set on empty observations obs = { "lane_{}".format(i): np.array([0 for _ in range(5 * self._obs_frames * self.num_rl)]) for i in range(self._num_lanes) } for lane in range(self._num_lanes): # Collect the names of the RL vehicles on the lane. rl_ids = self.rl_ids()[lane] for i, veh_id in enumerate(rl_ids): # Concatenate the past n samples for a given time delta in the # output observations. ob_t = np.concatenate(self._obs_history[veh_id][::-1]) obs["lane_{}".format(lane)][5 * self._obs_frames * i:5 * self._obs_frames * i + len(ob_t)] = ob_t return obs
def get_state(self): """See class definition.""" self.leader = [] self.follower = [] # Initialize a set on empty observations obs = {key: None for key in self.rl_ids()} for i, veh_id in enumerate(self.rl_ids()): # Add relative observation of each vehicle. obs[veh_id], leader, follower = get_relative_obs(self, veh_id) # Append to the leader/follower lists. if leader not in ["", None]: self.leader.append(leader) if follower not in ["", None]: self.follower.append(follower) return obs
def get_state(self): """See class definition.""" self.leader = [] self.follower = [] # Initialize a set on empty observations obs = [0 for _ in range(self.observation_space.shape[0])] for i, v_id in enumerate(self.rl_ids()): # Add relative observation of each vehicle. obs[5*i: 5*(i+1)], leader, follower = get_relative_obs(self, v_id) # Append to the leader/follower lists. if leader not in ["", None]: self.leader.append(leader) if follower not in ["", None]: self.follower.append(follower) return obs
def get_state(self): """See class definition.""" self.leader = [] self.follower = [] for veh_id in self.k.vehicle.get_rl_ids(): # Add relative observation of each vehicle. obs_vehicle, leader, follower = get_relative_obs(self, veh_id) self._obs_history[veh_id].append(obs_vehicle) # Maintain queue length. if len(self._obs_history[veh_id]) > self._obs_frames: self._obs_history[veh_id] = \ self._obs_history[veh_id][self._obs_frames:] # Append to the leader/follower lists. if veh_id in self.rl_ids(): if leader not in ["", None]: self.leader.append(leader) if follower not in ["", None]: self.follower.append(follower) # Remove memory for exited vehicles. for key in self._obs_history.keys(): if key not in self.k.vehicle.get_rl_ids(): del self._obs_history[key] # Initialize a set on empty observations obs = {key: None for key in self.rl_ids()} for i, veh_id in enumerate(self.rl_ids()): # Concatenate the past n samples for a given time delta and return # as the final observation. obs_t = np.concatenate(self._obs_history[veh_id][::-1]) obs_vehicle = np.array([0. for _ in range(5 * self._obs_frames)]) obs_vehicle[:len(obs_t)] = obs_t obs[veh_id] = obs_vehicle return obs