Thumbnail for Боты учатся  драться. Sumоbox, часть 1. by foo52ru ТехноШаман

Боты учатся драться. Sumоbox, часть 1.

foo52ru ТехноШаман

24m 4s2,627 words~14 min read
Auto-Generated

[0:09]Сегодня будем делать симуляцию единоборств, что-то среднее между боксом и сумо. Нужно либо вытолкнуть противника за край ринга, либо послать его в нокаут. Конечный результат вы уже сейчас можете видеть на экране. Ролик будет больше посвящён техническим деталям проекта. Вначале я опишу физику модели. Весь проект будет в стиле минимализма. Затем разберём, как в этой модели устроен мозг боксёров. Мозг максимально простой и представляет из себя множество пар, стимул реакции. Боксёры должны сами научиться вести поединок. Сегодня будет использован самый очевидный способ, который мне пришёл в голову. Его я пишу в третьей части. Для обучения боксёрам придётся провести множество спарингов. По итогу мы получим восемь сильных боксёров, которые нам понадобятся для следующего ролика. А в следующем ролике для обучения уже будет использоваться генетический алгоритм. В конце подведём некоторые итоги. А пока приступаем к описанию боксёра.

[1:22]Это тело боксёра голова смещена вперёд. Боксёр может двигаться в одном из восьми направлений относительно своей центральной Также боксёр может поворачиваться.

[1:36]И перемещение и повороты идут с ускорениям, пока скорость не достигнет максимально разрешённого значения. После завершения перемещения или поворота боксёр в течение некоторого времени продолжен движение по инерции. Это базовые места для кулаков боксёра. Кулаки боксёры могут двигаться только по фиксированной прямой линии. Кулак также движется с ускорением. Достигнув финальной точки траектории, кулак становится неактивным и возвращается к базовому положению. В неактивном состоянии кулак ни с чем не реагирует и отображается полупрозрачным. Сила удара вычисляется потому, насколько кулак стал ближе к центру мишени за последний такт. То есть удар по касательной имеет меньшую силу.

[2:30]Кулаку требуется время для разгона. Для большего эффекта от удара кулак должен иметь большую скорость сближения с мишелью и быть направленным в центр мишени.

[2:48]Удар не только отталкивает противника, но и разворачивает его, если пришёлся не по центральной оси. В том числе и при попадании в активную руку, но в меньшей степени. Пока идёт удар, рука остаётся активной. Но на возврате рука становится неактивной, отображается полупрозрачной и не мешает удару противника. Если две руки в активном состоянии встретятся во время фазы удара, то удары прекращаются и боксёров немного разворачиваются. На голове боксёра можно увидеть две полоски. Они показывают состояние боксёра. Поговорим о них чуть подробнее. Сверху расположены два индикатора, которые показывают ясность сознания боксёра. Общее состояние и ясность сознания на данный момент. Нижние индикаторы показывают физическое состояние боксёра. Его общее состояние и уровень энергии. Ясность сознания определяет скорость мышления боксёра от уровня энергии зависит скорость движения боксёра. Если боксёр не двигает никто его не бьёт, то текущие уровни начинают быстро восстанавливаться, пока не достигнут общих. Дальше процесс восстановления замедляется, причём голова восстанавливается тяжелее. Теперь будем наносить удары по голове боксёра. После пропущенного удара, общие и текущие состояния сознания проседают. Причём текущие проседает в шесть раз сильнее. Насколько сильно это происходит, зависит от силы удара. Если опустить текущую ясную сознание боксёра ниже нуля, то это будет нокаут. Уровень энергии у боксёра зависит от активности его действий. Много энергии занимают удары. Чем больше ударов боксёр наносит, тем ниже опускается уровень его энергии. Теперь будем бить боксёра по корпусу. Пропущенный удар в корпус уменьшает общее физическое состояние тела. Если оно оказывается энергетического уровня, то опускает его. Если пропущены удары опускают общий уровень ниже нуля, то это нокаут. Но возможно ещё один вариант. Если уровень энергии боксёра опустился ниже нуля, а боксёр продолжает активно тратить энергию, то начинает понижаться и общий уровень физического состояния. Со временем боксёр упадёт от изнеможения. Пришло время разобрать, как работает мозг боксёра.

[5:35]Мозг боксыра представляет из себя множество пар, стимул реакция. Реакция - это последовательность действий, которые должен выполнить боксёр. Стимул - это ситуация на ринге. Опишу то, как в памяти записана ситуация стимул, который запускает необходимую последовательность действий. Для этого потребуется восемь чисел. Всё будет строиться относительно боксёра. угол относительно оси боксёра, по которому находится центр ринга. Диспансия до центра ринга. Угол под которым расположен противник, расстояние до него.

