Desenvolvendo uma inteligência artificial astuta em um jogo tático baseado em heurísticas e mutações

Nos jogos táticos, a IA é muito importante. Se a IA for vista como um “idiota artificial”, o jogo poderá ser salvo por incríveis modos multijogador, enredo, atmosfera e gráficos (isso é impreciso). A solução é óbvia: faça uma boa IA, qual poderia ser o problema?

Terminador Cat da CoolAI

Nos detalhes. Abaixo estão meus passos para criar uma IA forte com caráter. Não é super forte [ 1 ], mas é capaz de trabalhar rapidamente localmente em um navegador guloso de qualquer PC fraco. Eu apliquei a abordagem de sistemas especialistas usando um conjunto de heurísticas e mutações. 15 etapas de transformação gradual da IA ​​são descritas, cada uma das etapas pode ser sentida.

Breve descrição


Em um jogo experimental de navegador, a IA é baseada na geração de muitos estados possíveis - nos resultados da mudança atual. (Devido às especificidades e conveniência do jogo, esses estados resultantes no artigo são chamados de cenários de turnos ou estratégias de IA, dependendo do contexto) . Em seguida, os cenários do curso são alterados. De acordo com os cenários obtidos, são calculadas as estimativas de "sucesso". O mais bem sucedido e realizado por um jogador de computador.

Por exemplo, três estratégias são geradas:

  1. Correndo freneticamente para a frente e atacando todos os que viram o braço. Pontos do estado final: 37000 pontos.
  2. Ataque arqueiros a uma distância segura, enquanto o resto está escondido nos cantos. 45000 pontos.
  3. Todos recuam, agrupam e se escondem dos inimigos. Se você puder ferir qualquer inimigo a uma distância segura, ataque. 18000 pontos.
  4. Nesse caso, a 2ª estratégia será selecionada.


Bem, tudo parece ser padrão. Na verdade não.

Toda a pasta é como os scripts são gerados e como o coeficiente de valor do script é calculado. Impor em um deles, e o resultado vai entristecer você.

Regras do jogo


O jogador e a IA inicialmente têm 6 unidades idênticas nos cantos. Cada equipe se revezam sucessivamente em todas as unidades de uma vez. Opções para o progresso de cada unidade:

  • pule uma jogada;
  • mova-se e pule;
  • mover e atacar ( você pode e às vezes precisa atacar por conta própria ).

O campo de jogo e a composição da equipe são gerados proceduralmente ( ou seja, aleatoriamente, mas com verificações de permeabilidade e "tato" aceitável ). Tipos de unidade:

  1. Lutador F, unidade corpo a corpo com a maior capacidade de sobrevivência, dano e mobilidade. Uma espécie de tanque + dano.
  2. Arqueiro A, o menor dano, mas o ataque está a uma distância de 1-7 em uma linha reta.
  3. O Feiticeiro W morre com um golpe de lutador, mas o ataque está a uma distância de 1-5 em uma linha reta em todas as unidades.

O campo de jogo é sempre 10 * 10 em tamanho.

Campos possíveis no mapa:

  • Terra - não impõe nenhuma restrição.
  • Na parede, você não pode atirar nem passar.
  • Água - é impossível passar por ela, mas um arqueiro pode atirar através dela (um mágico de fogo não pode ).



O jogo é completamente determinado, ou seja, não há nenhum elemento de chance nele (100% de chance de acertar, nenhum dano crítico, etc.). Também é um jogo com informações completas, ou seja, os rivais sabem tudo sobre as condições das tropas um do outro a qualquer momento. Como em damas.

A IA é mais forte que um jogador de carne, mas o último no primeiro nível tem um handicap na forma de uma unidade. No dia 3, o jogador, pelo contrário, tem uma desvantagem de uma unidade e é muito mais difícil vencer (tenho cerca de 15% de vitórias nesta fase). Depois vem a versão mais aleatória do Game +.

