LINUX.ORG.RU
ФорумGames

Artificial Intelligence для игры в крестики-нолики

 , , , ,


0

1

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

Круто прозвучало, аж самому понравилось. Но, помнится, в бытность первого релиза были на Хабре и иронические реплики, типа хаха, из пушки по воробьям. Сходу предупреждая подобного рода - «можно было и на if-ах склепать» - аффекты: можно-то оно, знамо дело, многое, в том числе Яндекс открыть и поиграть, но практического опыта разработки игровой логики у вас не будет, да и к пониманию основ нейронных сетей не приблизитесь никоим образом. А, самое главное - вай нот, почему нет? - практика моей когда-то офисной карьеры ехидно напоминает, увы, что значительно большие, нежели в контексте данной разработки, человеческие ресурсы сплошь и рядом у нас тратятся на достижение гораздо менее значимых целей, чем написание программы, призванной проиллюстрировать не только опыт разработчика, создающего полностью эксклюзивный (#аналаговнет) алгоритм Artificial Intelligence, но и некоторую его склонность к юмору.

ОК, с этим разобрались. Теперь - коротко по сабжу. И да, если заинтересовал, позвольте адресовать к подробным докам на тему, здесь же - ремарка короткой строкой и ссылка на гитхаб для тех, кто пожелает попробовать обучить и обыграть нейронку (вам понадобится установить Ruby, далее ровно никаких технических проблем и плясок с бубнами). Итак:

gem install csv ruby-fann progress_bar tty-pie
git clone https://github.com/cmirnow/Tic-Tac-Toe-AI-with-Neural-Network-Resurrections.git
cd Tic-Tac-Toe-AI-with-Neural-Network-Resurrections
ruby start.rb

После первого запуска программа, не знающая правил и абсолютно не умеющая играть в Tic Tac Toe - проигрывает рандомно несколько десяткой тысяч партий (определено в настройках, меняйте и экспериментируйте, при желании), что занимает, в зависимости от ресурсов вашего рабочего компьютера, одну-две минуты. В качестве итога будет создан расширенный лог-файл в формате csv, о чем приложение известит соответствующим мессаджем консоли, пригласив к игре.

Следующий запуск (также все последующие, пока в директории приложения находится единожды сформированный лог) начнется так же, как в обиходе у большинства современных компьютерных игрушек - с загрузки данных (здесь все значительно быстрее) в оперативную память, что визуально сопровождено бегущей строкой терминала. В скобках: логика программки исправно отрабатывает в консолях Linux и Windows, но в винде процесс игры визуально способен выглядеть несколько хуже (пробовал пару раз на виртуалке, я очень не любитель поделий M$; отпишитесь, please, если заметите иные проблемы). По окончании чего Artificial Intelligence готов играть: после окончания каждой партии тут же начинается новая, очередность ходов (нейронка умеет играть как первым, так и вторым номером) выбирается случайным образом.

Алгоритм был несколько изменен по сравнению с предыдущим релизом, что позволило ощутимо улучшить уровень игры виртуального оппонента. На самом деле, мне практически теперь не удается обыграть своего маленького франкенштейна, который всегда сводит игру как минимум к ничьей, если не всегда к выигрышу. Если сумеете хотя бы раз выиграть, либо же программка откажется продолжить игру - это явно нештатная ситуация (не забываем, ваш виртуальный игрок вполне успешно обучает сам себя и полностью с нуля, что не очень просто и неким образом иллюстрирует историю Мюнхгаузена, сумевшего вытащить самого себя из болота за волосы), вам необходимо выйти из приложения (q + Enter), удалить лог и запустить процесс обучения заново.



Последнее исправление: rishard (всего исправлений: 1)

После первого запуска программа, не знающая правил и абсолютно не умеющая играть в Tic Tac Toe - проигрывает рандомно несколько десяткой тысяч партий

После чего, по канону, должна вывести сообщение

A STRANGE GAME. THE ONLY WINNING MOVE IS NOT TO PLAY.
alegz ★★★★
()
Ответ на: комментарий от Leupold_cat

Хороший вопрос. Воспользуюсь им, чтобы досказать недосказанное…

Ответ - не думаю. Да и смысла в этом нет. Алгоритм написан как шутка, невеселый такой прикол: из сонма абсолютно бессмысленных ходов (повторюсь, обучение проходит как игра двух виртуальных игроков, ни один из которых не обладает ни малейшим умением играть) нейронная сеть пытается просчитать и вытащить оптимальные ходы, руководствуясь некоей приданной ей логикой, именно в ней своеобразный эксклюзив данного кода. И это really напоминает сказку о бароне Мюнхгаузене, который, невзирая на отсутствие точек опоры, все же вытаскивает себя любимого из болота. Другие аналогии найдите сами, не рискну сформулировать более подробно. Возможность масштабирования подобной, в духе нигилизма, логики означала бы, что она перспективна, что «не все так однозначно» и подобное мироощущение конкурентно, имеет право на существование. Идея же, положенная аффтором в основу этой забавной игрушки, диаметрально противоположна, увы.

Логика AI, позволяющая ему балансировать в воздухе, практически не имея точек опоры, примерно такова: если среди множества возможных в данной ситуации ходов есть хотя бы один, являющийся последним в игре - он наиболее оптимален, если предпоследним - оптимален наименее. Понятно, почему? Плюс - алгоритм пытается высчитывать опасные ходы, также ходы, потенциально приводящие к форку, также атакующие ходы; все эти критерии ощутимо влияют на веса, скармливаемые затем нейронке, что позволяет ей принимать правильные решения. Но это не более чем мрачная шутка, именно так, по мысли автора, к ней и следует относиться.

rishard
() автор топика
Ответ на: комментарий от vvn_black

Недавно русскоязычный Твиттер обсуждал очередную девушку-бедолагу, которую выперли с вечеринки с формулировкой «презрительно смотрела на айтишников». Не поверите, но вот прочел коммент, и сходу вспомнилось… )) Увы, нет у меня такого AI, который вам надобен. Но если стокгольмский синдром столь странным образом коррелирует склонность к (хм, интересно) высокоинтеллектуальным играм - напишу спецом для вас, обращайтесь. Лучше не на форуме. А то я тоже не любитель виртуальных вечеринок айтишников.

