Tuesday, 20 March 2018

Estratégia reversi ai


Jogo AI. Reversi. *;
Este exemplo usa tanto o algoritmo Minimax quanto as regras que favorecem a região para escolher seus movimentos. O algoritmo Minimax fornece uma maneira de olhar vários movimentos à frente, ao mesmo tempo em que maximiza a pontuação da AI e minimiza a pontuação do jogador humano. Definir regiões estratégicas sobre o quadro molda a capacidade da IA ​​de avaliar os riscos de movimento.
O Minimax é um algoritmo recursivo que avalia repetidamente pontuações ao longo de séries temporais, fazendo escolhas com base nas pontuações máximas durante alguns passos, ao mesmo tempo que escolhe as pontuações mínimas de outros. Quando aplicado a jogos de estratégia, o Minimax explora todos os movimentos possíveis do primeiro jogador, simulando esses movimentos e explorando os possíveis movimentos do segundo jogador em resposta. O algoritmo busca a menor pontuação durante as respostas simuladas do segundo jogador, e as maiores pontuações durante seus próprios movimentos simulados, descobrindo quais movimentos maximizarão sua própria pontuação e minimizando o adversário.
Figura 1. Explorar os possíveis movimentos cria uma árvore de decisão. Cada nível da árvore representa o turno do jogador ou do oponente. O algoritmo Minimax determina os movimentos que renderão a pontuação máxima para o jogador e a pontuação mínima para o adversário.
John von Neumann foi creditado pelo Minimax Theorum descrito em 1928. Basicamente, em qualquer jogo de soma zero (ou seja, onde o ganho de cada jogador é exatamente proporcional à perda do oponente) e onde cada jogador pode conhecer todos os movimentos possíveis em qualquer turno dado, uma estratégia deve existir para ambos os jogadores, o que maximiza seu ganho e minimiza sua perda.
Nesta implementação do Minimax, usei duas funções recursivas: uma para simular possíveis movimentos n passos à frente e outra para calcular qual movimento produz o melhor resultado.
A função base simMoves () começa criando o nó raiz de uma árvore de decisão, mRoot. A partir daí, todos os movimentos possíveis que o computador pode fazer são passados ​​para a segunda função simMoves () e submetidos a todos os movimentos possíveis que o jogador humano pode fazer em resposta, que são submetidos a todos os possíveis movimentos que o computador pode fazer em resposta,. e assim por diante para n passos à frente.
Observe como uma matriz de tabuleiro temporária é criada para cada movimento simulado. Esses esquadramentos temporários contêm os movimentos simulados para avaliação em cada etapa da recursão.
Depois que a árvore dos movimentos simulados é feita, um segundo conjunto de funções recursivas é usado para percorrer a árvore para trás, desde os nós mais jovens, até o nó raiz, calculando o movimento com os melhores efeitos futuros (a melhor pontuação ).
O gigante para loop na base findBestMove () funciona implementando uma estratégia de script adicional para favorecer algumas áreas, evitando outros (eu estou chamando regiões de risco).
Regiões de Risco.
Além do Minimax, esta implementação do reversi também inclui regiões de risco definidas no quadro:
Figura 2. Regiões arbitrárias que representam riscos de movimento muito gerais. Normalmente, as Regiões 3 e 5 são áreas estratégicas muito valiosas. Descobri que a Região 4 é uma fraqueza real no exemplo 1, muitas vezes tornando fácil para mim tomar os cantos.
As Regiões 3 e 5 são imobiliárias cobiçadas no armário Reversi, porque é mais difícil para os adversários ameaçarem suas peças. Especialmente para a Região 5. Essas duas regiões também facilitam a tomada de um grande número de peças de oponente de uma só vez. Assim, o AI neste exemplo é encorajado a colocar peças nessas regiões sempre que possível.
Em contraste, as Regiões 2 e 4 são um território arriscado porque os oponentes ganham acesso às Regiões 3 e 5 depois de terem lugar aqui. Assim, a AI é desencorajada de ocupar essas duas regiões.
Para calcular o melhor movimento, o número de possíveis peças adversas tomadas é comparado ao viés das regiões de risco envolvidas.
Observe que este exemplo permite variar a quantidade de polarização das regiões de risco:
Figura 3. Estas são as opções padrão. O movimento adiante é limitado entre 2 e 10. As bordas (Região 3), Canais (Região 5) e Região 4 são limitadas entre -50 a +50.
O engraçado é que você pode mudar esses valores no meio de um jogo!

