2009-04-17 4 views
25

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

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

Output = SUM(ActivatedInputNeurons) 

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

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

+4

Пахнет домашней работой –

+14

@ Бинарный: Просто потому, что это домашнее задание не означает, что это вопрос, на который не следует отвечать на StackOverflow. Это было обсуждено в основном в потоках SOFAQ. Вы можете принять дополнительные меры предосторожности от предоставления чистого программного кода, которое можно принять и включить, но вы все равно можете ответить, направляя OP по правильному пути. – TheTXI

+3

@Binary Worrier: Нет, это не домашнее задание. У меня нет компьютерных наук в школе. : p – caw

ответ

14

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

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

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

0

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

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

См. Статью в Википедии о artificial neural networks для хорошей отправной точки.

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

0

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

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

Here is a java multilayer perceptron реализация, что я работал на несколько лет назад. этот был использован для шашек, но с меньшими затратами вы можете использовать его и для шашек.

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

+0

Есть ли шанс, что вы можете обновить ссылку?Кажется, сейчас нет. –

+0

Я не могу обновить MY link, я давно удалил эти репозитории. С другой стороны, существует множество реализаций. этот выглядит прилично для меня: http://code.google.com/p/digitrecog/source/browse/trunk/src/backproped/JavaMLP.java?spec=svn44&r=44 – mkoryak

0

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

+0

Спасибо! Оба, кажется, очень хорошие ссылки. К сожалению, у меня нет ни C++, ни Java. У меня только Delphi/Pascal. – caw

+0

Вы должны быть в состоянии найти примеры того, как все сделано. Наконец, вы хотите узнать или сделать smthg с помощью ANN, поэтому язык является вторичным, не так ли? – paweloque

3

Я думаю, что вы должны реализовать «традиционный» feed-forward 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) 
+0

Большое спасибо. Но это будет код для многослойных нейронных сетей, не так ли? – caw

+0

Да. Вы не сможете вычислить полезный балл только с персептроном (один слой). Я делал ту же самую проблему в университете, и я не мог обучить даже многоуровневую сеть на tic-tac-toe, используя обратное распространение. – FryGuy

5

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

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

+1

Немного о последующих действиях: Я думаю, вы можете использовать 9 входных нейронов вместо 18, потому что вы можете использовать 0 для «незанятых», 1 для «занятых» и -1 для «занятых противником». – chaos

+0

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

0

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

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

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

0,0 - O-проигрыватель.

1.0 - X игрок.

0,5 - Пустой.

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

Смежные вопросы