rishard
() автор топика
Ответ на: комментарий от rishard

Вы очень вычурно выражаетесь, либо стесняетесь, либо просто пространно говорите.

А я, без шутки. Представьте, что ваш AI будет угадывать значительно больше/меньше (в районе трёх сигм) 50%, вот где будет шутка.

vvn_black ★★★★★
()
Ответ на: комментарий от rishard

в данной ситуации ходов есть хотя бы один, являющийся последним в игре - он наиболее оптимален, если предпоследним - оптимален наименее. Понятно, почему?

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

visitor
()
Ответ на: комментарий от visitor

Нет. Здесь вы ошиблись.

Если лог-файл включает, как и было сказано, возможность в любой игровой ситуации сделать последний ход - этот ход априори не способен быть проигрышным. Он или выигрышный, и это уже никоим образом не зависит от противника, или, если это девятый по счету ход - единственно возможный. Т. е., простите за самоцитирование, в любом случае (и в случае ничьей тоже), для AI данный ход оптимален.

Примерно то же самое относительно предпоследнего хода - он или заведомо проигрышен, коль скоро противник потенциально имеет возможность следующим ходом закончить партию в свою пользу, либо единственно возможен. Разумеется, не рассматриваем варианты, когда противник AI проморгал возможность выигрыша.

Что касается излишней усложненности - тоже нет. Во всяком случае, до тех пор, пока ваш тезис не будет сопровожден аргументацией, на данный момент он голословен. А правы вы в том, что поиск собственной игровой стратегии, которая способна быть положена в основу логики AI - в самом деле весьма увлекательное занятие. Я добавлял ряд условий по мере их необходимостей, играя, тут их на самом деле минимум. Стратегия и в самом деле получилась сугубо эксклюзивная, хотя и нерациональная. Сравнил бы сделанное со старыми часами, с маятником и кукушкой, в мире высоких технологий… перспективы в них нет, но приятно повесить на стенку эдакий раритет, особенно если ты сам их починил или даже собрал. А если стенка называется github, то в этом есть и некоторая практическая польза.

rishard
() автор топика
Ответ на: комментарий от rishard

Примерно то же самое относительно предпоследнего хода

Что значит примерно? Если два игрока играют оптимально, то эта игра всегда сводится к ничьей. При этом предпоследний ход естественно не является проигрышным для того игрока, который его совершает (т.е. для второго игрока). И по этой же причине он не является «наименее оптимальным». Возможно, тут просто словесная неразбериха.

Что касается излишней усложненности - тоже нет.

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

visitor
()
Последнее исправление: visitor (всего исправлений: 1)
Ответ на: комментарий от visitor

@visitor, «примерно» значит то, что второй кейс вы не понимаете примерно так же, как не понимали и первый. :) Несколько вижу, с последним ходом, который, если он не девятый по счету, то априори выигрышен, удалось разобраться? Ну так непосредственно отсюда следует, что предпоследний ход, если его порядковый номер не 8 - заведомо проигрышный. Подумайте немного, и вы поймете самостоятельно, это очевидно даже без рассмотрения кода AI.