Estratégia Reversi ai
Obter através da App Store Leia esta publicação em nosso aplicativo!
Idéias para AI simples e útil para othello game (aka: reversi)
Oi Onde posso encontrar algumas informações sobre como implementar um AI para este jogo. Nunca fiz uma IA de qualquer tipo antes.
Procurando recomendações para melhores e simples abordagens Obrigado.
O algoritmo negamax ou minimax é simples e deve funcionar decentemente.
Para chegar a um jogo mais alto, você precisará adicionar alguma heurística, mas uma simples negação de dois movimentos é trivial para implementar e rápido.
Como em quase todos os jogos de tabuleiro, você precisa avaliar uma boa posição e (b) procurar movimentos que levem a posições que são boas para você.
Othello é um pouco diferente de outros jogos, como xadrez em que (a) é um pouco difícil. Você não pode facilmente saber quais posições são boas porque as tabelas podem se transformar rapidamente. No entanto, se você está apenas começando, uma boa heurística é.
Altamente valor em campos de canto Altamente penalize tomando os campos ao lado dos cantos Valor outras telhas de borda mais altas do que as telhas restantes Tente minimizar o número de movimentos que o oponente pode fazer.
Para (b) você pode usar um algoritmo de pesquisa de árvore de jogo padrão, como Minimax ou Alpha-Beta Pruning. Existem muitos outros para escolher.
Michael Buro, que escreveu o Logistello, um dos (mais ou menos) othello que joga programas, escreveu vários artigos fascinantes sobre o assunto. Para dizer o quão boa é uma posição, ele compara os padrões no quadro (cada classificação, cada arquivo, todos os padrões de formas diagonais) com padrões em um banco de dados previamente aprendido pelo programa. Para procurar resultados desejáveis, ele usa um algoritmo de busca chamado Multi-Prob Cut.
Links que provavelmente serão úteis:
Russel / Norvig "Artificial Intelligence - Uma abordagem moderna" é um bom ponto de partida para aprender sobre a teoria dos jogos, ai, heurísticas e coisas relacionadas. Veja aqui: aima. cs. berkeley. edu/
Bem, na verdade, Othello é um exemplo para um jogo, onde Minmax / Negamax não funciona muito bem, porque você precisa de heurísticas para avaliar estados de jogo intermediários, o que é difícil em Othello. Dê uma olhada na Monte Carlo Tree Search (MCTS). Isso deve funcionar bem. Na verdade, implementei um mecanismo muito simples inspirado pelo próprio MCTS e vencer todos os AIs online que eu testei até agora (enquanto o AI faz um movimento dentro de um tempo muito curto: 2sec). O mecanismo funciona da seguinte forma: (a) obtenha todos os movimentos possíveis para o jogador atual (b) escolheu um dos aleatórios (c) jogue alternadamente o jogo com movimentos totalmente aleatórios (válidos) até o jogo terminar. (d) valorar o resultado do jogo (e) adicionar este valor ao resultado total do movimento escolhido no passo (b) (f) adicionar 1 ao número de visitas para o movimento escolhido na etapa (b) (g) saltar para ( b) se houver tempo restante (eu dei o algoritmo 2sec) (h) faça o movimento com a pontuação média mais alta (total / número de visitas)
Algumas otimizações são bastante óbvias, como fazer o movimento imediatamente, se houver apenas um que seja válido ou limitar o número de simulações aleatórias, além da restrição de tempo (como 2000 por movimento válido ou assim).
Novamente, isso não é MCTS, mas apenas a última parte do MCTS, mas funciona bastante bem.
O código fonte está disponível aqui para o Logistello, que foi o melhor jogo da cidade há dez anos.