Jogabilidade cancelada
Inicialmente, um plano de jogo diferente foi desenvolvido na forma de um "balanço", como na classificação, mas no final do desenvolvimento eu o abandonei como um motivador fraco. A questão era que, se uma equipe perde, no próximo mapa recebe +1 unidade, e assim por diante, até um máximo de 10 versus 6. Se, e então, a equipe conseguiu perder, suas unidades aumentaram suas características.

O jogo foi desenvolvido em javascript nativo: nos estilos divs e css, e essa foi a solução mais infeliz possível [ 2 ]. Este é um jogo de navegador. O motor não foi usado. O único objetivo do projeto é criar um jogador de computador forte "com caráter" e a capacidade de mudar esse personagem (cálculo de cyborgs, orcs agressivos, elfos traiçoeiros, zumbis estúpidos).

Para reduzir o "estilo de computador" do inimigo, alguns truques foram aplicados:

  • O jogador após o seu turno não espera até que a IA pense em sua jogada. O inimigo "imediatamente" começa a fazer seus movimentos ( na realidade, isso é uma ilusão ).
  • O jogador do computador também controla as unidades usando o cursor ( e isso também é uma ilusão, o cursor apenas voa ao mesmo tempo que as animações da unidade ).
  • A IA pode usar iscas insidiosas para forçar uma luta ( tudo é justo ).

E o que é tão complicado?


A princípio, pode parecer que tudo é simples: você pode simplesmente classificar todas as opções de todos os movimentos e escolher o melhor. Mas muito em breve se torna óbvio que tudo é muito difícil.
A enumeração completa é impossível devido ao efeito de explosão combinatória [ 3 ], que consiste no fato de que à medida que o número de elementos sendo verificados nos cenários aumenta, a complexidade dos cálculos aumenta exponencialmente. A seguir, descreverei o que isso significa no meu jogo em particular.

Em primeiro lugar, porque Em cada turno, as unidades da equipe vão de uma só vez , e a sequência pode ser diferente. E com 6 unidades na equipe de tais combinações se torna 720 (1 * 2 * 3 * 4 * 5 * 6). Se houver mais unidades, haverá um grande número de combinações (em 7 - 5040, em 8 - 40320 ...). Se você não levar em consideração o resultado máximo, o jogador corre o risco de experimentar o prazer em antecipar a próxima jogada por 5 a 10 minutos ( e se ele for persistente, o atraso aumentará para milhões de anos, nem todos sofrerão ). É por causa dessa característica que minha IA no início da batalha é menos eficaz do que no final. De fato, no final, metade da equipe já morreu.

Sem unidade - sem problemas

Em segundo lugar, cada unidade pode se mover para diferentes pontos do mapa . Lutadores com uma amplitude de movimento de 4 podem se parecer com 1-41 posições diferentes. Para mágicos e arqueiros com seu movimento em 3, o número possível de movimentos é de 1 a 25. Por exemplo, a composição da equipe pode ser: 4 lutadores, 1 mago e 1 arqueiro. Temos o total de combinações diferentes de movimentos para este item: 41 * 41 * 41 * 41 * 25 * 25 = 1766100625. Na realidade, devido a interseções mútuas e terreno intransitável, haverá menos combinações, mas em uma rara situação de “dispersão no mapa”, o número de combinações será chegar perto desse número.

Em terceiro lugar, cada unidade após o movimento pode pular um movimento ou ataque em uma das quatro direções. Ou seja, temos 5 ações finais possíveis por unidade. Total de combinações: 5 ^ 6 = 15625.

Total de combinações: 720 * 1766100625 * 15625 = 19868632031250000.

E em cada combinação válida, será necessário calcular os pontos do estado resultante. A função de avaliação inclui: emulação de movimentos, ataque, dano, morte de unidades e contagem dos pontos de vida restantes dos sobreviventes. Obviamente, o número de combinações é exagerado, porque em condições reais, a variabilidade diminuirá devido aos limites e obstáculos no mapa, mas ainda será um número insuportável de combinações. E tudo isso acontece, afinal, em um navegador normal.

