Pergunta

Eu quero jogar Tic-tac-dedo do pé usando uma rede neural artificial. Minha configuração da rede é a seguinte: Para cada um dos campos 9, utilizo 2 neurónio de entrada. Então, eu tenho 18 neurônios de entrada, é claro. Para cada campo, eu tenho um neurônio de entrada para um pedaço de jogador 1 e 1 neurônio por um pedaço de Jogador 2. Além disso, eu tenho um neurônio de saída que dá uma avaliação da posição atual diretoria. Quanto maior o valor de saída é, o melhor é a posição para o jogador 1. Quanto menor ela for, melhor é para o jogador 2.

Mas o meu problema é: Como eu poderia código que rede neural? Minha idéia era usar um Array [1-18] para os neurônios de entrada. Os valores desta gama são os pesos de entrada. O que eu ia a pé através da matriz usando um loop. Sempre que há um neurônio para ser ativado, eu adicionar o peso para o valor de saída. Assim, o valor de saída é a soma dos pesos dos neurónios de entrada activados:

Output = SUM(ActivatedInputNeurons)

Você acha que isso é uma boa maneira de programar a rede? Você tem ideias melhores?

Eu espero que você possa me ajudar. Agradecemos antecipadamente!

Foi útil?

Solução

Bem, você tem uma camada de entrada de 18 neurônios, e uma camada de 1 neurônio de saída. Isso está ok. No entanto, você precisa dar o seu rede neural a oportunidade de colocar as entradas em relação. Para isso, você precisa de pelo menos uma camada intermediária. Gostaria de propor a utilização de 9 neurónios na camada intermédia. Cada um destes deve ser ligado a cada um neurónio de entrada, e o neurónio de saída deve ser conectado a cada intermediário. Cada tal ligação tem um peso, e cada neurónio tem um nível de activação.

Em seguida, você passar por todos os neurônios, uma camada de cada vez. A camada de entrada é apenas activado com o estado placa. Para todos os outros neurônios, você passar por todas as suas respectivas conexões e soma sobre o produto de nível de ativação do neurônio conectado e o peso da conexão. Finalmente, você calcula o nível de ativação através da aplicação de uma função sigmóide sobre esta soma.

Este é o princípio de funcionamento. Agora, você precisa treinar esta rede para obter melhores resultados. Existem vários algoritmos para isso, você vai ter que fazer algum googling e leitura. Finalmente, você pode querer ajustar o número de neurônios e camadas quando os resultados não conseguir convencer o suficiente rápido. Por exemplo, é possível reduzir a camada de entrada para 9 neurónios e activá-los com um para um X e -1 para uma O. Talvez a adição de outra camada rendimentos melhores resultados intermédios, ou o aumento do número de neurónios de uma camada.

Outras dicas

Eu particularmente não entendo como você espera obter de um resumo da situação placa de fora de um neurônio de saída. Eu mais olhar para ter:

    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

numa rede totalmente ligada, isto é, 81 pesos. Em seguida, treinar os neurônios de saída para a conveniência relativa de jogar nessa posição.

Tenha um olhar em meu projeto Tic. Eu já resolveu este problema com ambas as redes neurais e algoritmos genéticos. O código fonte está livremente disponível.

http://www.roncemer.com / tic-tac-toe-an-experiência-in-machine-learning

Eu acho que você deve implementar um 'tradicional' feed-forward ANN usando funções de transferência, como que lhe permite treiná-lo usando back-propagação. O código para estes geralmente acaba sendo algumas linhas de código, algo como isto:

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)

Este é um projeto excelente arranque para AI codificação, mas chegando com uma solução completa será maneira de grande de uma resposta para SO.

Tal como acontece com a maioria dos softwares, eu recomendo o uso de um projeto orientado a objetos. Por exemplo: definir uma classe Neuron que tem entradas, pesos, e uma função de saída. Em seguida, crie várias dessas Neuron objetos a fim de construir sua rede.

Veja o artigo da Wikipedia sobre redes neurais artificiais para um bom ponto de partida.

Boa sorte com o código! Soa como um monte de diversão.

Não é uma resposta directa à sua pergunta, mas você deve ter um olhar para o seguinte quadro / ferramenta: SNNS ou sua contraparte Java JavaNNS . Tenho certeza de que lá você vai encontrar uma resposta para sua pergunta.

Depois de adicionar os pesos, você precisa para normalizar a soma usando uma função, as pessoas geralmente usam TANH, se você quiser permitir que os números negativos.

Editar:

Aqui está um java multicamadas perceptron implementação que trabalhei há alguns anos. este foi usado para damas, mas com menos insumos você pode usá-lo para damas também.

Além disso, você precisa provavelmente descobrir uma maneira de ensiná-lo a ganhar, mas isso é outro problema

Você vai economizar tempo se você usar a biblioteca rede neural como FANN ou Neuroph.

Uma maneira de codificar a sua entrada é de 9 neurônios de entrada. A saída também é bom para ser 9 neurónios. O que não vejo nos outros replays é o tamanho da camada escondida. Eu suponho que você está indo para usar MLP com 3 camadas tradicionais. O tamanho da camada escondida é sempre mistério. Eu tentaria 10 neurônios ocultos.

Se a função de transferência é sigmóide você pode codificar entrada da seguinte forma:

0.0 - jogador O

.

1.0 -. X jogador

0.5 -. Vazio

A saída da ANN será de 9 números reais. Neste caso, algumas das células já estará ocupada. Você pode procurar o valor de saída mais alta que corresponde a uma célula vazia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top