[6:16]Угол относительно оси противника и прямой соединяющий центр боксёров. Этих пяти чисел достаточно, чтобы однозначно определить расположение боксёров и ринга. Так как всё строится относительно самого боксёра, то все эти ситуации будут постоянно 100% Чтобы включить в описание ситуации динамику, я использую ещё три числа. Текущая скорость поворота у боксёра, у его противника и скорость сближения боксёров. Скорость сближения - это просто разница в расстоянии между боксёрами в прошлом такте и текущем. При этом не важно, кто на самом деле двигается. А теперь пришло время поговорить про реакцию на стимул.

[7:01]Это самые сложная часть нужно будет обсудить дополнительные детали. Последовательность действий можно представить в виде таблицы. Всего шесть колонок, выполняются они по очереди. В каждой колонке могут быть указаны перемещения, повороты и удары. Здесь находится таймер для отчёта времени, когда боксёр потерял связь с реальностью. Поговорим о нём чуть позже. А это счётчик для отчёта времени до загрузки новой последовательности. Как только он дойдёт до нуля, боксёр оценит ситуацию на ринге и загрузит последовательность действий на выполнение. После загрузки в счётчик загружается время до новой последовательности. Чем ниже ясность сознания, тем выше это число. При полной ясности в счётчик загружается значение 14. Нам нужно выполнить перемещение вперёд. Количество тактов для перемещения и поворотов может быть от одного до восьми. Началось выполнение последовательности. Счётчик времени до следующей последовательности уменьшается. После выполнения колонки вся таблица смещается влево. Если счётчик достиг четырёх, а последовательность ещё выполняется, то счётчик замирает на этой позиции. Между последовательностями не может быть меньше четырёх тактов. Предстоит удар правой рукой. Во время выполнения удара, счётчик обратного отчёта возвращается к исходному значению, который зависит от ясности сознания боксёра. При отсутствии усталости удар занимает восемь тактов. По завершению удара рука становится неактивной и ни с чем не реагирует. В эти моменты рука отображается полупрозрачной. Так как следующим действием у нас будет удар другой рукой, то мы не ждём возвращения руки в исходное состояние и сразу переходим к выполнению следующей колонки. А в этот раз придётся ждать возвращения руки в исходные состояния, так как престоит удар той же рукой. Счётчик времени до загрузки следующей последовательности опять заработал. Боксёр оценил ситуацию на ринги и теперь у нас новые последовательность действий. Здесь разные действия выполняются одновременно. Приступив к выполнению связки боксёр будет выполнять её до конца, даже если ситуация изменилась. Но у длинных связок есть своё преимущество. Использование длинных связок позволяет наносить больше ударов за то же время. Короткие связки позволяют чаще оценивать ситуацию на ринге. Какая стратегия, в каких ситуациях лучше боксёры будут выбирать сами. А теперь поговорим про выпадение из реальности. На следующем шаге верхний боксёр пропустит удар. Уровни ясности сознания просели. Последовательность на выполнение удалилась из памяти. Но удар, если он уже начался, будет доведён до конца. Боксёр на короткое время потерял связь с реальностью. Его голова окрашивается в светло-серый цвет. При ударе в корпус эффект в три раза слабее. Теперь, пока счётчик не дойдёт до нуля, боксёр ничего не понимает.

[10:28]Вот боксёр вернулся в реаль. А теперь поговорим про защиту от ударов и про активные и неактивные руки. Если кулак попадает по активной руке противника, то удар считается отражённым. У верхнего боксёра ещё в планах два удара правой рукой, но так как его правой рука находится в пределах противника, то она является неактивной и удар не может быть нанесён. Такая же ситуация и с левой рукой нижнего противника. Это похоже на клиньч в боксе, когда боксёры вяжут друг друга и не дают нанести удар. А вот правая рука свободна. Теперь объединим стимул и реакцию в одной связке.

[11:17]Когда пришло время загрузить новую последовательность действий, боксёр оценивает ситуацию и записывает её в виде восьми чисел. У боксёра есть некоторое количество готовых последователей и каждый из них привязан при которой эта последовательность должна сработать. Мы виртуально удваиваем количество этих пар благодаря тому, что каждую ситуацию и последовательность можно зеркально отобразить. То есть мы просто меняем право и левое местами. Дальше мы сравниваем текущую ситуацию со всеми ситуациями из памяти боксёра. При этом используется функция, которая возвращает разницу между двумя ситуациями. Находим самую похожую ситуацию из памяти боксёра и загружаем привязанную к ней последовательность. Всё. Осталось как-то заполнить память боксёра парами стимул реакция.