Como é feito?


Para resolver um problema semelhante, foi utilizada uma abordagem heurística, cujo algoritmo generalizado pode ser descrito da seguinte maneira:

  1. Gere cenários diferentes com base em estratégias predefinidas (~ 20 peças).
  2. Enquanto houver tempo, mude os scripts, deixando os mais lucrativos.
  3. No final, selecione o cenário com a classificação mais alta.
  4. Execute o primeiro movimento da unidade a partir do script, mas não ande o resto. Inicie a animação do primeiro movimento e, enquanto a animação estiver sendo exibida, continue aprimorando os scripts para as unidades restantes.
  5. Repita o procedimento para as unidades restantes da etapa 1.

O método heurístico é um método que pode funcionar (de acordo com McConnell [ 4 ]). Mais e mais rigoroso na Wikipedia [ 5 ].

Os pontos principais desse algoritmo são: geração de cenário, mutações e a avaliação correta da lucratividade do estado. Cada um desses pontos usa suas próprias heurísticas locais. No entanto, sempre que possível, algoritmos foram usados ​​com um resultado ótimo garantido, por exemplo, A * para encontrar o caminho [ 6 ].

A abordagem evolutiva que usei não pode ser chamada de genética completa [ 7 ], porque Eu usei apenas mutações e a sobrevivência dos "mais fortes" dele, e ajustei manualmente os coeficientes da influência das heurísticas individuais. Algoritmos para formação de populações e cruzamentos não foram utilizados. Após a mutação, apenas um sobrevive: um mutante ou um dos pais.



Não usei redes neurais [ 8 ] devido à natureza do problema. Em primeiro lugar, devido à complexidade de sua implementação bem-sucedida em um ambiente em constante mudança (o surgimento de novas mecânicas, habilidades, habilidades). Em segundo lugar, devido à complexidade em sua personalização controlada (se você deseja fazer dois comportamentos: Suvorov rápido e Kutuzov cuidadoso [ 9 ]).

A evolução de um idiota artificial em inteligência artificial