geeky. blogger.
ainda outro blog sobre informática, tecnologia, programação e internet.
Domingo, 18 de março de 2007.
Inteligência Artificial no Jogo Reversi / Othello.
1. Informações completas: nenhuma informação do jogo está oculta.
2. Determinista: a ação determina a mudança dos estados do jogo, sem influência aleatória.
3. Turn-based: facilita a vida;)
4. Tempo limitado: obviamente. Quem quer esperar uma hora apenas para uma pequena jogada no jogo?
Como conclusão, a ação B é a melhor opção de acordo com o algoritmo Minimax.
- mobilidade (o número de movimentos possíveis)
- o número de peças que não podiam ser lançadas pelo oponente (por exemplo: peças nos cantos)
54 comentários:
Hehehe..seperti membaca buku AI ^^. Maklum semester kemaren ujian AI. Ide ttg hal2 yang perlu diperhatikan dalam strategi, menarik juga.
hehehe, itu tulisan saya sendiri sih. jadi perlu dikasih saran dan kritik nih supaya ada peningkatan: D.
você pensou sobre a possibilidade de incluir heurística no algoritmo de busca? Que tipo de heurística você acha que será apropriada para othello?
Hmm nurut gw alfa-beta poda lebih ke arah teknik ato strategi. Tanpanya, maka ruang pencarian akan semakin lebar n dalam. Sedangkan heurística yang dipilih dapat membuat ruang pencarian lebih sempit dengan cara menelusuri langkah dengan nilai heurística "terbaik" (terbesar). Seperti halnya manhattan distância dalam N-puzzle. Gimana nurut kamu? Dalam othello yang kamu buat, heuristicnya apa?
Bagian akhir cukup rumit. Meski bagian awalnya menarik: D.
2. Pinggir yang tidak menyebabkan lawan dapet pojok.
3. Tengah yang tidak menyebabkan lawan dapet pinggir.
4. Tengah yang tidak menyebabkan lawan dapet pojok.
5. Tengah yang paling banyak dapetnya.
@ read_1: kalau begitu, dalam othello yang saya buat tidak ada heuristicnya karena função de avaliação cuma dilakukan pada "folha" saja, jadi tidak ada "bimbingan" dari manapun.
Bibibib .. ikut marathon match yuk bibibib ..
Banyak problemnya di sekitar game e a teoria dos jogos. Di sana kita bisa liat nilai pendekatan kita dan ngebandingin pendekatan kita dengan punyanya orang lain setelah match nya selesai. Coba di topcoder / longcontest /? Module = ViewActiveContests.
Bisa jadi ide tugas kuliah IF2251 tuh Bib, nama kuliahnya Strategi Algoritmik. Tapi masih pakai algoritma branch e bound dulu, belum dihubungkan dengan konsep AI.
oi boleh minta bantuan untuk AI? Saia kebingungan tugas ai ..
kalo berkenan hubungi halloboss @ yahoo.
pok huar bantuan coba AI?
jadi konsep mijki yahi ranjukla dingnom hubungi kalo whwhwhwhhee!
ntar waktu pinggir.
Eu acho que essa inteligência artificial é um grande passo na tecnologia, porque estamos criando coisas mais úteis dia a dia. Obrigado por compartilhar coisas assim.
Por sinal, acho que você inverteu os papéis no seu diagrama!
Em seguida, visite esta página web endossada e descubra como o contabilista Burnsville pode beneficiar você.
Prepare um pedido de número de identificação fiscal, se necessário.
Várias empresas de contabilidade permitem que os alunos atuem como estagiários.
Bela postagem. Aprendo algo totalmente novo.
e desafiador em sites que eu aguento todos os dias.
Sempre será emocionante ler o conteúdo de.
outros autores e usar um pouco de outros.
Olá! Eu estou no trabalho navegando em torno do seu blog.
meu novo iphone 4! Só queria dizer que adoro ler o seu blog e aguardo com expectativa todas as suas postagens!
Mantenha o trabalho fantástico!
Abaixo estão apenas alguns exemplos de onde a segregação de custos gera deduções fiscais significativas.
Depois de determinar que você está qualificado para um reembolso, o serviço de reembolso iniciará o processo.
ou você. O chefe de casa é preferível sobre a apresentação como único.
Uma dieta específica para perda de peso que recentemente viu um retorno de interesse é h.
- Opções de perda de peso CG. Introduza lentamente açúcares em quantidades moderadas de volta à sua dieta.
No entanto, o tipo HCG encontrado nas soluções de perda de peso HCG.
não são obtidos de mulheres ou de placentas, no entanto de células estéreis e limpas.
dentro de um laboratório de pesquisa.
- perifliciculum - faixa cirumferencial de colágeno adventicial fino que define a unidade.
longo prazo. Você está em uma situação onde você.
não pode estar entre seus amigos e se sentir livre por causa de seus problemas de cabelo.
Isso é necessário se os dois cônjuges são ou não responsáveis ​​pela dívida do IRS.
Então vou carregar todos os 20 desses para o meu host para corresponder.
meu nome de domínio que eu estava usando para o meu redirecionamento inicial.
Isso pode eventualmente levá-los aos tribunais, o que gastaria.
muito mais em vez de apenas contratar um.
equipe de especialistas financeiros, profissionais que.
Trabalharia duro para dar-lhes os relatórios de negócios, análises e avaliações de que precisavam.
No entanto, HCG é mais ativo quando as mulheres engravidam.
h - CG impede a desintegração de uma estrutura no ovário.
chamou o corpo lúteo, mantendo assim uma gravidez.
Você então leva seu BMR e multiplica-o com um fator de atividade, para determinar seu TDEE:
Sedentário (BMR X 1.
Empresa de serviços de limpeza em Riyadh da Equipe das melhores empresas em Riyadh trabalhadores de limpeza treinador técnico no mais alto nível شركة تسليك مجارى بالرياض.
شركة تنظيف خزنات بالرياض Empresa de serviços de limpeza em Riyadh da Equipe das melhores empresas em Riyadh técnico de trabalhadores de limpeza treinador no mais alto nível.
Empresas em Riyadh trabalhadores de limpeza treinador técnico no mais alto nível شركة تسليك مجارى بالرياض.
Chaquetas de canadá.
Jeans verdadera religión.
Nike outlet tienda.
Ralph lauren outlet.
Michael Kors outlet.
Zapatos nike sb.
Gafas de sol ray ban.
Burberry outlet en línea.
Por favor clique para jogar, se você quiser participar do casino online. Obrigado.
Chaquetas de canadá.
Jeans verdadera religión.
Nike outlet tienda.
Ralph lauren outlet.
Michael Kors outlet.
Zapatos nike sb.
Gafas de sol ray ban.
Burberry outlet en línea.
Por favor clique para jogar, se você quiser participar do casino online. Obrigado.

Reversi / Estratégia.
As peças do jogo são rápidas, facilmente e (muitas vezes) repetidamente, de modo que oferece pouca vantagem - e, de fato, geralmente se torna desvantajosa - para tentar ganhar a maioria das peças no início do jogo. Os cantos, a mobilidade, a jogada de borda, a paridade, o jogo final e a aparência formam os principais elementos da estratégia Othello bem-sucedida.
Fig. 1 O layout da placa.
O jogo tem 8x8 quadrados com a posição inicial mostrada. Cada quadrado tem um nome (o canto superior esquerdo é a1).
Fig. 2 Os quadrados nomeados.
Existem alguns quadrados que os jogadores nomearam:
As posições de canto, uma vez jogadas, permanecem imunes a flipping para o resto do jogo: assim, um jogador pode usar uma peça em um canto da placa para ancorar grupos de peças (começando com as bordas adjacentes) permanentemente. Então, capturar um canto, muitas vezes, prova uma estratégia efetiva quando surge a oportunidade. Mais geralmente, uma peça é estável quando, em todas as quatro direções, está em um limite, em uma linha cheia ou ao lado de uma peça estável da mesma cor.
Um oponente que joga com uma estratégia razoável não irá tão facilmente abandonar o canto ou qualquer outro bom movimento. Então, para alcançar esses bons movimentos, você deve forçar seu adversário a jogar movimentos que renunciam a esses bons movimentos. A melhor maneira de conseguir isso envolve a redução do número de movimentos disponíveis para o seu oponente. Se você restringir consistentemente o número de movimentos legais que seu oponente pode fazer, então, mais cedo ou mais tarde, eles terão que fazer um movimento indesejável. Uma posição ideal envolve ter todas as suas peças no centro cercadas pelas peças do seu oponente. Em tais situações, você pode ditar o que o seu adversário pode fazer.
Quando os movimentos parecem iguais em relação ao que move, você vai se deixar e seu oponente, jogar uma estratégia de peça mínima tenderá a vantagem, porque a minimização de seus discos tenderá a deixar menos discos para o seu oponente virar as jogadas subseqüentes do jogo. Não se deve jogar a estratégia de disco mínimo para um extremo, no entanto, como isso também pode levar rapidamente a uma falta de mobilidade.
Ao jogar peças nas bordas da placa pode parecer som (porque elas não podem ser viradas facilmente), isso muitas vezes pode ser prejudicial. Edge-peças podem ancorar flips que influenciam movimentos para todas as regiões da placa. Por isso, isso pode, mais cedo ou mais tarde, envenenar os movimentos mais tarde que você faz, fazendo com que você jogue várias peças e abra muitos movimentos para o seu oponente. No entanto, às vezes, jogar em uma borda em que seu oponente não pode responder facilmente deixará esse oponente com menos movimentos disponíveis.
O quadrado imediatamente diagonalmente adjacente ao canto (chamado de quadrado X), quando jogado no jogo inicial ou inicial, normalmente garante a perda desse canto. Jogar para os quadrados de borda adjacentes ao canto geralmente pode levar a armadilhas táticas envolvendo sacrificar um canto, ou simplesmente jogar a borda em uma seqüência específica.
Em geral, você deve evitar o jogo de borda no jogo do início e do meio, se possível, a menos que você possa obter concessões maiores em termos de mobilidade ou uma massa de peças imobilizáveis.
À medida que o jogo progride, as regiões da placa normalmente se separarão, onde nenhum dos lados pode evitar que o outro jogue arbitrariamente nessas regiões. Simplesmente contando o número de quadrados em uma região, pode-se verificar se existe um número ímpar ou igual de quadrados. No caso de um número ímpar de quadrados, jogando lá primeiro, você pode forçar seu oponente a jogar primeiro fora dessa região. Você conseguiu isso simplesmente jogando naquela região a qualquer momento, tem um número ímpar de quadrados disponíveis, e ao não tocar nela quando possui um número par de quadrados. Se você levar em consideração determinados quadrados em uma região que parece muito perigosa (como um quadrado X ou um quadrado de borda que leva a uma armadilha óbvia), então você pode forçar seu oponente a jogar em outro lugar ou a ocupar um desses quadrados perigosos.
Como em qualquer boa estratégia para xadrez ou para damas, um jogador não deve considerar apenas a situação atual no quadro. Para cada movimento que você considere, você deve considerar as possíveis respostas do seu oponente, depois as respostas subseqüentes que você fará para esses movimentos e assim por diante. Os aspectos da posição atual podem não permanecer relevantes alguns movimentos, portanto. Então, ao otimizar sua mobilidade, ganhar cantos ou qualquer outra coisa, você deve considerar a melhor maneira de fazer isso para o longo prazo, em vez de apenas para a próxima jogada.
Para o final (os últimos 20 movimentos do jogo), as estratégias geralmente mudarão. Técnicas especiais, como varredura, acesso e detalhes de movimento, podem ter um grande impacto no resultado do jogo. Nestes estágios tardios do jogo, não existem regras rígidas. O jogador experiente tentará olhar para frente e ter uma idéia do que levará ao melhor resultado final.

Othello AI.
Introdução.
Othello é um famoso jogo de estratégia de dois jogadores. Para este projeto, você desenvolverá partes de um programa inteligente que joga Othello. Nós fornecemos uma interface de usuário e a lógica do jogo (código que implementa as regras do jogo). Você escreverá as rotinas de busca e estratégia que permitirão que seu programa jogue o jogo contra um oponente humano.
O jogo de Othello.
Othello - também conhecido como Reversi - é um jogo de estratégia jogado em uma placa quadrada dividida em uma grade 8x8. As regras do jogo, juntamente com alguma noção de estratégia, são descritas na entrada da Wikipedia em Reversi; Se você não jogou Othello antes, ou não se lembra de como funciona, você deve, pelo menos, preparar as primeiras duas seções da entrada na Wikipédia.
Certifique-se de saber como jogar o jogo antes de tentar completar este programa; Isso vai lhe poupar muito tempo e esforço. Conforme fornecido, o programa já jogará um jogo de Othello com dois jogadores humanos, mas não permitirá que você jogue contra um jogador de computador até que você crie sua classe AI e escreva o código necessário na classe OthelloAIFactory (que é descrito mais tarde em o write-up).
Ponto de partida.
Todo o código que você precisará para completar o projeto está incluído no arquivo Zip. Grande parte do código é fornecida na forma compilada (ou seja,.class). Os arquivos. java fornecidos são bastante comentados.
Você só precisará trabalhar em duas aulas. Primeiro, você precisa criar uma nova classe que implemente a interface OthelloAI. Sua classe precisa ser nomeada de uma certa maneira; especificamente, o nome da classe precisa começar com OthelloAI, seguido do número de identificação do estudante de oito dígitos. Então, se o número de identificação do seu estudante é 12345678, sua classe deve ser chamada OthelloAI12345678. Isso é importante!
Uma vez que você criou sua classe AI, você também precisará escrever uma linha de código na classe OthelloAIFactory. Os comentários nessa classe irão explicar o que você precisa fazer e por quê.
Tudo o resto deve ser deixado como está.
Como executar o programa.
A classe Othello contém um método principal (). Para executar o programa, execute a classe Othello. A GUI fornecida é simples e direta de usar. Quando você executa Othello, uma janela aparecerá com uma área verde com o rótulo "Clique aqui para começar o jogo". Clique na área verde e você será solicitado a especificar se cada jogador deve ser controlado por um ser humano ou o computador; por enquanto, especifique humanos para ambos, já que você ainda não implementou sua IA. Ao clicar em OK, o jogo começa.
Um jogador controlado por humanos faz um movimento clicando duas vezes em um quadrado vazio na grade. Nem todos os quadrados constituem movimentos válidos; o cursor do mouse se transformará em uma "mão" quando um quadrado for válido, bem como quando você passa o mouse sobre um link no seu navegador. (Observe que o tratamento do mouse é um buggy de tad bit no momento, então você pode ter que mover o mouse dentro do quadrado um pouco para que o cursor mude.) O computador simplesmente se move quando é a vez. A GUI anima a colocação e encadernação de azulejos, para que você possa ver os movimentos "em ação". As mensagens de status exibem a pontuação e lembrá-lo de quem é o movimento.
Alguma terminologia necessária.
Você estará construindo uma inteligência artificial rudimentar (AI) para que o computador possa jogar um jogo de Othello contra você (ou contra outra instância de sua inteligência artificial). Sua tarefa para este projeto é bastante estreita, para que você possa ignorar a grande maioria do código que lhe oferecemos, a maioria dos quais implementa a GUI ou a lógica do jogo. Na verdade, a maior parte do código foi fornecida na forma compilada (ou seja,.class), e não como código fonte, por essa mesma razão.
Existem três abstrações principais que você precisa entender para escrever o código necessário para este projeto:
O conteúdo de cada célula de grade é representado pela enumeração OthelloCell, que possui três valores possíveis: OthelloCell. NONE (para uma célula vazia), OthelloCell. BLACK (para uma célula contendo uma telha preta) e OthelloCell. WHITE (para uma célula contendo uma telha branca). As localizações das células da grade são indicadas por pares ordenados (r, c), onde r é a linha e c é a coluna. Como é costume com arrays bidimensionais em Java, os números de linha e os números das colunas começam em 0, portanto, o intervalo de locais possíveis é (0, 0) a (7, 7). À medida que seu AI analisa as possibilidades, será necessário avaliar a situação atual do jogo. Coletivamente, chamamos a descrição da situação atual de um estado de jogo ou, mais tersamente, de um estado. Um estado de jogo é composto pelos conteúdos de cada célula de grade, a pontuação do jogo, uma bandeira indicando a sua vez e uma bandeira indicando se o jogo terminou. Uma vez que é possível ter dois AIs jogando uns contra os outros, faz sentido encapsular o AI em uma classe, de modo que dois objetos dessa classe possam ser criados e jogar uns contra os outros. Você implementará seu AI em uma classe que implemente a interface OthelloAI, que consiste em um método chamado chooseMove () que analisa todas as possibilidades e escolhe o próximo movimento da AI. Uma vez que um movimento é denotado pelo quadrado em que uma nova tela deve ser colocada, chooseMove () retorna um objeto do tipo OthelloMove, que contém um número de linha e número de coluna.
Árvores de jogo.
Você pode pensar nos possíveis estados do jogo como sendo organizados, conceitualmente, em uma espécie de árvore de busca chamada árvore de jogo. Cada nó da árvore contém um determinado estado de jogo g. Seus filhos são os estados do jogo que podem resultar de fazer cada movimento válido do estado g.
A raiz da árvore é o estado do jogo inicial - ou seja, o jogo Othello antes do primeiro movimento ser feito. Os filhos deste estado inicial são todos os estados possíveis que podem surgir do jogador preto (que se move primeiro) fazendo um movimento de abertura válido. Existem quatro desses estados, correspondentes aos quatro movimentos possíveis que o jogador preto pode fazer na abertura. (Todos os outros movimentos são ilegais e, como tal, não devem ser considerados.)
Aqui está uma visão parcial de uma árvore de jogo Othello: veja a imagem.
Na imagem, do estado inicial, existem quatro possibilidades das quais o jogador preto pode escolher o movimento inicial. Da primeira delas, vemos que há três movimentos possíveis que o jogador branco pode fazer em resposta. Outros movimentos não são retratados, mas a árvore continua a crescer desta forma. (Não surpreendentemente, a árvore do jogo pode crescer bastante e rapidamente.)
Nós chamaremos as folhas em tal árvore de jogo os estados finais. Essas folhas indicam os estados em que um jogador ou outro ganhou o jogo.
Exaustivamente procurando todas as possibilidades.
Cada vez que um jogador quer escolher um movimento, ele ou ela quer escolher aquele que levará a um estado de jogo vencedor. Podemos determinar a melhor jogada em três etapas:
Nós aplicamos uma função de avaliação para cada estado final do jogo. Uma função de avaliação geralmente retorna um número, onde números maiores são considerados melhores. Então identificamos o estado final com o maior valor - que é o "jogo final" que gostaríamos de ocorrer, pois é a melhor vitória para nós. Determinamos o caminho do estado do jogo atual para o estado final que escolhemos acima. Fazemos o movimento que nos leva do estado atual do jogo no caminho em direção ao estado final escolhido.
Supondo que você tenha uma árvore de jogo completa à sua disposição, esta é uma abordagem simples para implementar. No entanto, limitações práticas tornam essa abordagem impossível. Em primeiro lugar, o número de estados do jogo em cada nível da árvore cresce exponencialmente enquanto você trabalha seu caminho pela árvore, uma vez que há uma série de movimentos possíveis que podem ser retirados de qualquer estado de jogo específico. Simplesmente não haverá memória suficiente para armazenar toda a árvore do jogo. (Você pode imaginar isso, se você construir a árvore do jogo 20 níveis de profundidade, e há quatro movimentos possíveis que podem ser feitos a partir de qualquer estado particular, o número de nós na árvore seria maior que 420, o que é um grande número! ) Além disso, mesmo que existisse memória suficiente para armazenar a árvore, o tempo de processamento para criar a árvore de jogo inteira seria proibitivo.
Então, precisamos encontrar um compromisso - uma abordagem que talvez nem sempre encontre o melhor resultado possível, mas que toma uma decisão em um período razoável de tempo e usa uma quantidade razoável de memória.
Busca heurística.
O estudo da inteligência artificial tem muito a dizer sobre boas maneiras de procurar um objetivo quando não é provável verificar todos os caminhos possíveis em direção a ele.
Primeiro podemos usar a seguinte observação: Suponha que o jogador principal tenha se movido no jogo e o jogador inferior quiser descobrir o melhor movimento para fazer, usando a abordagem da árvore de pesquisa que estamos discutindo. Então o jogador inferior só precisa se preocupar com a subárvore que tem o estado do jogo atual como sua raiz. Uma vez que um movimento é feito, todos os outros movimentos que poderiam ter sido feitos podem ser ignorados, já que agora não é possível tirar esses caminhos pela árvore. Assim, ao analisar o próximo passo a fazer, precisamos apenas gerar a parte da árvore de pesquisa que se origina no estado atual do jogo.
Esta abordagem reduz as nossas necessidades de armazenamento de forma significativa - e não perdemos o tempo ou as partes de processamento de memória da árvore que não podemos mais alcançar.
Mesmo que geremos apenas a parte da árvore que precisamos, essa parte ainda será muito grande para armazenar até chegar ao fim do jogo. Este é o lugar onde uma pesquisa heurística entra em jogo. Em uma pesquisa heurística, geramos tanto da subárvore relevante como é prático, usando os estados de jogo resultantes para nos orientar na seleção de um movimento que esperamos seja o melhor.
Existem várias estratégias que podemos usar. No cerne da estratégia que usamos é a noção de uma função de avaliação que discutimos anteriormente. Precisaremos classificar cada estado de jogo específico de alguma forma, para que possamos decidir qual de um grande número de estados de jogo é o melhor resultado para nós. Uma abordagem simples - embora um que ignore alguns aspectos do jogo - é o seguinte:
eval (estado) = número de azulejos pertencentes a mim "número de telhas pertencentes ao meu oponente.
Também é importante notar aqui que você não precisa realmente criar uma árvore de jogos na memória. Nosso algoritmo realizará uma espécie de busca de profundidade em uma árvore de jogos, o que significa que podemos usar parâmetros em um método recursivo (armazenados na pilha de tempo de execução) para realizar a pesquisa, negando a necessidade de realmente construir e armazenar um jogo árvore. Isso reduzirá drasticamente a quantidade de memória necessária para escolher um movimento, uma vez que apenas um caminho na árvore sempre precisará ser armazenado na pilha de tempo de execução de cada vez.
Juntando essas idéias, podemos desenvolver um algoritmo de busca que procure o movimento que leva ao estado do jogo que avalia o valor mais alto. Esse algoritmo parece ser assim:
Há algumas coisas que precisamos discutir sobre o algoritmo acima. Primeiro, note que há dois casos de recursão: seja o turno do jogador do computador (quem está tomando a decisão) ou o turno do oponente. Em cada caso, o algoritmo é quase o mesmo, exceto:
. Quando é a vez do jogador do computador, o valor máximo é retornado. Em outras palavras, o jogador do computador quer fazer o melhor possível que pode mover. . Quando é a vez do oponente, o valor mínimo é retornado. Isso ocorre porque presume-se que o oponente também faça o movimento que está no seu melhor interesse (o que está em nosso pior interesse).
Você não pode assumir que o jogador do computador será sempre o jogador preto ou branco. O jogador preto ou branco (ou ambos!) Pode ser um jogador de computador. Ao decidir se é "minha vez" ou "o turno do meu oponente", você terá que fazer algum cuidado para garantir que você esteja tomando a decisão certa.
Em segundo lugar, observe o parâmetro de profundidade. Isso será usado para limitar a profundidade da nossa pesquisa, para garantir que nossa busca seja de um tamanho gerenciável. Cada vez que recuamos um nível mais profundo, a profundidade é reduzida em um, e paramos de recuar quando atinge zero.
Em terceiro lugar, observe que quando um jogador faz um movimento, não é necessariamente o caso de o outro jogador estar fazendo o próximo movimento; ocasionalmente, em Othello, o mesmo jogador começa a se mover duas vezes seguidas. Então, deve-se ter cuidado ao decidir de quem é o turno. A maneira mais fácil de lidar com esse problema é contar com o estado do jogo atual para acompanhar isso por você; sempre pode dizer-lhe de forma confiável a sua vez.
Por fim, note que esse algoritmo retorna a avaliação do melhor estado, não o melhor estado em si. Em suma, chamar busca (s, 4) para alguns estados s faz a seguinte pergunta: "Olhando quatro movimentos para o futuro, e assumindo que eu faço o melhor que posso fazer e também o meu adversário, quão bem o estado vai acabar para mim?" Você precisará exercitar algum cuidado na implementação desse algoritmo para que chooseMove () possa chamar search () e use o resultado para ajudá-lo a escolher o movimento correto.
Funções de avaliação.
O núcleo da sua AI - o que o separará dos outros - é a função de avaliação que usa para decidir como é "boa" a configuração de cada placa. Estou deixando isso como um problema aberto e você pode implementar sua função de avaliação, como quiser. You might want to poke around the web looking for strategy guides or other information, taking into account, for example, that some squares on the Othello board are considered more important than others.
It's intended to be fun to play against your own program to see if you can beat it, and I also hope you enjoy fine-tuning your program until you have trouble beating it.
A tournament!
After this project's due date has passed, I'll be gathering all of your AIs together and running a tournament to determine who has the best AI. In fairness, I'll explain here how the tournament will be organized:
Each AI will play two games against each other AI, one each as black and as white. The primary factor in determining the "best" AI is the total percentage of games won. (Draws will count as 1/2 of a win and 1/2 of a loss.) So, first and foremost, it's important to win games. A secondary factor, to be used in the case of a tie, is the total number of tiles accumulated in all games. This means that winning games big, as opposed to squeaking out close wins, is important if there's a tie. Your AI will be given 5 seconds of CPU time to choose each of its moves. (I'll be running the tournament on a 2.4 GHz Intel Core 2 Quad. The fact that it has four processors only means that I'll be running four games at a time.) If your AI takes too long to make a move, returns null, throws an exception, isn't named according to the naming convention, or violates any of the other rules laid out in the project write-up, it will be disqualified from the tournament.
The outcome of the tournament will have no bearing on your grade, but it will hopefully motivate you to think a bit about how you might tune up your evaluation function — or explore alternative ways of helping your AI to see farther into the future. (You are required, fundamentally, to use the algorithm shown in this write-up, though there are optimizations you can make to it, if you're so inclined. If you're not sure whether your idea is permissible, ask me and I'd be glad to let you know what I think about it.)

No comments:

Post a Comment