Вопрос

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

Мой подход заключается в построении сети из 385 нейронов:На доске шесть уникальных шахматных фигур и 64 поля.Итак, для каждого поля мы берем 6 нейронов (по 1 на каждый фрагмент).Если есть белый фрагмент, входное значение равно 1.Если есть черная фигура, то значение равно -1.И если в этом поле нет фрагмента такого рода, то значение равно 0.В дополнение к этому у игрока должен быть 1 нейрон для перемещения.Если очередь белых, входное значение равно 1, а если очередь черных, то значение равно -1.

Я думаю, что конфигурация нейронной сети неплохая.Но главной части не хватает:Как я могу реализовать эту нейронную сеть на языке кодирования (напримерДельфы)?Я думаю, что вначале веса для каждого нейрона должны быть одинаковыми.Затем, в зависимости от результата матча, следует скорректировать веса.Но как?Я думаю, мне следует позволить двум компьютерным игрокам (оба используют мой движок) играть друг против друга.Если белые выигрывают, черные получают обратную связь о том, что их веса не очень хороши.

Поэтому было бы здорово, если бы вы помогли мне внедрить нейронную сеть в язык программирования (лучше всего было бы Delphi, в противном случае псевдокод).Заранее спасибо!

Это было полезно?

Решение

Был там, делал это.Поскольку в вашей проблеме нет непрерывности (значение позиции не тесно связано с другой позицией только с 1 изменением значения одного входного сигнала), вероятность того, что NN сработает, очень мала.И этого никогда не происходило в моих экспериментах.

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

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

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

Другие советы

На случай, если кто-то случайно найдет эту страницу.Учитывая то, что мы знаем сейчас, то, что предлагает ФП, почти наверняка возможно.Фактически нам удалось сделать это для игры с гораздо большим пространством состояний — Го ( https://deepmind.com/alpha-go ).

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

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

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

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

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

Я пытался создать и обучить ЭНН играть в крестики-нолики, когда мне было 16 лет или около того...и я потерпел неудачу.Я бы предложил сначала попробовать такую простую игру.

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

Ваши варианты, как я их вижу:

  • Разработайте эвристическую функцию для оценки состояния платы и обучите сеть этому.Но возникает вопрос, зачем вообще использовать ИНС, если можно просто использовать свою эвристику.

  • Используйте какой-нибудь статистический показатель, например «Сколько игр выиграли белые или черные на этой конфигурации доски?», что даст вам значение пригодности между белыми и черными.Трудность здесь заключается в объеме обучающих данных, необходимых для размера вашего проблемного пространства.

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

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

Это возможно, но ни в коем случае не тривиально.

https://erikbern.com/2014/11/29/deep-learning-for-chess/

Для тренировки своей функции оценки он использовал много вычислительной мощности.

Подводя общий итог, можно сделать следующее.Ваша функция оценки представляет собой NN прямого распространения.Пусть матричные вычисления приведут к скалярному результату, оценивающему, насколько хорош ход.Входным вектором для сети является состояние доски, представленное всеми фигурами на доске, например, белая пешка — 1, белый конь — 2…а пустое пространство равно 0.Пример входного вектора состояния платы представляет собой просто последовательность цифр 0–12.Эту оценку можно обучить с использованием гроссмейстерских игр (доступных, например, в базе данных fics) для многих игр, сводя к минимуму потерю между тем, что, согласно текущим параметрам, является самой высокой оценкой, и тем ходом, который сделали гроссмейстеры (который должен иметь самую высокую оценку).Это, конечно, предполагает, что ходы гроссмейстера правильны и оптимальны.

Пришел сюда, чтобы сказать то, что сказал Сайлас.Используя минимаксный алгоритм, вы можете рассчитывать на возможность заглянуть вперед на N ходов.Используя обрезку альфа-бета, вы можете расширить это теоретически до 2*N ходов, но более реалистично до 3*N/4 ходов.Нейронные сети здесь действительно уместны.

Хотя, возможно, можно было бы использовать генетический алгоритм.

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

Выходной слой должен (в той или иной форме) указать фигуру для перемещения и место, куда нужно переместиться.

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

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

Прочтите блондинка24: http://www.amazon.co.uk/Blondie24-Playing-Kaufmann-Artificial-Intelligence/dp/1558607838.

Вместо шахмат речь идет о шашках, но принципы те же.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top