0) Inicialmente, apenas 3 estratégias com movimentos aleatórios foram introduzidas na IA. { Dificuldade do jogo # 0 }. A pontuação da condição foi apenas um número aleatório. E como a IA não é o único elemento de desenvolvimento, tive que suportar o comportamento de peixes loucos por um bom tempo.

1) Depois, no cálculo da avaliação da estratégia, foram adicionadas as verificações das unidades restantes e suas vidas com a IA e o jogador. { Dificuldade do jogo # 10 }. Para uma unidade morta, a equipe recebeu 0 pontos. Para pontos X completamente saudáveis ​​(por exemplo, 100.000 para o lutador F, 70.000 para o arqueiro A, 85.000 para o feiticeiro W). Para os feridos foram cobrados 50% do valor do núcleo e os 50% restantes em proporção às vidas restantes do máximo. Graças a isso, era mais lucrativo para a IA matar inimigos, e se ele pudesse ferir, ele escolheria oponentes com menos vidas - mais vulneráveis.

Movimentos aleatórios se tornaram mais significativos - a IA às vezes retribuía.

2) Em seguida, foi adicionada uma estratégia inicial mais significativa:
max_agro - todos os soldados correram o mais perto possível dos inimigos e tentaram causar o máximo de dano possível . { Dificuldade do jogo # 20 }. Uma estratégia usou a ordem de movimentação original da unidade, a segunda foi na ordem inversa.

A IA começou a se comportar como o idiota artificial mais primitivo dos jogos táticos. E muitas vezes apenas essa IA é usada em jogos táticos. É popular por causa de sua confiabilidade e simplicidade. Este pode até ganhar - mas muito raramente.

É exatamente assim que o comportamento da IA ​​se parece no falhado jogo de Mestre de Monstros - Discípulos de Gaia, o que torna tedioso jogar nele [ 10 ].

Mestre dos Monstros - Discípulos de Gaia

3) Em seguida, foram adicionadas estratégias que levam em consideração possíveis danos dos inimigos durante o movimento e escolhem aqueles que levaram ao menor perigo - de preferência zero. { Dificuldade do jogo # 30 }. E a IA imediatamente se tornou covarde demais, evitando qualquer proximidade com o inimigo - é melhor fugir do que atacar e ferir, porque o inimigo pode dar mais mudanças!

Portanto, a avaliação das condições também começou a levar em conta os possíveis danos ao inimigo . Os pontos de penalidade por dano potencial dos inimigos começaram a ser calculados com um coeficiente decrescente de 0,20 (o coeficiente era constantemente reconfigurado ). Isso forçou a IA a escolher uma opção agressiva ao escolher entre ataque ou voo, uma vez que trouxe 5 vezes mais pontos que o voo. Mas a IA ainda permaneceu covarde por um longo tempo, porque, para entrar em tal situação de escolha, o inimigo já deveria estar ao seu alcance, e a própria IA, com essas estimativas, nunca se colocaria em primeiro lugar sob ataque. Ou seja, não será reaproximada. Obviamente, o jogador se sentirá enganado, porque a IA tem um suprimento infinito de paciência e pode fugir do perigo para sempre, forçando o jogador à agressão.

Deve-se notar que esses cálculos de possíveis danos são muito longos sem o uso de um cache. Um erro de cálculo completo de uma estratégia sem otimizações levou inicialmente 700 milissegundos. Mas eu tenho uma limitação em todo o curso de uma unidade ~ 4000 ms! Após otimizações e caches gastos, esse tempo diminui para 20 milissegundos com estratégias muito semelhantes ( infelizmente, o cache não pode ser calculado com antecedência devido ao efeito de explosão combinatória, portanto, nem sempre são alcançados 20 ms ).

Portanto, quando introduzi a tecnologia de cálculo prevendo vários movimentos à frente , o tempo de cálculo para uma profundidade de apenas 2 movimentos (inimigo e IA) já levava +700 milissegundos. Nesse caso, a otimização é usada com o corte dos ramos "fracos". Se usarmos a estratégia primitiva max_agro para isso, o aumento no tempo foi de +30 milissegundos e o cache quase não reduziu essa diferença ( porque a posição no mapa era completamente nova ).

Como resultado, fiz 5 abordagens diferentes para o desenvolvimento dessa abordagem, mas no final a abandonei completamente, porque mutações com heurísticas deram resultados melhores e mais rápidos.

4) As seguintes estratégias visavam expandir a diversidade inicial de estratégias:
far_attack_and_hide - as unidades tentam atacar o mais longe possível do inimigo e, se não atacam, se escondem de qualquer ataque.

