Как закодировать искусственную нейронную сеть (Крестики-нолики)?[закрыто]

StackOverflow https://stackoverflow.com/questions/761216

Вопрос

Я хочу сыграть в крестики-нолики, используя искусственную нейронную сеть.Моя конфигурация сети следующая:Для каждого из 9 полей я использую 2 входных нейрона.Итак, у меня, конечно, 18 входных нейронов.Для каждого поля у меня есть 1 входной нейрон для части Игрока 1 и 1 нейрон для части Игрока 2.Кроме того, у меня есть 1 выходной нейрон, который дает оценку текущего положения доски.Чем выше выходное значение, тем лучше позиция Игрока 1.Чем оно ниже, тем лучше для Игрока 2.

Но моя проблема:Как я мог закодировать эту нейронную сеть?Моя идея заключалась в том, чтобы использовать массив [1-18] для входных нейронов.Значения этого массива являются входными весами.Я бы прошел через массив, используя цикл.Всякий раз, когда нужно активировать нейрон, я добавляю вес к выходному значению.Таким образом, выходное значение представляет собой сумму весов активированных входных нейронов:

Output = SUM(ActivatedInputNeurons)

Как вы думаете, это хороший способ программирования сети?У вас есть идеи получше?

Я надеюсь, что вы можете мне помочь.Заранее спасибо!

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

Решение

Итак, у вас есть входной слой из 18 нейронов и выходной слой из 1 нейрона.Это нормально.Однако вам нужно дать вашей нейронной сети возможность сопоставить входные данные.Для этого вам понадобится хотя бы один промежуточный слой.Я бы предложил использовать 9 нейронов в промежуточном слое.Каждый из них должен быть подключен к каждому входному нейрону, а выходной нейрон должен быть подключен к каждому промежуточному элементу.Каждая такая связь имеет вес, а каждый нейрон — уровень активации.

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

Это принцип работы.Теперь вам нужно обучить эту сеть, чтобы получить лучшие результаты.Для этого существует несколько алгоритмов, вам придется немного погуглить и почитать.Наконец, вы можете захотеть отрегулировать количество нейронов и слоев, если результаты не станут достаточно быстрыми.Например, вы можете уменьшить входной слой до 9 нейронов и активировать их +1 для X и -1 для O.Возможно, добавление еще одного промежуточного слоя даст лучшие результаты или увеличение количества нейронов в слое.

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

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

    I I I             O O O
    I I I      x      O O O
    I I I             O O O
9 input neurons  9 output neurons

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

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

http://www.roncemer.com/tic-tac-toe-an-experiment-in-machine-learning

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

SetupInputs();
for (l = 1 .. layers.count)
    for (i = 0 .. layers[l].count)
        sum = 0
        for (j = 0 .. layers[l-1].count)
            sum += layers[l-1][j] * weights[l-1][j]
        layers[l][i] = TransferFunction(sum)

Это отличный стартовый проект для кодирования ИИ, но создание полного решения будет большим ответом для SO.

Как и в большинстве программ, я рекомендую использовать объектно-ориентированный дизайн.Например:Определите Neuron класс, который имеет входные данные, веса и выходную функцию.Затем создайте несколько таких Neuron объекты для построения вашей сети.

Посмотрите статью в Википедии о искусственные нейронные сети для хорошей отправной точки.

Удачи с кодом!Звучит очень весело.

Это не прямой ответ на ваш вопрос, но вам следует взглянуть на следующую структуру/инструмент: СННС или его Java-аналог JavaNNS.Я почти уверен, что там вы найдете ответ на свой вопрос.

После добавления весов вам необходимо нормализовать сумму с помощью функции. Люди обычно используют TANH, если вы хотите разрешить отрицательные числа.

редактировать:

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

Кроме того, вам, вероятно, нужно найти способ научить его побеждать, но это уже другая проблема.

Вы сэкономите время, если воспользуетесь библиотекой нейронных сетей, такой как FANN или Neuroph.

Один из способов кодирования входных данных — 9 входных нейронов.Также хорошо, что на выходе будет 9 нейронов.Чего я не вижу в других повторах, так это размера скрытого слоя.Я полагаю, вы собираетесь использовать MLP с традиционными тремя слоями.Размер скрытого слоя всегда остается загадкой.Я бы попробовал 10 скрытых нейронов.

Если передаточная функция сигмовидная, вы можете закодировать ввод следующим образом:

0.0 - О игрок.

1.0 - X игрок.

0,5 – Пусто.

Результатом ИНС будут 9 действительных чисел.В этом случае часть ячеек уже будет занята.Вы можете найти наибольшее выходное значение, соответствующее пустой ячейке.

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