Atualmente, estou escrevendo um mecanismo para jogar um jogo de cartas, pois ainda não existe um mecanismo para esse jogo em particular.
Espero poder introduzir uma rede neural no jogo depois e fazer com que ela aprenda a jogar.
Estou escrevendo o mecanismo de forma que seja útil para um jogador de IA. Existem pontos de escolha e, nesses pontos, é apresentada uma lista de opções válidas. A seleção aleatória seria capaz de jogar o jogo (embora não esteja bem).
Aprendi muito sobre redes neurais (principalmente NEAT e HyperNEAT) e até construí minha própria implementação. Ainda não tenho certeza da melhor maneira de criar uma IA que possa levar em conta todas as variáveis em um desses tipos de jogos. Existe uma abordagem comum? Sei que Keldon escreveu uma boa IA para o RftG, que possui uma complexidade decente, não sei como ele conseguiu criar uma IA desse tipo.
Algum conselho? Isso é viável? Existem bons exemplos disso? Como as entradas foram mapeadas?
EDIT: Procurei on-line e aprendi como as redes neurais funcionam e, geralmente, como elas pertencem ao reconhecimento de imagens ou à orientação de um agente simples. Não tenho certeza se ou como o aplicaria para fazer seleções com cartões com uma sinergia complexa. Qualquer direção em que eu deveria estar olhando seria muito apreciada.
Sobre o jogo: O jogo é semelhante ao Magic: The Gathering. Há um comandante que tem saúde e habilidades. Os jogadores têm um pool de energia que eles usam para colocar lacaios e feitiços no tabuleiro. Lacaios têm vida, valores de ataque, custos, etc. Os cards também possuem habilidades, que não são facilmente enumeradas. Cartas são jogadas da mão, novas cartas são retiradas de um baralho. Todos esses aspectos seriam úteis para a rede neural considerar.
fonte
Respostas:
Eu acho que você levanta uma boa pergunta, especialmente o WRT, sobre como as entradas e saídas de NNs são mapeadas para a mecânica de um jogo de cartas como o MtG, onde as ações disponíveis variam muito de acordo com o contexto.
Não tenho uma resposta realmente satisfatória para oferecer, mas joguei a IA de Keldon's Race for the Galaxy NN - concordo que é excelente - e observei como ele resolveu esse problema.
O código mais recente da IA do Keldon agora é pesquisável e navegável no github .
O código ai está em um arquivo . Ele usa 2 NNs distintos, um para "avaliar cartas de mão e ativas" e outro para "prever escolhas de papéis".
O que você notará é que ele usa uma quantidade razoável de código não NN para modelar a mecânica do jogo. Muito uma solução híbrida.
O mapeamento do estado do jogo na avaliação NN é feito aqui . Vários recursos relevantes são codificados com um código a quente, por exemplo, o número de mercadorias que podem ser vendidas nesse turno.
Outro excelente estudo de caso no mapeamento de um jogo complexo para um NN é o Starcraft II Learning Environment criado por Deepmind em colaboração com a Blizzard Entertainment. Este artigo fornece uma visão geral de como um jogo de Starcraft é mapeado em um conjunto de recursos que um NN pode interpretar e como ações podem ser emitidas por um agente do NN para a simulação do jogo.
fonte
Isso é completamente viável, mas a maneira como as entradas são mapeadas dependeria muito do tipo de jogo de cartas e de como é jogado.
Vou levar em consideração algumas possibilidades:
Deseja que a Rede Neural aprenda com os dados coletados ou aprenda por conta própria? Se por si só, como? Se você coletar dados de si mesmo jogando o jogo dezenas ou centenas de vezes, alimentá-lo na Rede Neural e aprender com você, então você está fazendo algo chamado "Clonagem Comportamental". No entanto, se você quiser que o NN aprenda por conta própria, você pode fazer isso de duas maneiras:
a) Aprendizado por Reforço - RL permite que a Rede Neural aprenda jogando contra si mesma muitas vezes.
b) NEAT / Algoritmo Genético - O NEAT permite que a Rede Neural aprenda usando um algoritmo genético.
No entanto, novamente, para ser mais específico sobre como as entradas e saídas da Rede Neural devem ser codificadas, eu precisaria saber mais sobre o jogo de cartas em si.
fonte
Você definitivamente gostaria que sua rede soubesse informações cruciais sobre o jogo, como quais cartões o agente de IA tem (seus valores e tipos), pool de mana, quantas cartas na mesa e seus valores, número de turno e assim por diante. Essas coisas você deve descobrir por si mesmo, a pergunta que você deve fazer é "Se eu adicionar esse valor para inserir como e por que ele melhorará meu sistema". Mas a primeira coisa a entender é que a maioria dos NNs é projetada para ter um tamanho de entrada constante, e eu diria que isso é importante neste jogo, pois os jogadores podem ter uma quantidade diferente de cartas na mão ou na mesa. Por exemplo, você deseja que o NN saiba quais cards possui, vamos assumir que o jogador pode ter no máximo 5 cards em sua mão e cada card pode ter 3 valores (mana, ataque e saúde), para que você possa codificá-lo como 5 * 3 vetores, onde os três primeiros valores representam o cartão número um e assim por diante. Mas e se o jogador tiver atualmente 3 cartas, uma abordagem simples seria atribuir zeros às últimas 6 entradas, mas isso pode causar problemas, já que algumas cartas podem ter 0 custo de mana ou 0 ataque. Então, você precisa descobrir como resolver esse problema. Você pode procurar modelos NN que possam lidar com tamanho de entrada variável ou descobrir como codificar entrada como um vetor de tamanho constante.
Em segundo lugar, as saídas também são vetores de tamanho constante. No caso desse tipo de jogo, pode ser um vetor que codifica as ações que o agente pode executar. Então, digamos que temos três ações: colocar uma carta, pular a vez e conceder. Portanto, pode ser um codificador quente, por exemplo, se você tiver 1 0 0 de saída, isso significa que o agente deve colocar algum cartão. Para saber qual cartão ele deve colocar, você pode adicionar outro elemento à saída que produzirá um número no intervalo de 1 a 5 (5 é o número máximo de cartões na mão).
Mas a parte mais importante do treinamento de uma rede neural é que você precisará criar uma função de perda adequada para sua tarefa. Talvez as funções de perda padrão, como perda ao quadrado médio ou L2, sejam boas; talvez você precise alterá-las para atender às suas necessidades. Esta é a parte em que você precisará fazer uma pesquisa. Eu nunca trabalhei com o NEAT antes, mas, como entendi corretamente, ele usa algum algoritmo genético para criar e treinar NN, e o GA usa alguma função de aptidão para selecionar um indivíduo. Então, basicamente, você precisará saber qual métrica usará para avaliar o desempenho do seu modelo e, com base nessa métrica, alterará os parâmetros do modelo.
PS. É possível resolver esse problema com a rede neural, no entanto, as redes neurais não são mágicas e não são a solução universal para todos os problemas. Se seu objetivo é resolver esse problema, eu também recomendo que você explore a teoria dos jogos e sua aplicação na IA. Eu diria que resolver esse problema exigiria conhecimento complexo de diferentes campos da IA.
No entanto, se seu objetivo é aprender sobre redes neurais, recomendo executar tarefas muito mais simples. Por exemplo, você pode implementar o NN que funcionará no conjunto de dados de referência, por exemplo, NN que classificará dígitos do conjunto de dados MNIST. A razão para isso é que muitos artigos foram escritos sobre como fazer a classificação neste conjunto de dados e você aprenderá muito e aprenderá mais rapidamente ao implementar coisas simples.
fonte
Sim. Isso é viável.
Visão geral da questão
O objetivo do projeto do sistema parece obter uma vantagem estratégica vencedora ao empregar uma ou mais redes artificiais em conjunto com um mecanismo de jogo de cartas.
A pergunta mostra um conhecimento geral dos conceitos básicos do jogo, conforme descrito em Morgenstern e na teoria dos jogos de von Neuman .
Outras características do jogo podem ou não ser tão óbvias.
Dicas de abordagem comum
Existe uma abordagem comum para o mapeamento de entradas e saídas, mas há muito a explicar em uma resposta do Stack Exchange. Estes são apenas alguns princípios básicos.
O trabalho de reconhecimento de imagem é apenas remotamente relacionado, muito diferente do jogo de cartas para ser usado diretamente, a menos que você precise reconhecer os cartões de uma imagem visual. Nesse caso, pode ser necessário o LSTM para ver o que os outros jogadores escolheram para os movimentos. Aprender estratégias vencedoras mais do que provavelmente se beneficiaria dos projetos MLP ou RNN, ou de um de seus projetos derivativos de redes artificiais.
O que uma rede artificial faria e exemplos de treinamento
O principal papel das redes artificiais desses tipos é aprender uma função a partir de dados de exemplo. Se você tem as seqüências de movimentação de jogos reais, esse é um ótimo trunfo para o seu projeto. Um número muito grande deles será muito útil para o treinamento.
Como você organiza os exemplos e se e como os rotula vale a pena considerar, no entanto, sem as regras do jogo de cartas, é difícil dar uma direção confiável. Se há parceiros, se é baseado em pontuação, se o número de movimentos para uma vitória e uma dúzia de outros fatores fornecem os parâmetros do cenário necessário para tomar essas decisões.
Estudar-se
O principal conselho que posso dar é ler, não muitos artigos gerais na Web, mas ler alguns livros e alguns dos documentos que você entender sobre os tópicos acima. Em seguida, encontre um código que você possa baixar e tente depois de entender a terminologia o suficiente para saber o que baixar.
Isso significa que as pesquisas de livros e acadêmicas têm muito mais probabilidade de direcioná-lo na direção certa do que as pesquisas gerais na Web. Existem milhares de posers no espaço geral da web, explicando os princípios da IA com um grande número de erros. Os editores de livros e artigos acadêmicos são mais exigentes com a devida diligência em seus autores.
fonte