Искуственный интеллект

Наконец придумал, чем занять нейросеть. Научить её играть в игры.

Но для того, чтобы научить нейросеть чему угодно, для начала надо сделать набор данных для обучения. В случае с играми, соответственно, это будут партии различных игр. Для начала я выбрал что-нибудь попроще: крестики-нолики. Благо ПОЛНОЕ дерево решений для этой игры очень небольшое. Чисто теоретически там 9! игр (около 360 000), в реальности намного меньше: не все игры идут 9 шагов, многие являются отражениями других игр, развёрнутых на 90, 180, и 270 градусов. И так далее.

Написал программу на Питоне, которая генерирует все возможные игры, играет в них, и записывает результаты. Таким образом, у меня получилась программа, которая играет в игры традиционным способом — через построение игрового дерева.

Но будучи полным новичком в написании игр, я сделал фатальную ошибку. Вот как именно программа решает, каким ходом ответить на ход противника? Вопрос не такой простой, как кажется. Вроде бы очевидно — берём ход, который скорее всего приведёт нас к победе, и ходим так, да? Так думал и я. И неверно думал. То, что ход может привести нас к победе, совершенно не означает того, что он не приведёт нас к поражению. Поэтому сказав программе выбирать ход с наибольшей вероятностью победы, я сделал её довольно дурной — даже такой плохой игрок как я (я очень хреново играю в крестики-нолики, шашки, шахматы, и прочие подобные вещи), её легко обыгрывал.

Программа должна выбирать не ход, который приводит к победе. А ход, который не приводит к поражению. Вот такая логическая загогулина. Ничего, завтра переделаю программу и попробую заново. Может быть, даже до нейросети — изначального места назначения — дело дойдёт.

Программы, которые играют в шахматы тоже работают таким же образом — через построение игрового дерева. Только полное игровое дерево для шахмат… эээ несколько больше, чем количество атомов в наблюдаемой вселенной, так что дерево строят только частичное, и определают перспективность той или иной ветви через минимакс.

Вообще, если есть возможность строить игровое дерево — лучше строить игровое дерево. Такие программы будут играть в игру лучше, чем нейросети (которые по сути только распознают паттерны и реагируют на них). Но игровое дерево строить возможно далеко не всегда. Скажем, Го не поддавалось, поэтому нормально играть компьютер в Го наконец-то научились именно, что через нейросети. Потому что игровое дерево для шахмат — 10E120 (число Шеннона), а игровое дерево для Го — 1.74E172! Но даже Го меркнет перед огроменным деревом крайне (на первый взгляд) простой игры Стратего, чей размер составляет 10E535!!! Неудивительно, что компьютер играет в Стратего крайне слабо. Может быть, именно что нейросети научатся. В лоб, через построение дерева — путь тупиковый.

Кто с детьми в игрушки играет?

Приобрёл подержаный Плейстешен 4. Кто какие игры порекомендуют, чтобы с детьми было интересно? У нас хиты пока вот такие:

1. Little Big Planet 3 (с большим отрывом)
2. Minecraft (куда же без него)
3. Baja: Edge of Control

Какие ещё кто порекомендует? Интересует именно чтобы можно было играть вдвоём-втроём, либо split screen, либо как в LBP — несколько аватаров на одном экране. Я б, конечно, зарядил бы Rock Band (лучшая игра всех времён и народов для локального мультиплеера), но дети слишком маленькие пока. Не врубятся.

Да, я, кстати, считаю, что компьютерные игры для детей это намного лучше, чем просмотр мультфильмов или ещё чего. В играх ребёнок участвует, у него работает мозг, развивается координация. А при просмотре мультиков ребёнок сидит как дундук и тупо втыкает в экран.

Интересное математическо-игровое

Если есть возможность научить компьютер что-то делать — он это будет делать намного лучше человека. В том числе — и играть в игры.