[12:15]Будем делать это самым простым способом, который мне пришёл в голову. Суть проста. На новые ситуации будем генерировать случайные ответные последовательности. Записывать их будем поверх старых с самым низким рейтингом. Затем будем отслеживать результат от их использования и обновлять рейтинг. В начале пишу алгоритм в общем виде, а потом пройдёмся по деталям. Изначально память боксёра чиста. Представим её в виде таблицы. Для обучения нам понадобится ещё одна колонка, которая будет означать рейтинг. Стоит уточнить, что рейтинг относится не к последовательности, а ко всей связке, насколько действию и адекватной ситуации. Благодаря отзеркаливанию у нас в таблице появляется столько же виртуальных строк. Пришло время действовать. Мы берём текущую ситуацию на ринге и сравниваем её со всеми ситуациями из таблицы. Если мы ничего похожего не нашли, то выбираем строку с самым низким рейтингом. Записываем туда текущую ситуацию, генерируем случайную последовательность действий и авансом присваиваем рейтинг в 125 баллов. Сгенерированной последовательности выполняется боксёром и по результатам выполнения рейтингов обновляется. О том, как происходит оценка, мы поговорим чуть позже. Благодаря зеркалению теперь в таблице есть две записи. Пришло время боксёру выбрать новую последовательность действий. Сравниваем текущую ситуацию на ринге с ситуацией митаблицы. И если ничего похожего нет, то выбираем строку низким рейтингом записываем туда текущую ситуацию, генерируем случайную последовательность и авансом присваиваем рейтинг 125 баллов. После выполнения последовательности рейтинг корректируется в зависимости от результата. Так, во время тренировочных боёв стройки таблицы постепенно начнут заполняться. Если ситуация на ринге оказалась похожа на ту, что есть в таблице, то выполняет последовательность действий из этой строки и рейтинг строки обновляется. Итак, по кругу. Когда вся таблица заполнена, а текущая ситуация на ринге не похожа ни на одну из тех, что хранится в памяти боксёра, то мы так же, как и раньше, ищем строку с самым низким рейтингом, очищаем её, записываем туда текущую ситуацию, генерируем случайную последовательность и даём аванс.

[15:00]То есть выполняется стандартная процедура. Теперь немного о том, как происходит решение, что нужно создать новую запись в таблице. Мы сравниваем текущую ситуацию на рингей с ситуациями из памяти боксёра и получаем список того, насколько они отличаются от текущей ситуации. Находим запись, где разница минимальна. Теперь нужно сравнить с некоторым порогом. Если меньше, то можно считать, что ситуация идентична. Если больше то это совсем другая ситуация и нужно делать новую запись. В качестве порога можно использовать константу, прекрасно подошло означение 0,3. Но я пошёл другим путём. Значение порога каждый раз генерируется рандомно из диапазона от 0,2 до 1,2. Это позволяет иногда добавлять альтернативные последовательности для сходных ситуаций. А иногда тестировать последовательность, которую уже есть в таблице на не очень похожих ситуациях. Это будет стимулировать сохранение в памяти боксёра таких последователей, которые достаточно толерантны к точности начальных условий. Теперь немного о том, как меняется рейтинг устрок таблицы.

[16:21]Есть два боксёра, оранжевый и розовый. В их мозге активировались соответствующие строки и загрузились в последовательности на выполнение. Первым делом запоминаем координаты боксов. Вычитаем из рейтинга по четыре балла за каждый удар, который есть в последовательности. Если удары в последовательности никогда не достигают цели, то строка с этой последовательностью будет терять рейтинг и со временем будет перезаписано. Оранжевый боксёр развернулся так, что удар пришёлся в руку. За это строка получает пять баллов. Оранжевый боксёр провёл удар силы равные 24 и настолько же увеличивается рейтинг строки. Рейтинг строки у розового боксёра уменьшается на половину от силы удара. Попадание в руку, плюс пять баллов у розового боксёра. Ещё один пропущенный удар силой равный 20. Плюс 20 баллов оранжевому боксёру и -10 розовому. И в конце нужно посмотреть, насколько боксёры приблизились или удалились от края ринга. Чем ближе краю, тем выше по модулю получаются оценки. Это нужно для того, чтобы боксёры избегали приближения к краю. И ещё один важный момент. Оценки полученные при ударе и пропущенном ударе уменьшаются в два раза и прибавляются к рейтинг строки, которая выполнялась в прошлый раз. Этим мы поощряем те последовательности, которые выводят боксёров в более выгодную позицию. Пришло время начать тренировки.

