docs: async def set_agent_neighbors(self):
          '''Set neighbors for each agent in each cardinal direction.
  
          This method assumes that the neighboring :class:`GridEnvironment` of
          this grid environment have already been set.
          '''
          for i in range(len(self.grid)):
              for j in range(len(self.grid[0])):
                  agent = self.grid[i][j]
                  xy = (self.origin[0] + i, self.origin[1] + j)
                  nxy = _get_neighbor_xy('N', xy)
                  exy = _get_neighbor_xy('E', xy)
                  sxy = _get_neighbor_xy('S', xy)
                  wxy = _get_neighbor_xy('W', xy)
                  if j == 0:
                      naddr = await self._get_xy_address_from_neighbor('N', nxy)
                  else:
                      naddr = self.get_xy(nxy, addr=True)
                  if i == 0:
                      waddr = await self._get_xy_address_from_neighbor('W', wxy)
                  else:
                      waddr = self.get_xy(wxy, addr=True)
                  if j == len(self.grid[0]) - 1:
                      saddr = await self._get_xy_address_from_neighbor('S', sxy)
                  else:
                      saddr = self.get_xy(sxy, addr=True)
                  if i == len(self.grid) - 1:
                      eaddr = await self._get_xy_address_from_neighbor('E', exy)
                  else:
                      eaddr = self.get_xy(exy, addr=True)
                  agent.neighbors['N'] = naddr
                  agent.neighbors['E'] = eaddr
                  agent.neighbors['S'] = saddr
                  agent.neighbors['W'] = waddr