У меня есть три агента:
- Белый: исследует и транслирует задания по уборке
- Зеленый и оранжевый: ждут выполнения заданий, затем переходят к очистке своих плиток
Проблема начинается после выполнения заданий:
Зеленый и Оранжевый оказываются лицом друг к другу в одном и том же коридоре, и оба замирают навсегда.
Ни двигается, ни отступает — полный тупик.
Вот соответствующая часть метода рабочего решения():
Код: Выделить всё
def decide(self) -> Iterable[VWAction]:
# Broadcast EXACTLY ONCE to avoid spamming workers
if self.__sent_assignments and self.__broadcast_action:
action = self.__broadcast_action
self.__broadcast_action = None # Clear it so we don't send again
return [cast(VWAction, action)]
if self.__backoff > 0:
return [VWIdleAction()]
obs = self.get_latest_observation()
appearance = self.get_own_appearance()
collision_action = self.__handle_collision(obs)
if collision_action is not None:
return [collision_action]
pos = self.get_own_position()
if self.__heading_home:
if (pos.get_x(), pos.get_y()) == self.__home_target:
self.__heading_home = False
else:
return [self.__move_towards(target=self.__home_target)]
- Белый завершает картирование и транслирует задания (хорошо).
- Зеленый и Оранжевый начинают двигаться (хорошо).
- Они встречаются в коридоре лицом друг к другу.
- продолжает возвращать сообщение «заблокировано» для обоих.
Код: Выделить всё
__handle_collision() - Оба агента простаивают вечно → тупик.
Оба замирают, потому что их логика движения симметрична, и ни один не уступает дорогу.
Вопрос
Как можно Я изменяю свою логику движения/столкновения так, чтобы два рабочих, стоящих лицом друг к другу, не блокировались?
Существует ли общий шаблон для разрешения лобовых столкновений в VWAgent/многоагентных сеточных системах?
Я рад поделиться методом __handle_collision, если необходимо.
Подробнее здесь: https://stackoverflow.com/questions/798 ... each-other
Мобильная версия