Большинство игр типа шашек, шахмат, домино и даже крестиков-ноликов компьютер играет через постройку дерева решений. Для крестиков-ноликов это вполне тривиальная задача, так как количество возможных игр в крестиках-ноликах равно факториалу 9 или примерно 363 тысячам. Для современных компьютеров это ерунда. Шашки уже посложнее — там 500 квинтиллионов (500 000 000 000 000 000 000) возможных игр. И полное дерево решений для шашек таки было построено. Число возможных игр в шахматах же несколько превышает… кгм… количество атомов в наблюдаемой Вселенной, поэтому с построением полного дерева ожидаемо возникает затык. Да и с шашками, вообще-то, тоже, так как 500 квинтиллионов поместятся далеко не во всякий компьютер 🙂 Ну, полное дерево, в принципе, и не нужно. Чтобы выиграть в шахматы, например, у меня, достаточно построить дерево ну хотя бы в четыре уровня, потому что я архихреново в них играю. Чтобы выиграть у гроссмейстера, понадобится дерево пошЫрше и поглЫбже; но это тоже не является проблемой — компьютер теперь с гарантией выигрывает у лучших в мире гроссмейстеров, тема, по сути, закрыта.

Но есть игры, не пользующиеся деревьями решений. Например, морской бой. По сути своей, задача выигрыша в морском бое состоит в поиске нужных данных по несортированному, случайному двоичному массиву. Казалось бы, если массив не сортирован и случаен, значит, оптимальной стратегии в морском бое нет. Но реальность немного интереснее 🙂

Чуваки из конторы DataGenetics провели математический разбор “Морского боя”:

http://www.datagenetics.com/blog/december32011/

Во-первых, выяснилось, что шахматное расположение обстрела совсем ненамного лучше абсолютно случайной стрельбы. Что лично для меня явилось сюрпризом — я полагал, что это сильно сокращает количество ненужных выстрелов.

Во-вторых, выяснилось, что оптимальная стратегия в морском бое таки есть. Так как в игре есть правила и логика, то вероятность расположения кораблей противника является вполне себе вычисляемой величиной. Нет смысла искать пятиклеточный авианосец промежду стреляных клеток, расположенных друг от друга на расстоянии в три клетки.

И что характерно, рассчитать карту плотностей вероятностей у компьютера получается значительно лучше человека.

Карта плотностей вероятностей на 12 ходу после 5 попаданий:

Хотя люди тоже пользуются примерно такой же стратегией — статистически компьютер всё же будет выигрывать. Вот такие пироги с кремниевыми котятами.

За неимением руля

Вернее, места, куда поставить руль, приобрёл игровой контроллер для коробокса и подключил его к компьютеру. Это, как бы, штатный вариант подключения для Windows 10. В теории можно подключить контроллер от плейстешена, но там надо мудрить с эмуляцией и прочим. Оно того, на мой взгляд, не стоило.

Забег по мудям (Mudrunner 😉 ) заиграл новыми красками. Рулить стало намного проще, т.к. рулишь не в режиме ШИМ =) Но самое главное улучшение это даже не руление, а плавный контроль над акселератором. В любом заезде по чему-то скользкому, будь то снег, лёд или мокрая глина самое важное — это сохранение контроля над сцеплением колёс с дорогой. При трогании на льду, например, надо газовать осторожно, медленно, и иногда даже полезно врубить передачу повыше, чтобы крутящий момент поменьше был. Иначе дрыгатель ревёт, колёса крутятся, а толку ноль — даже вперёд толком не едешь. А тут осторожненько, на мягких лапках, намного проще доехать до места назначения.

В-общем, рекомендую такой контроллер, хорошая штука.

Стратегический заезд по говнам-2

Приобрёл наконец обновлённый Spintires под названием Mudrunner.

Очень нравится. Камера стала более нормальной, улучшилась графика (отдельно порадовали радужные следы от горючки/масла, остающиеся на воде, когда хорошенько так газанёшь). И, конечно, новые громыхайки — включая эпичный Советский трактор К-700 “Кировец” и “Шишигу”.

Захотелось купить себе игровой руль с механической коробкой (“а куда мы всё это будем ставить, дорогой мой?” — тихо спросила жаба), было бы прикольно… да ещё если бы на три экрана размазать…