close_group_flee - as unidades se afastam da batalha e agrupam o mais próximo possível um do outro. Se você puder atacar com segurança o inimigo ao mesmo tempo, ataque.
{ Dificuldade do jogo # 40 }.

Isso melhorou o processo da batalha em si, mas o início da batalha sempre foi inútil para a IA: ela recuava constantemente, mas podia ser atraída para o ataque e assustada, de modo que o grupo da AI fosse dividido em vários pequenos grupos que poderiam ser destruídos separadamente.

5) Então é hora de mutações . { Dificuldade do jogo # 50 }.

O algoritmo de mutação era muito simples:

  • ao iterar sobre as estratégias selecionadas, uma cópia da estratégia foi criada;
  • nesta cópia, uma mutação do curso foi feita;
  • se a mudança se tornar inválida, ela será corrigida para pelo menos uma válida, de acordo com uma das estratégias padrão;
  • pontos da estratégia mutada foram calculados;
  • se o mutante tiver mais pontos, o mutante substituirá seu pai.

Ao mesmo tempo, pessoas de fora não excluíram a estratégia e também participaram de mutações, porque sempre houve uma probabilidade perceptível de uma série de mutações muito bem-sucedida.

A princípio, o tipo mais primitivo de mutação foi implementado: de 1 a 3 movimentos foram substituídos por aleatórios, a ordem dos movimentos permaneceu a mesma. Durante uma iteração de cálculos, em média, foram criadas cerca de 5-15 mutações para cada estratégia. Além disso, em média, cada quinta mutação era mais lucrativa e substituía a estratégia dos pais.

6) Isca heurística . { Dificuldade do jogo # 60 }.

Essa heurística repetiu a tática com a qual eu atraí a IA para atacar com uma unidade para matá-la uma de cada vez. Este truque também foi ensinado à IA.

Para fazer isso, na função de calcular pontos para o estado da estratégia, é verificado se o estado atual corresponde à situação da isca:

  • Apenas um soldado da IA ​​pode ser atacado;
  • Somente um inimigo pode atacar uma unidade rastreada;
  • A unidade do player do computador deve sobreviver após este ataque;
  • Pelo menos duas unidades do computador poderão atacar em resposta. Quanto mais unidades punitivas, mais pontos para heurísticas.

O efeito acabou sendo excelente: fica mais fácil para o jogador iniciar a batalha sozinho. Além disso, na maioria das vezes, ainda é mais lucrativo para um jogador "agarrar-se" a essa isca, pois após um ataque de retorno ele poderá cair na IA com todo o seu esquadrão ( isto é, se ele estiver razoavelmente agrupado de antemão ). E aí todas as decisões táticas locais competentes resolverão tudo.


7) Então começou a chamar minha atenção que os combatentes da IA ​​constantemente se espalham como baratas . { Dificuldade do jogo # 70 }. Além disso, os soldados podem se esconder em um canto ou entrar em túneis apertados, nos quais a IA perde muito em sua eficácia na classificação de possíveis ataques.
Portanto, heurísticas para estimar distâncias entre unidades e topografia de mapa com as seguintes premissas foram adicionadas à função de avaliação:

  • Quanto mais os aliados se aproximarem "em média" - melhor (as unidades começam a se espalhar em diferentes partes do mapa com menos frequência).
  • Quanto mais os soldados da IA ​​se aproximarem dos soldados "médios" do inimigo, melhor (eu precisava de uma IA ofensiva).
  • Quanto maior a distância máxima entre qualquer par de aliados, pior. Ao mesmo tempo, uma distância de 4 não é penalizada, e tudo o que é maior é penalizado exponencialmente (isso parou de puxar soldados para fileiras vulneráveis).
  • Se o soldado da IA ​​não puder correr e atacar o inimigo em pelo menos 2 turnos, ele deverá ser multado (isso o obriga a atacar, mas não a se levantar sob ataque).
  • Se em um raio de 2 passos do soldado houver muitas posições de bloqueio, então multá-lo (com menos frequência eles começaram a correr em túneis).
  • Se um soldado estiver na borda do mapa, então multe-o ainda mais. Como resultado disso, a manobrabilidade da IA ​​aumentou bastante, conforme Uma unidade pode correr de uma área aberta para um número muito maior de posições do que de um canto ou túnel.

8) Então é hora de expandir estratégias. { Dificuldade do jogo # 80 }. Não pude adicionar uma enumeração completa da ordem possível de movimentos de unidade, mas pude enumerar seus movimentos por tipo : lutador, arqueiro, feiticeiro. Portanto, surgiram estratégias para a sequência de movimentos, da forma W_A_F: primeiro todos os feiticeiros andam, depois todos os arqueiros, depois todos os lutadores.

Assim, foram adicionadas 6 novas estratégias: W_A_F, W_F_A, A_W_F, A_F_W, F_A_W, F_W_A. Eles não resolveram todos os problemas, mas melhoraram significativamente a qualidade do jogo.

9) Eu tinha mutações, mas eram de pouca utilidade. { Dificuldade do jogo # 90 }. Principalmente eles melhoraram estratégias fracas, enquanto as bem-sucedidas raramente melhoraram. Portanto, as mutações foram modificadas e cada vez que um dos tipos aleatórios de mutações funcionava:

  • De 1 a 3 movimentos foram substituídos por aleatórios, a ordem dos movimentos permaneceu a mesma (maneira antiga);
  • Troque a ordem dos movimentos de duas unidades aleatórias. Deixe-os inalterados, mesmo que não sejam ótimos. Se o movimento não puder ser repetido, ele será recriado aleatoriamente por uma das estratégias usuais para um estado válido;
  • Troque a ordem dos movimentos de duas unidades aleatórias e conte os movimentos novamente. .

. - , .

10) . { #100 }. , ( ):

  • ;
  • ;
  • .

, , .

11) , , . { #110 }. - . :

  • , , ;
  • — ;
  • , , ( );
  • ;
  • .

, .

12) " " . { #120 }. , , . , . , . . :

1. , +1500 .
2. , , . , 0 (N > 0).
2.1. (n = 0), -1000 .
2.2. , +1200 .
2.3. , +(n/N)*1000 .

«» . , « », , , . , 2 , 3 . :

IF ("   ,   " AND "    3 ") THEN "      " 

13) Ao final da introdução das estratégias, elas já haviam acumulado menos de 25 peças. { Dificuldade do jogo # 130 }.

A mutação de cada um deles se tornou muito cara. Por isso, foi decidido remover os que não obtiveram sucesso e deixar apenas 8 peças. Desde o início, eu não queria usar essa abordagem na expectativa de que a mutação de pessoas de fora possa levar a um excelente resultado inesperado, em vez de apenas um bom. A entrada nesse processamento levou a uma melhoria no jogo de IA.

14) No início, ainda havia uma revisão interessante. Inicialmente, o valor do cenário foi calculado como a diferença na soma dos pontos:

 _ = _ - _ 