Смотрите, всё совсем не бином Ньютона: я сделал ход, далее следующим ходом вы выиграли. Отсюда неизбежно следует логика, вполне доступная для данного AI: сделанный мной ход, порядковый номер которого отличен на единицу от общего числа ходов в данной игре - был наименее оптимален. Поймите, ваши рассуждения «игра всегда сводится к ничьей» - для данного AI абстракция настолько высокого порядка, что и говорить об этом не имеет смысла.

Возможна игровая ситуация, в ходе которой два единственно возможных хода одинаково неизбежно приводят к проигрышу. Это вилка, которая, несмотря на то, что «в игре стишком мало различных ситуаций», случается, тем не менее, отнюдь нередко, и избежать которой позволяют некоторые иные мои стратегии. Если их отключить - что совсем не сложно в коде AI - это моментально скажется на уровне игры. Которая на данный момент действительно не допускает (если не подводит рандомно создаваемый файл игр, на который опирается логика AI и веса которой скармливаются нейонке) проигрыша, приводя AI как минимум к ничьей. Всё остальные схоластические рассуждения - и в самом деле что-то про сову и глобус.

rishard
() автор топика
Ответ на: комментарий от visitor

Чтоб не быть голословным.

https://ibb.co/yQ5fTR4

Скрин иллюстрирует произвольную (запустил софтину) игровую ситуацию, практически первую попавшуюся. На протяжении всей игры AI не только делает ходы, но и выводит в консоль логику, которой он руководствуется, совершая ходы; как видите, вверху на этот раз обозначены два массива: заведомо неприемлемые ходы 6, 9, 4 («предпоследние ходы», именно то, что составляет предмет нашего с вами разговора) и перечень ходов, которые, по мнению AI, потенциально способны привести к вилке. Подчеркну этот момент: не «приводят», а «могут привести», это немаловажно (решение в пользу того или иного хода принимается на основе не одного, а нескольких критериев, определяющих скармливаемые нейронке веса). Ходы, составляющие первый массив, сходу отметаются, т.е. им даже не присваивается минимальные веса, они попросту исключаются из перечня возможных. Далее нейронной сети в данном случае даже и делать ничего не приходится: она получает единственную альтернативу - ход на 2 - который и реализует. Далее, разумеется, ничья, т.к. AI, используя опять-таки «массив неприемлемых ходов», не позволит Human реализовать вертикальный правый ряд, единственно способный привести здесь к победе.

К слову, замечу, что роль NN далеко не всегда так минимальна, как в описанном кейсе. Интересно, что в одной и той же игровой ситуации и руководствуясь одним и тем же лог-файлом отыгранных игр - эта нейронка способна выбирать разные ходы, что меня на первых порах несколько удивляло.

rishard
() автор топика
Ответ на: комментарий от paddlewan

Любители более интеллектуальных игр, нежели крестики-нолики, имеют возможность перекинуться в покеришко (никаких денег и регистраций, голая логика; на щелбаны, так сказать). Набросал что-то вроде, взяв за основу техасский холдем. Пока без AI, но виртуальный игрок понимает все покерные комбинации, оставляя их после раздачи и меняя другие карты. К сожалению, покерист из меня никакой, посему долго и нудно раздумываю над продолжением. По уму, надо бы попробовать поменять jQuery на react и тоже озаботиться нейронкой, вдруг да интересно получится. Если у кого-то вдруг мысли относительно принципов построения логики таковой, или есть рабочая ссыль на дельную идею - буду весьма признателен.

rishard
() автор топика
Ответ на: комментарий от pup_kin

Так про то и пишу. Алгоритм называется minimax. Простейшая история на 50 строчек (в зависимости от языка, конечно). Там суть в рекурсивом обходе всех вариантов ходов до конца партии. То есть, для каждого хода просчитываются все варианты до конца партии, для шахмат уже не пойдет, лол :)

https://en.wikipedia.org/wiki/Minimax

Но, конечно же, крестики-нолики без нейронки это скукотень :)

paddlewan
()
Последнее исправление: paddlewan (всего исправлений: 1)
Ответ на: комментарий от rishard

у так непосредственно отсюда следует, что предпоследний ход, если его порядковый номер не 8 - заведомо проигрышный."

Вот именно этого уточнения я и ждал. Потому что без него то, что Вы написали - неверно. Т.е. в [i]общем[/i] случае предпоследний ход не означает проигрышный. В частном случае (т.е. при уточнении условий) можно согласиться.

