Эта тема представляет собой перевод первых двух частей руководства о том, как написать собственного бота для конкурса Google AI Challenge. Весь код написан на Python.
Шаг 1: Как избежать столкновений
План
Чтобы муравьи не столкнулись, нужно: 1) Не допускать перемещения одного муравья к другому; 2) Не дать двум муравьям переместиться в одну точку; 3) отслеживать информацию о местонахождении всех наших муравьев.
Выполнение
Для отслеживания информации о том, где находятся муравьи, мы будем использовать словарь (он же HashMap, ассоциативный массив, объект JavaScript).Каждый ключ массива будет позицией, а значением будет муравей, который перемещается в эту точку.
Местоположением будет кортеж (список, массив) из двух значений — строк и столбцов на карте.
Затем мы можем проверить список перед перемещением, чтобы два муравья не переместились в одно и то же место.
Каждый раз, когда мы перемещаем муравья, нам приходится обновлять список.
Эта проверка пригодится позже в этом уроке, поэтому мы создадим функцию, которая проверит, возможен ли данный шаг.
Он возвращает логическое значение (истина или ложь).
Код
Давайте вырежем комментарии из кода примера и вставим новый код: новый код:(Примечание.def do_turn(self, ants): # track all moves, prevent collisions orders = {} def do_move_direction(loc, direction): new_loc = ants.destination(loc, direction) if (ants.unoccupied(new_loc) and new_loc not in orders): ants.issue_order((loc, direction)) orders[new_loc] = loc return True else: return False # default move for ant_loc in ants.my_ants(): directions = ('n','e','s','w') for direction in directions: if do_move_direction(ant_loc, direction): break
Убедитесь, что отступы правильные.
В Python отступы определяют блоки кода и области действия, поэтому отступы должны быть правильными) Функция Do_move_direction принимает позицию муравья (кортеж (строка, столбец)) и направление («N», «e», «S» или «W») и пытается выполнить перемещение.
Эта функция находится внутри метода класса (который также является функцией), и это нормально в Python. (Если вы пишете на другом языке, возможно, вам придется поместить функцию в другое место.
) Мы используем некоторые предопределенные функции из стартового бота: ants.destination принимает местоположение и направление и возвращает нам пункт назначения.
Эта функция обрабатывает перемещение муравья за край карты, нам не нужно об этом думать.
ants.unoccupied берет местоположение и определяет, можно ли туда переместить муравья.
Это лучше, чем ants.passable, который не позволит нам перейти на еду или других муравьев.
Ассоциативный массив ордеров используется для отслеживания текущих движений.
Проверка того, занят ли new_loc и нет ли его в массиве заказов, поможет предотвратить коллизии.
Результат
Давайте еще раз запустим бота и посмотрим: C:\aichallenge>tutorial.cmd
running for 60 turns
ant_count c_turns climb? cutoff food r_turn ranking_bots s_alive s_hills score w_turn winning
turn 0 stats: [1,1,0] 0 [1,1] - 18 0 None [1,1] [1,1] [1,1] 0 None
turn 1 stats: [1,1,0] 0 [1,1] - 16 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
turn 2 stats: [2,1,0] 0 [1,1] - 16 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
.
turn 60 stats: [1,5,0] 0 [1,1] - 12 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
score 1 1
status survived survived
playerturns 60 60
Повторить: http://aichallenge.org/ants_tutorial_step_1.php Лучше, но все равно не очень хорошо.
Один одинокий муравей вышел и сразился с HunterBot. Это не самоубийство, а улучшение.
Мы также создали вспомогательную функцию, которая пригодится позже.
Шаг 2: Сбор еды
План
Для победы нам нужно больше двух муравьев, и рядом с начальной позицией муравья есть еда! Давайте попробуем собрать его.Мы должны переместить муравья к еде, чтобы собрать ее.
Мы также хотим сделать это эффективно.
Вы заметили, что в прошлой игре HunterBot отправил половину всех своих муравьев на еду? Кажется, это может быть неэффективно.
Мы собираемся реализовать нечто похожее на очередь с приоритетами.
Мы составим список всех наших муравьев, а затем посмотрим, насколько далеко он находится от каждого продукта питания.
Затем мы отсортируем список и отправим каждого муравья к ближайшей пище, но только по одному муравью к каждой пище.
Другие муравьи будут свободны и займутся другими важными делами.
Также мы избавимся от глупых дефолтных движений, которые остались от стартового бота.
Выполнение
Чтобы отслеживать информацию о пище, которую уже ищут муравьи, нам нужен еще один массив.Он сохранит местоположение целевой еды в качестве ключа, а местоположение муравьев, преследующих ее, — в качестве значения.
Мы можем проверить целевой ключ, чтобы убедиться, что мы не посылаем двух муравьев на одну и ту же еду.
Мы создадим еще одну вспомогательную функцию для выполнения немного другого типа движения.
Вместо местоположения и направления муравья мы создадим местоположение муравья и целевое местоположение, а функция определит направление.
Код
Создайте следующие функции после функции do_move_direction: targets = {}
def do_move_location(loc, dest):
directions = ants.direction(loc, dest)
for direction in directions:
if do_move_direction(loc, direction):
targets[dest] = loc
return True
break
else:
return False
Массив целей отслеживает муравьев и их цель — еду.
В помощь нам используем еще одну стандартную функцию бота: ants.direction принимает текущее местоположение и цель и возвращает список ближайших направлений «по прямой».
Если цель находится вверху слева, она вернет ['N', 'W'], и затем мы должны попытаться переместить нашего муравья в одном из этих двух направлений.
Если цель находится непосредственно ниже, то она вернет ['S'] — список из одного элемента.
Давайте заменим функцию перемещения на это: # find close food
ant_dist = []
for food_loc in ants.food():
for ant_loc in ants.my_ants():
dist = ants.distance(ant_loc, food_loc)
ant_dist.append((dist, ant_loc, food_loc))
ant_dist.sort()
for dist, ant_loc, food_loc in ant_dist:
if food_loc not in targets and ant_loc not in targets.values():
do_move_location(ant_loc, food_loc)
Здесь у нас есть список — ant_dist — который будет хранить для каждого муравья комбинацию еды и расстояния в виде кортежа (distance, ant_loc, food_loc).
Список построен во вложенном цикле, чтобы дать нам каждую комбинацию.
Далее сортируем список.
Списки Python имеют несколько полезных функций сортировки.
Чтобы отсортировать кортеж, Python сравнит первые значения каждого кортежа, а затем, если они совпадают, перейдет ко второму значению и так далее.
Вот почему мы сохранили расстояние в качестве первого значения, чтобы кратчайшие расстояния были первыми в списке.
Далее в цикле по отсортированному списку проверяем, есть ли у нас свободные муравьи, способные собирать еду.
Food_loc not in target проверяет, есть ли за едой уже преследующий муравей.
Ant_loc not in target.values() проверяет, что муравью еще не была дана задача.
Если муравей найден, мы вызываем do_move_location.
Результат
Давайте еще раз запустим бота и посмотрим: C:\aichallenge>tutorial.cmd
running for 60 turns
ant_count c_turns climb? cutoff food r_turn ranking_bots s_alive s_hills score w_turn winning
turn 0 stats: [1,1,0] 0 [1,1] - 18 0 None [1,1] [1,1] [1,1] 0 None
turn 1 stats: [1,1,0] 0 [1,1] - 16 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
turn 2 stats: [1,1,0] 0 [1,1] - 16 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
.
turn 60 stats: [4,6,0] 0 [1,1] - 6 1 [0,0] [1,1] [1,1] [1,1] 1 [0,1]
score 1 1
status survived survived
playerturns 60 60
Повторить: http://aichallenge.org/ants_tutorial_step_2.php Вся еда, которую мы видели, была захвачена.
Если внимательно посмотреть повтор, то можно увидеть, что у нас в муравейнике еще есть 3 муравья, которые не могут появиться.
Лучше позаботиться об этом в будущем.
Если муравьи не смогут выбраться наружу, они не смогут помочь нам победить.
Оригинал:
P.S. пока эта статья находилась в песочнице, вебкумо опубликовал аналогичный статья .Его статья содержит «Учебное пособие по муравьям» и «Шаг 1: предотвращение столкновений», эта статья содержит «Шаг 1: предотвращение столкновений» и «Шаг 2: сбор еды».
Теги: #google ai Challenge #python #искусственный интеллект #соревнования #муравьи #спортивное программирование
-
Как Скопировать Текст Из Pdf В Word
19 Oct, 24 -
10 Главных Проблем На Пути Внедрения Devops
19 Oct, 24 -
Новые Слухи О Zune 2.0
19 Oct, 24 -
Очень Странный Тренинг
19 Oct, 24 -
Подкаст «Хочу В Геймдев» №10
19 Oct, 24 -
It-Компаниям Снизили Налоги
19 Oct, 24