(Школьники и студенты СПО) Управление интеллектуальным агентом в динамической среде

Цель трека

Разработать программу, которая бы выполняла задачи компьютерного зрения автономного транспортного средства. В задачи решения войдет распознавание типовых объектов дорожного движения на основании RGB-снимков камеры автономного робота - колесной платформы DuckieBot или квадрокоптера с автопилотом.

Задание

Вам необходимо разработать программу на языке Python3, которая будет управлять движеним виртуального агента в двумерной среде, разделенной на клетки. Состояние среды и агента обновляется дискретно (по шагам). Агенту будет необходимо:

В зависимости от этапа олимпиады в задаче будут использованы следующие усложнения:

 


Исходные данные.

Робот Геннадий застрял в лабиринте, который представляет из себя сетку блоков N*N.

Блоки могут быть проходимыми и непроходимыми (стенами), а также содержать бонусы. В различных задачах вам нужно будет помочь роботу Геннадию справиться со стоящей перед ним задачей. Такой задачей может стать, например, поиск самого короткого выхода из лабиринта, а в некоторых задачах карта может меняться во время движения робота. 

 

Вы можете получить следующую информацию о карте:

Проверка решений.

В задачах со статической картой вам нужно будет построить план движения, чтобы помочь Геннадию достигнуть цель (последовательно описать клетки, которые необходимо посетить роботу).

Пример такого решения:

 

Если ваше решение окажется правильным, но не самым быстрым (Геннадий зря посетит какие-то клетки), мы покажем вам карту препятствий, чтобы вы смогли усовершенствовать свою программу, пример такой карты:

 === Карта стен ===

 1 1 1 1 1 1 1 1 1 1
 1 1 0 0 0 0 1 0 1 1
 1 0 0 1 0 0 0 1 1 1
 1 1 0 1 1 0 1 1 1 1
 1 1 1 0 0 1 0 1 1 1
 1 1 0 0 1 0 1 0 0 1
 1 0 1 0 1 0 1 1 0 1
 1 0 0 1 0 1 0 0 0 1
 1 0 0 1 1 1 0 1 0 1
 1 1 1 1 1 1 1 1 1 1

В задачах с динамической картой вам нужно будет построить план движения для каждого шага робота Геннадия.

 

Критерии оценивания решений

Для каждой задачи определено максимальное время работы решения (В шагах среды моделирования). Это значение задает максимальную длительность вашего движения или бездействия. Если ваша программа его привысили, то общая оценка за решение аннулируется.

Если критерий выше выполнен, то далее общая оценка решения является среднимарифметическим критериев:

  1. Длина пройденного пути (чем длинее ваш путь - тем ниже оценка) 0-1 балл. 
  2. Количество достигнутых целей (в зависимости от задачи):
    1. Найден выход из лабиринта 0-1 балл.
    2. Доля собранных ключей (M) от общего числа (N) - M/N.

Правила перехода участников между этапами

  1. Переход к основному этапу - оценка решения >= 0.3 или лучшая половина решений согласно общему рейтингу (если доля набравших оценку выше порога будет меньше одной трети)
  2. Переход к финальному этапу - оценка решения >= 0.6 или или лучшая половина решений согласно общему рейтингу (если доля набравших оценку выше порога будет меньше одной трети)

Шаблон решения

 

def is_passable(x, y, env, grid_size):
   if not (0 <= x < grid_size and 0 <= y < grid_size):
       return False
   # Проверяем состояние клетки
   cell = env.get_cell(x, y)  # У среды есть метод get_cell
   if (cell is None):
       return True
   if cell.type == "wall":  # Если клетка занята стеной
       return False
   if cell.type == "obstacle":  # Если клетка занята другим препятствием
       return False
   return True


def solution(task_map, env):
   grid_size = task_map['grid_size']  # размер стороны карты (карта -- квадрта)
   goal = tuple(task_map['goal_pos'])  # позиция точки, которую нужно достичь
   current_pos = tuple(task_map['agent_start_pos'])  # стартовая позиция


   ...
   answer = []
   ...


   return answer