что в одной и той же игровой ситуации и руководствуясь одним и тем же лог-файлом отыгранных игр - эта нейронка способна выбирать разные ходы

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

visitor
()
Ответ на: комментарий от paddlewan

Так и я про это. :) Для тех, правда, кто умеет читать и слышать не только себя. Увы, всеподавляющая фиксация на себе любимом - профессиональная болезнь айтишников, примерно так же, как у артистов балета не буду говорить что (нет, не у всех).

Повторюсь для особо одарённых любителей жанра выплёскивать в нете аффекты собственных завидок и детских мстей. Столет известная, хорошо описанная и 100500 раз реализованная на всех без исключения ЯП стратегия игры в tictactoe не содержит сегодня ничего уже, к сожалению, интересного. Хотя, несмотря на это, новые и новые игрушки на её основе появляются часто, имя им легион на гитхабе. Кому-то из гениев ЛОРа интересно забацать очередной форк, гордо выдав его затем за своё творение? - флаг в руки и вперёд, слова не услышите. А мне интереснее сделать что-то сугубо своё, попутно потренировавшись на алгоритмах FANN и создании сугубо эксклюзивной логики. Каждый выбирает для себя, как известно со слов одессита Левитанского. Кому и что ближе - дешёвый плагиат и смешное тявканье по форумам, либо же забавный, действительно не лишенный остроумия алгоритм, который планирую в ближайшее время презентовать немосковской публике на Медиуме.

Кстати, будет весьма интересно сравнить оттенки обсуждения, здесь и там. :P

rishard
() автор топика
Ответ на: комментарий от visitor

Обьясню, почему не сделал этого уточнения. Причина проста: говоря об оптимальных / неоптимальных «с точки зрения» NN ходах я, конечно же, имел в виду веса. Для меня это очевидно, но упустил из виду, что так не для всех. Вообще, разумеется, правильнее было бы начать обсуждение с соглашения о терминах, по другому и быть не должно. Но формат комментариев не предусматривает подобного подхода, отсюда, вероятно, и возникло непонимание.

Дело в том, что работа neural network в данном случае наиболее заметна на ранних этапах игры. Ближе к концу, когда остаётся минимум альтернатив для хода, её роль начинает перехватывать логика AI, так проще и удобнее. А для данной логики, в отличие от алгоритмов NN, веса уже не имеют приоритетного значения. Но продолжают иметь место быть, никуда они не делись, посему я и использовал терминологию «оптимальные ходы». Как-то так, вероятно.

rishard
() автор топика
Ответ на: комментарий от rishard

Воу-воу, ты чо завелся-то, заюш? Я тебя обидел что ли где-то? Просто констатировал факт, что у задачи есть простое решение на 50 строк, а тебе интересно поэкспериментировать, поэтому ты им не пользуешься. Целью моих двух постов в этой ветке было только лишь вкинуть в сознание читателей слово minimax, которого многие могли и не знать. Потому что ну хорошо же знать имеющиеся решения, чтобы не строить велосипеды… При этом никаких нападок на твой подход не предполагалось. Так что неудачно ты выбрал тон в порыве самолюбования, не надо со мной так.

paddlewan
()
Ответ на: комментарий от paddlewan

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

Добрый совет: как там «с тобой надо», ты это оставишь для дома для семьи. Возможно, жена пошлёт тебя не сразу, когда ей скажешь подобное. А со всё мной чуть иначе; хочешь попробовать - всегда пожалуйста.

На будущее. Я с удовольствием выслушаю дельную нотицию действительно знающего человека. Но явно это не твой случай, просто потому, что ты несёшь заведомую погребено. Скукотень тебе, говоришь? Вау-вау, ну развлекись на досуге, клоун. Вот для начала этим: на страничке проекта обёртки FANN в качестве единственного примера, демонстрирующего возможности либы, предназначенной для построения нейронных сетей - опубликована ссылка на проект для игры всё в то же tictactoe.

https://github.com/tangledpath/ruby-fann

Ай-яй, вау-вау. Думай скорей, к чему докопаться и как выкрутиться из нелепого положения, в которое ты сам себя поставил. Мне не хотелось тебя так расстраивать, но ты сам напросился.

Надеюсь, скукотень наконец прошла? Привет обделавшемуся корифею «ненадосомнойтак».

rishard
() автор топика
Ответ на: комментарий от pup_kin

Емнип: у крестиков-ноликов есть не одна выигрышная стратегия. Ссылку на классический пример нейронной сети такого рода можно глянуть на страничке, например, рубиновой обёртки FANN, ссыль есть в этом комменте.

