Подтвердить что ты не робот

Как закодировать искусственную нейронную сеть (Tic-tac-toe)?

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

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

Output = SUM(ActivatedInputNeurons)

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

Надеюсь, ты поможешь мне. Спасибо заранее!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

    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 вес. Затем тренируйте выходные нейроны относительно относительной желательности игры в этом положении.

Ответ 3

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

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)

Ответ 5

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

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

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

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

Ответ 6

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

изменить

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

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

Ответ 7

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

Ответ 8

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

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

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

0.0 - O плеер.

1.0 - X-плеер.

0.5 - Пусто.

Выход ANN будет 9 действительных чисел. В этом случае некоторые из ячеек будут заняты уже. Вы можете найти самое высокое выходное значение, которое соответствует пустой ячейке.