Интернет |
Крестики-нолики пилота Пиркса
К НГ написал прикольный скрипт, представляющий из себя некоего виртуального игрока в крестики-нолики. Artificial Intelligence работает на основе рубиновой обертки FANN - open source библиотеки, предназначенной для построения нейронных сетей. Этапы процесса, посредством которого "искусственный интеллект" на основе Neural Network приходит к тому или иному ходу - выведены в консоль, что видно в ходе просмотра короткого скринкаста (программа находится в активной фазе развития и видео уже устарело: сейчас интерактивной инфы в консоли несколько больше).
Заценить код или скачать и поиграть можно на гитхабе. Разработка шла на ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-linux], а впрочем, версия ruby или ось практически без разницы. Для работы скрипт требует джемы csv и ruby-fann.
По ходу кодинга сознательно не смотрел иные решения аналогичных компьютерных игроков на любых ЯП, чтобы не отклоняться от первоначальной идеи... которая не скажу что блещет новизной и вообще крайне проста: при первом запуске скрипт рандомно проигрывает сам с собой несколько десятков тысяч партий в крестики-нолики (занимает минуту - две, в зависимости от ресурсов компьютера), записывая ход игры плюс некоторую дополнительную информацию в csv-файл; и задача виртуального игрока затем - из огромного числа случайных ходов выудить оптимальные, в чем и заключена функция нейронной сети. Получилось, в общем, забавно: аналогов AI такого рода пока что на гитхабе не вижу, несмотря на несметное число самых разнообразных TicTacToe.
Т.е. логику работы приложения возможно описать так: на каждый ход человека-игрока формируются два массива: массив не противоречащих правилам игры ходов, возможных при данном положении на доске, и массив коэффициентов, "приоритетов", каждому из этих ходов, возможно (способны разниться), свойственных. Программа как бы балансирует на огромном числе вероятностей, формируя - в ход идет все, начиная с коэффициентов и заканчивая сравнением количества однообразных ходов с различными коэффициентами - наивысшую; именно такова здесь роль нейронной сети. Итог работы - ход, с наибольшей (по "мнению" NN) вероятностью приводящий в итоге к успеху... все очень несложно, хотя и представляет из себя пищу для вполне себе интересных размышлений.
На данный момент скрипт играет только ноликами, т.е. вторым номером (постараюсь дописать функционал в самое ближайшее время). Как правило, программа вполне успешно сведет вашу с ней партию к ничьей, а если где-либо лоханетесь (насколько помню, вторым номером в крестики-нолики заведомо возможно выиграть только вследствие ошибки противника, если же ошибок нет, ничья - максимум того, что возможно) - моментально этим воспользуется. Словом, совсем не зловредный андроид из "Дознания пилота Пиркса"...
Отмечу интересный момент: несмотря на то, что данные на входе - положение на доске, лог-файл csv, логика присвоения коэффициентов и, как следствие, x_data и y_data массивы, передаваемые в нейронку, неизменны - ответы нейронной сети способны разниться. Такое нечасто, но случается. Автор совершенно не мнит себя спецом в деле построения топологии нейронных сетей и, таким образом, с удовольствием выслушает любые комментарии в контексте сказанного.
Если коменты будут. Если нет - попросту всех с наступающим Новым Годом.