Mas depois de várias melhorias, lembrei que essa não é a melhor solução, porque depois, para a IA, as situações “2 soldados versus 1 soldado” e “4 soldados versus 3 soldados” serão as mesmas. Portanto, os pontos começaram a ser calculados como a razão:

 _ = _ / _ 

A mudança é pequena e o resultado é muito sério. Sem modificação, o preço de um erro com risco aumentado sempre foi o mesmo. Após o refinamento, a IA começou a arriscar menos descuidada no final da batalha, e isso a fortaleceu notavelmente.

Quero observar que todas essas melhorias foram introduzidas gradualmente, embora na ordem indicada, mas muitas delas foram aprimoradas, processadas e corrigidas de bugs em uma ordem mais caótica. Havia mais de 100 iterações reais.

Veja como a IA final é reproduzida { Dificuldade do jogo # 9999 }:


A IA caminha imediatamente, sem perder tempo pensando


Para acelerar os cálculos, algoritmos de otimização foram usados ​​ativamente na forma de partições de loops aninhados em loops seqüenciais ( reduzindo a complexidade ) e na introdução de várias matrizes com cálculos preliminares em cache ( e subsequente otimização desses mesmos caches ). De acordo com minhas estimativas, novas otimizações poderiam me proporcionar um aumento duplo (ou até maior) na velocidade, mas isso levaria a um aumento injustificado nos custos de tempo e a uma perda ainda maior da legibilidade do código.

A principal tecnologia de alta velocidade são os cálculos preliminares durante o tempo de inatividade. Este método consiste em dividir o processo em duas partes: os próprios cálculos e a animação dos resultados do cálculo:

  • os cálculos do curso da primeira unidade começam imediatamente após o turno do jogador, enquanto uma janela se abre e o turno do oponente começará. E isso é tanto quanto 4 segundos, que o jogador não percebe como expectativa vazia;
  • os cálculos dos segundos e movimentos subsequentes começam quando a animação do curso da última unidade apenas começa (ou seja, quando o cursor AI apenas inicia seu movimento). E o tempo de todas as animações já é de 4,5 segundos. Embora fosse mais correto chamar isso não do cálculo do próximo passo, mas do aprimoramento da estratégia do passado já desenvolvida e da busca de uma nova, porque a cada iteração, os movimentos de toda a equipe são calculados;
  • ao animar a IA se move para unidades móveis, o cursor da IA ​​voa, o que finge que ele clica nelas. O cursor voa o mais rápido possível, mas para que o conforto do rastreamento permaneça. Além disso, a adição de um cursor não apenas permitiu aumentar a margem do tempo de computação de 2 segundos para 4,5, mas também tornou a visualização do progresso do computador mais confortável para uma pessoa;
  • o tempo de turno do jogador também não é desperdiçado. Enquanto o jogador pensa, quase nenhum cálculo é feito, portanto, neste momento, os caches possíveis para o movimento futuro do oponente do computador são intensivamente calculados.

Para evitar que tudo isso fique no navegador e funcione com um FPS razoavelmente estável, os cálculos são executados de forma assíncrona pelo trabalhador ( trabalhadores da Web ) [ 11 ].

Ao fazer isso, eu queria me livrar da janela de espera irritante "Caminhadas pelo computador". Um dado tão desagradável está em muitos bons jogos, por exemplo, nos Xenonauts [ 12 ]. Acredito que fui capaz de lidar com esse problema.

Xenonauts - movimento oculto

Assim, a IA passa sempre o mesmo tempo para pensar em sua mudança - independentemente de sua complexidade. Uma característica muito curiosa dessa abordagem é que, quanto mais forte o jogador tiver um computador, mais mutações de IA terão tempo para resolver e, portanto, quanto mais forte, mais poderoso o computador do jogador. Eu removi esse efeito primeiro, fixando o tempo de execução e pré-calculando a velocidade do computador. No entanto, removi essa fixação, porque donos de computadores poderosos, isso permitirá que eles briguem com o "seu" computador, em vez do computador médio.

Qual é o resultado e quais são as desvantagens


Assim, o adversário resultante do computador sabe lutar dignamente e faz bom uso da supervisão de qualquer jogador, e não faz muitos por conta própria. No entanto, eu, conhecendo todas as características de seu trabalho, ainda que com tensão, mas o derrotei quase sempre (em igualdade de condições). Mas gostaria do contrário: mesmo sabendo de suas características, quase sempre perde para ele. A IA está longe de ser ideal, porque o conjunto de heurísticas que eu uso leva à sobreposição sinérgica de "erros da minha percepção" um no outro. Esses erros são:

  1. A imperfeição e a incompletude da minha própria estratégia, não conheço todas as melhores estratégias e, portanto, não consigo identificá-las nem implementá-las no jogo.
  2. Perda de eficiência (que não é tão ideal) de heurísticas elaboradas ao transferi-las para o código do programa. Por exemplo, minha heurística humana: "As unidades permanecem próximas, mas não muito próximas, para evitar o dano duplo dos mágicos e não ficarem presas em passagens estreitas". Essa heurística me ajuda a derrotar a IA, mas quando eu a ensino para o oponente do meu computador, tenho que traduzir uma descrição qualitativa em uma algorítmica com estimativas quantitativas, e aqui a perda de dados é possível.
  3. Conflitos mútuos entre heurísticas. Quando há muitas heurísticas, elas gradualmente começam a se sobrepor. Como resultado disso, uma amplificação inesperada pode ocorrer devido à contagem dupla oculta ou duplicação parcial. Ou algum tipo de heurística deixará de influenciar qualquer coisa, porque sua contribuição é completamente bloqueada por grandes coeficientes concorrentes.
  4. Restrições de tempo apertadas e melhorias passo a passo das estratégias escolhidas levam ao fato de que o primeiro passo será sempre menos pensado. Isso significa que um primeiro movimento mal sucedido pode bloquear os movimentos óbvios e mais efetivos das unidades restantes da equipe. Isso é expresso no fato de que o primeiro lutador F, em vez de se afastar, pode atacar ironicamente o inimigo e, em seguida, seu mago aliado W terá que ferir o seu próprio para acabar com o inimigo.

Algoritmos genéticos de pleno direito, em vez de "correspondência visual", provavelmente tornariam possível selecionar coeficientes mais ótimos em heurísticas. Mas isso já é uma tarefa para futuros projetos completos - não quero ficar preso a um protótipo por um longo tempo. Estou bastante satisfeito com a IA atual: é prudente, um pouco insidioso, bastante agressivo e não permitirá que o jogador se derrote seco ( na realidade, é extremamente raro permitir isso ).

Recursos adicionais


Este método de implementação permite que você obtenha bônus adicionais no desenvolvimento de jogos ( em muitos aspectos, do ponto de vista do desenvolvedor e de seus termos em andamento ):

  1. O surgimento de novas mecânicas no jogo não destruirá a força do jogador do computador, embora o enfraqueça gradualmente em comparação com o jogador. Esse enfraquecimento pode ser compensado pela introdução de heurísticas adicionais. Para que isso não leve a gastos progressivos de recursos, é possível aplicar essas novas heurísticas somente se essas novas mecânicas estiverem presentes na batalha atual.
  2. Níveis de dificuldade realmente inteligentes. Agora, basicamente, o nível de dificuldade determina quais bônus um jogador de computador receberá como recursos ( mais ouro no início ou um bônus na mineração ) ou quanto seus soldados vencerão ( + 50% de dano ). Funciona, mas você pode tornar a IA um pouco menos inteligente, desativando gradualmente algumas heurísticas à medida que a complexidade diminui.
  3. Na continuação do segundo parágrafo, você pode criar diferentes raças / facções de oponentes de computador : apenas estratégias agressivas funcionam para orcs; nas multidões de zumbis, apenas os primitivos "avançam e atacam"; e cyborgs usam todo o poder da IA. Graças a esse jogador antes do ataque, será necessário avaliar não apenas o número de oponentes, mas também sua inteligência.

Tudo isso parece promissor, mas lembre-se de que tudo isso é bonito no papel e, em um jogo real, pode não funcionar, acaba sendo desinteressante ou até invisível para o jogador. Mas esse é um bom motivo para experimentação.

Onde sentir


Você pode testar o poder dessa IA no navegador tático da IA. Assunto do teste ”gratuitamente em sites como itch.io [ 13 ]. O parâmetro GET ai (valores de 0 a 140 nas etapas de 10) reduzirá a complexidade da IA.

De acordo com minhas expectativas, derrotar a IA em igualdade de condições será muito, muito difícil para você. Mesmo depois de se acostumar com as regras do jogo. Eu recomendo considerar este jogo como um protótipo, que é essencialmente (não há música, sons e preço ).

Por favor, deixe sua opinião nos comentários sobre a interesse da IA, dicas e críticas sobre a possível implementação da IA ​​usando vários métodos de ensino. Se de repente você se interessou em minha outra pesquisa, considere assinar aqui a minha conta.

Referências


1. DeepMind - artigos sobre Habré .
2. Jogos em HTML5: Canvas vs. SVG vs. div no stackoverflow .
3. Explosão combinatória - Wikipedia .
4. O código perfeito de Steve McConnell é Habr .
5. Métodos heurísticos - Wikipedia .
6. A * - Red Blob Games .
7. O algoritmo genético. Quase o difícil - Habr .
8. Oito jogos incríveis com inteligência artificial da empresa Google - Habr .
9. Muito brevemente sobre Suvorov e Kutuzov .
10. Master of Monsters - Disciples of Gaia - Revisão no IGN .
11. Uma Explicação Detalhada dos Loops e Momentos do Jogo JavaScript .
12. Xenonauts e uma longa tela de espera da IA .
13. estrondo tático da IA. Assunto do teste - em itch.io.

Source: https://habr.com/ru/post/pt461287/


All Articles