Artificial Intelligence для игры в крестики-нолики (комментарий)

Не расказывали такое в вашем университен, «на теории игр»? Жаль.

rishard
() автор топика
Ответ на: комментарий от rishard

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

Подход не нов. Гугел так какую-то шахматную программу обучала с нуля ( без дебютного справочника и т.п.) . Так потом та прога фрица в угол загнала

Psilocybe ★★★★
()
Ответ на: комментарий от paddlewan

Зачем минимакс? Оптимальный вариант первого игрока - поставить в центр, второго - в угол, второй ход первого игрока - поле рядом, после чего начинается игра «не оставляй две фишки противника и пустое поле в одной линии», которая неизбежно заканчивается ничей. Даже на МК-52 реализация алгоритма занимала меньше 50 инструкций.

unC0Rr ★★★★★
()
Ответ на: комментарий от paddlewan

Неа. Чем неестественнее попытка подладиться под молодёжный сленг интернет-форумов, тем всё более отчётливо вижу обделавшегося старпера… :) Куда тебе «ещё», олд. Ты и так уже поднавалил столько, что не отстираться. :)

rishard
() автор топика
Ответ на: комментарий от unC0Rr

@unCORr , скажите, на чем основано допущение о том, что целью этой игрушки является выигрыш или ничья в крестики-нолики? Либо, что добиться минимума количества строк кода было неким приоритетом в контексте той или иной задачи?

Мне, к слову, процесс всегда представляется неизмеримо более значимым и важным, нежели результат процесса. И не могу сказать, что являюсь автором даного подхода…

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

rishard
() автор топика
Ответ на: комментарий от paddlewan

Ну так на здоровье. :) Главное, чтоб было те чем заняться долгими зимними вечерами. Вот только мозоли на руках не натри над скринами. Кстати, заюшу свою можешь засунуть себе в заднюшу, людям определённого толка, говорят, неслабо помогает. :D

rishard
() автор топика
Ответ на: комментарий от paddlewan

То, что всем на удовольствие демонстрирует здесь @paddlewan , в психологии называется фиксацией. Видите, не перепутаешь: все уже давно проехали и занялись чём-то иным, а для него актуально, по несколько сообщений в день строчит. И, что интересно, не оторваться ему; походу, именно в подобном Фрейд видел вытесняемую гомосексуальность.

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

Впрочем, продолжай. Позволь, угадаю: тебе жизненно необходомо, чтобы последнее слово осталось непременно за тобой? Иначе чувство ущемленности, ущербности не исчезнет, так?

rishard
() автор топика
Ответ на: комментарий от paddlewan

«Там уже всё придумано» - не разговор. Что именно придумано лично тобой, @paddlewan ? Покажи гитхаб, «программист». Я не любитель питона, но отдать должное коду сумею. Судя по твоей прыти не в твоей теме, ты в этом деле корифей. Открой личико, не скрывай свою красу, пусть и слегка увядшую с возрастом. :)

Да, и кстати, ссылки на то, что работы твои засекречены МО РФ, не катят: у любого дельного программиста есть open source, что возможно показать.

Итак?

rishard
() автор топика
Ответ на: комментарий от luke

Журнал Юный Техник когда-то прорекламировал для советских школьников книгу Хейзермана «Сделай себе Бастера». Бастер - робот, увлекательное общение с которым начиналось задолго до окончания работы над ним, Электроник в оригинале, так сказать. Подробнее по ссылке.

Увы, достать и прочесть её в совке было почти невозможно.

http://jtdigest.narod.ru/kollection/baster/baster.htm

rishard
() автор топика
Ответ на: комментарий от paddlewan

Почитайте по «игру с нулевой суммой». Там все уже придумано. В том числе и то, что ничья - это положительный исход партии.

Окончание игры в крестики-нолики (tic tac tie) способно иметь, с точки зрения каждого из двух игроков, любое из трёх состояний: выигрыш, проигрыш, ничья. Точка. Вся остальная демагогия суть следствие невысокой теоретической подготовки, что не позволяет адекватно интерпретировать статью вики, ссылка на которую приведена выше, плюс, вероятно, плохое знание английского.

Подчеркну, оценка итога той или иной игры априори выходит за её логические рамки. Разумеется, и ничью и даже проигрыш, в рамках той или иной концепции, возможно интерпретировать как её автору угодно, или же удобно. For example, самый масштабный пр*еб (forgive me for my English) возможно, при необходимости, представить как победу; уверен, всё читатели этих строк, слегка над ними поразмыслив, в самом ближайшем будущем получат возможность признать их несомненную правоту.

rishard
() автор топика