[18:03]Для обучения я создал клуб, состоящий из восьми бокёров. Во время тренировок им предстоит привести множество спаринг в друг с другом. В начале спаринг боксёры располагаются на линии отстоящей на заданной расстоянии от центральной оси. Они случайно сдвигаются на небольшое расстояние вверх или вниз. Также им задаётся случайный угол из некоторого диапазона. Благодаря этому каждый раз спаринг будет начинаться с уникальной позиции. Во время соревнований для определения победителя проводится заданный количество спаринг и победитель определяются по большему количеству побед. И мы приступаем к тренировке. На ринг выходит два боксёра. Это их первый бой и их память абсолютно чиста. Всего боксёр имеет 60 строк для записи. Здесь отображается рейтинг каждой строки. Пришло время Но так как память абсолютно чиста, боксёр записывает в пустую строку текущую ситуацию, генерирует последовательность и присваивает строке рейтинга 125 баллов. Так как в связке четыре удара, то 16 баллов вычитаем. Только что сгенерированная последовательность будет выделяться в таблице зелёным цветом, а по центру головы боксёра будет отображаться светлый круг.

[19:28]Пришло время для новой последовательности. и мы оцениваем, насколько изменилось положение боксёра относительно края ринга. По итогу эта строка потеряла почти 23 баллов в рейтинге. Боксёр оценивает ситуацию на ринге, и так как ничего похожего в его памяти нет, заполняет новую строку. В итоге боксёр вылетает за край ринга и строка теряет 30 баллов рейтинга. У противника плюс 10 баллов. Это кажется незаслужным, и такие ситуации будут возникать часто. Но так как спаринг будет очень много, рейтинг удачных строк будет расти, а неудачных падать.

[20:13]В начале боксыры выглядят достаточно несуразно, но с каждым новым спарингм их уровень растёт, они находят всё больше и больше удачных комбинаций, соответствующих положению на ринге. После каждого спаринг игры каждый строке уменьшается на небольшую Это позволяет убирать из памяти боксёра те строки, которые редко используются. Память с рейтингом я голубым цветом помещают те места, где рейтинг выше 300. В реальных поединках будут использоваться только эти строки, как доказавшие свою эффективность.

[21:05]Напомню, что при удачных ударах рейтинг повышается не только у текущей строке, но и у строке, которая выполнялась перед этим. Сейчас текущая последовательность у синего боксёра имеет высокий рейтинг, но в самой последовательности нет ни одного удара. Но она поворачивает боксёра рукой вперёд для защиты и выводит боксёра в удачную позицию для мощного удара. Благодаря этому и был заработан высокий рейтинг. Так может продолжаться очень долго. Рейтинки строк обновляются, какие-то выпадают в появляются и тестируются новые. Перрически после каждых 70.000 спарингов я сохраняю память боксыра в отдельной папке. В итоге у меня накопилась 21 папка. К этому моменту каждый боксёр провёл 367.500 спарингов.

[21:52]Пришла пора оценить прогресс боксов. Для этого я устроил соревнование между соседними папками. Каждый из восьми боксов в одной папке проводит за одное количество спарингов с боксёром другой папки и все победы зачисляются в общий счёт команды. Сейчас на экране вы видите одно из таких соревнований. В этой модели есть интересные особенности. Возможно, ситуации, когда один боксёр с помощью короной комбинации доминирует над всеми остальными. Все остальные доминируют над слабым бойцом. Но этот слабый боксёр является неудобным противником для доминанта. так как легко избегает его приёма. Можно выделить сильных боксёров, как красный боксёр, который сейчас на ринге. Но их победы носят вероятностный характер. Просто они побеждают чаще, чтобы точно понять, какой из боксёров лучше требуется провести много спарингов. То есть наблюдается то, что нам нравится в реальном спорте. Можно выделить сильных, но исход конкретной встречи никогда нельзя точно предсказать. Именно поэтому привлекают интересы зрителей. Давайте посмотрим, что у нас с прогрессом у боксёров. Чем больше проходил с парников, тем выше остановился уровень боксёров. В начале прогресс был очень сильным, затем потихоньку стало замедляться. Времени были провалы, но общий тренд сохранялся. Пока остановлюсь на этом уровне. Теперь у нас есть восемь сильных боксёров. И они будут основой для следующего ролика, где мы будем использовать определение с помощью генетического алгоритма. То есть создадим популяцию боксов и в череде поколений займёмся селекцией для получения таких экземпляров, которые смогут показать более высокий уровень мастерства. А что может быть интереснее скрещивание боксов?

[23:53]На сегодня всё. С вас лайк, подписка, комментарий. Особый благодарность тем, кто поддерживает меня на бусте. Всем пока.

Need another transcript?

Paste any YouTube URL to get a clean transcript in seconds.

Get a Transcript