Interdisciplinaridade - A área de jogos é interdisciplinar, envolvendo conhecimentos de três grandes campos: - Computação Gráfica. - Artes. - Ciências Humanas.
Computação Gráfica - Um dos maiores motivos para a troca e atualização de computadores é o lançamento de novos jogos. Isso prova que os jogos influenciam a Arquitetura das máquinas. O mercado de jogos alavanca o lançamento de novas GPUs, placas de processamento gráfico. - Dentro de Computação Gráfica temos diversos elementos, como a simulação da física, uso de giroscópios, modelos de jogabilidade mais interativos como o Wii, Kinect e Oculus Rift, entre outros. - Desenvolvimento de acessibilidade da interface, ou seja, criar jogos para pessoas com deficiências. - Engenharia de Software | Desenvolver um jogo é desenvolver um software.
Artes - É sabido que as grandes empresas possuem 2 a 3 artistas para cada programador, o que mostra a complexidade e importância dos elementos artísticos na elaboração de um jogo. - Arte conceitual, design de fases, design de personagens, modelagens 2D.
- Animações. - Músicas, efeitos de som, trilhas.
Ciências Humanas - Roteiros (chegando a possuírem a complexidade de roteiros cinematográficos). - Técnicas narrativas. - Psicologia. - Sociologia. - Educação. - Jogos educativos. - Impacto pós-jogos como influência na sociedade.
Inteligência Artificial - Compreende uma vasta área que precisa ser melhor especificada. Abrange sub-áreas como a Computação Natural e o Aprendizado de Máquina. - Compreende a Robótica nas fundamentações lógicas, proposições e inferências. Simulação de redes neurais, simular as sinapses cerebrais. - Sistema de Recomendação da Web3.0 com a identificação de padrões (Amazon).
- Characterbot | Robô de Atendimento. - Cortana, Siri.
- Personagens virtuais em jogos. NPCs, bots. - De jogos de xadrez aos atuais.
CharacterBots
CharacterBots
CharacterBots
Pontos de Ancoragem - Glossário - Algoritmo - Um algoritmo é uma sequência finita de instruções bem definidas e não ambíguas, cada uma das quais pode ser executada mecanicamente num período de tempo finito e com uma quantidade de esforço finita. - O conceito de algoritmo é frequentemente ilustrado pelo exemplo de uma receita culinária, embora muitos algoritmos sejam mais complexos. Eles podem repetir passos (fazer iterações) ou necessitar de decisões (tais como comparações ou lógica) até que a tarefa seja completada. Um algoritmo corretamente executado não irá resolver um problema se estiver implementado incorretamente ou se não for apropriado ao problema.
Pontos de Ancoragem - Glossário - Algoritmo - Um algoritmo não representa, necessariamente, um programa de computador3, e sim os passos necessários para realizar uma tarefa. Sua implementação pode ser feita por um computador, por outro tipo de autômato ou mesmo por um ser humano. Diferentes algoritmos podem realizar a mesma tarefa usando um conjunto diferenciado de instruções em mais ou menos tempo, espaço ou esforço do que outros. Tal diferença pode ser reflexo da complexidade computacional aplicada, que depende de estruturas de dados adequadas ao algoritmo. Por exemplo, um algoritmo para se vestir pode especificar que você vista primeiro as meias e os sapatos antes de vestir a calça enquanto outro algoritmo especifica que você deve primeiro vestir a calça e depois as meias e os sapatos. Fica claro que o primeiro algoritmo é mais difícil de executar que o segundo apesar de ambos levarem ao mesmo resultado.
Pontos de Ancoragem - Glossário - Algoritmo - O conceito de um algoritmo foi formalizado em 1936 pela Máquina de Turing de Alan Turing e pelo cálculo lambda de Alonzo Church, que formaram as primeiras fundações da Ciência da computação.
Pontos de Ancoragem - Glossário - Heurística - Heurística é um método ou processo criado com o objetivo de encontrar soluções para um problema. É um procedimento simplificador (embora não simplista) que, em face de questões difíceis envolve a substituição destas por outras de resolução mais fácil a fim de encontrar respostas viáveis, ainda que imperfeitas. - Tal procedimento pode ser tanto uma técnica deliberada de resolução de problemas, como uma operação de comportamento automática, intuitiva e inconsciente.
Pontos de Ancoragem - Glossário - Heurística - Na primeira forma é uma alternativa rápida e semi-intuitiva ao raciocínio lento e elaborado, que às vezes funciona razoavelmente bem se utilizada dentro de suas limitações. Mas que geralmente induz a vieses e erros graves e recorrentes quando realizada em sua 2ª forma, ou utilizada além de seu escopo. - Heurística tem origem no termo grego εὑρίσκω, que significa "encontrar" ou "descobrir". Tem a mesma origem da palavra eureca (εὕρηκα), que significa "encontrei".
IA Forte - Strong AI Artificial General Intelligence. - Tenta replicar ou superar a inteligência do ser humano. Exemplo fictício: HAL 9000 de 2001, uma Odisseia no Espaço. - Requer raciocínio, tomada de decisões com incerteza, representação do conhecimento, planejamento, aprendizado, processamento de linguagem natural entre outros fatores em um ambiente de incertezas. - Tentativa de replicar no PC Intuição, 6º sentido, processando esses dados. - Consciência, auto-conhecimento, sentimento, etc.
IA Fraca - Narrow or Weak AI - Focar a IA em casos específicos, como sistemas de recomendação. - O trabalho focado seria, por exemplo, um mecanismo que resolva quebra-cabeças. Ele pode até superar um humano nisso, mas apenas fará isso. - Eixo de Pensar x Agir e Racionalmente x Humanamente. - Agir Humanamente é o mais complexo.
IA Acadêmica x Game IA - O termo Game IA surgiu para diferenciar os estudos em IA para jogos eletrônicos dos elaborados pelo meio acadêmico. - IA Acadêmica. - Solução de problemas difíceis (Ex: Reconhecimento de Padrões. - Game IA. - Diversão dos jogadores. - Impor desafios. - Promover realismo comportamental.
Histórico - 1770: “O turco”, criado por Wolfgang von Kempelen, que supostamente jogava xadrez com perfeição.
Histórico - Até a década de 1970, os jogos possuíam apenas Versus Mode. - A indústria percebeu que a inclusão de um modo para um jogador poderia atrair um público maior, desta forma, aumentando os lucros. - Técnicas já conhecidas no meio acadêmico passaram a ser utilizadas para simular o comportamento humano. - 1978: Space Invaders implantou as primeiras entidades inteligentes em jogos.
Histórico - 1980: Pac-man conta com movimentos padronizados dos inimigos, porÊm cada fantasma tem um modo diferente de caçar o jogador.
Histórico - 1990: O primeiro jogo de estratégia em tempo real, Herzog ZWei, é lançado. A busca de caminho apresentada nesse jogo era de baixa qualidade.
Hist贸rico - 1996: BattleCruiser: 3000AD 茅 publicado como o primeiro jogo a utilizar redes neurais comercialmente.
Histórico - 1998: Half-Life é lançado como a melhor Game IA até então. - 2001: Black & White é alvo da mídia a respeito de como as criaturas aprendem com as decisões do jogador.
Objetivo IA para Jogos - Guiar as metas - O que fazer e como fazer.
- Reação - Responder imediatamente as mudanças no mundo. - Conhecimento intensivo - Conhecimento profundo sobre o mundo e como ele se comporta. - Incorpora esse conhecimento em seu comportamento.
Objetivo IA para Jogos - Representatividade - Incorpora um personagem plausível.
- Velocidade - Desenvolvimento fácil e rápido. - Recursos - Pouco consumo de processamento e memória.
Pipeline da Game IA -
IA geralmente funciona em 3 passos distintos Percepção Raciocínio Ação
Pensar Racionalmente -
IA Clássica ou Simbólico, proposições lógicas. Sócrates é homem. Todo homem é mortal. Logo, Sócrates é mortal. Programa tira conclusão a partir de preposições. Qualquer problema descrito por lógica pode ser resolvido. A dificuldade consiste em modelar qualquer conhecimento lógico. É difícil modelar o mundo real em proposições lógicas.
Pensar Humanamente - Problema: Não se sabe ao certo como nós pensamos. - Deve-se estudar como o ser humano pensa, utilizando as ciências cognitivas, que são multidisciplinares. - Envolvem Biologia, Psicologia, Fisiologia, Neurociência, Computação. - Exemplo: Entender como o cérebro pode controlar um braço mecânico.
Agir Humanamente - Teste de Turing (matemático). Métrica: parecer humano. - Consiste em uma pessoa, em uma sala, teclar com outra sala. Ela não sabe se quem a responde é uma máquina ou um humano. Se a pessoa não conseguir distinguir se é uma pessoa ou um computador, a máquina foi aprovada no teste. - Envolve processamento da Linguagem natural, representação do conhecimento, raciocínio, aprendizado, ser capaz de errar (os primeiros sistemas eram facilmente identificados como computadores, pois eles não erravam. Simular o erro é importante para a naturalidade, deve-se deixar a máquina imperfeita para simular um humano, pois os humanos erram. - Loebner Prize (premiação). - Teste de Turing invertido. Você deve provar para a máquina que você é uma pessoa. CAPTCHA(caracteres difíceis do PC reconhecer). Evitar software bot (AI). Impedir o acesso de um sistema automático.
Agir Humanamente - Teste de Turing (matemĂĄtico). MĂŠtrica: parecer humano.
Agir Racionalmente - Agente é a entidade que percebe o ambiente através de seus sensores e age através de seus atuadores. - Agentes: - Ser humano. - Robô (câmeras, sensores). - Softbot (agente de software). Bot de busca do Google, sistema que gera lances automáticos em leilões. - NPC (personagem não jogável, possui sensor de proximidade, etc.) - IA é construir agentes inteligentes, sistemas de softwares que trabalham no mundo artificial e/ou real.
IA para Jogos - A utopia é passar no Turing Test de modo que você não consiga identificar se está jogando com um humano ou um NPC.
- Adaptar jogo ao usuário, em interface, nível de dificuldade, etc. Player Modeling. - Bot para perseguir inimigo, recuperar saúde, etc. - Fazer IA em um jogo consiste em colocar “grau de inteligência” nesse jogo.
IA para Jogos - Não necessariamente precisa ser uma inteligência muito complexa, sofisticada, pode ser algo mais simples, como roubar (cheating). - Por exemplo, um chefão de fase difícil de ser derrotado possui mais informação que você, isso não é IA propriamente dita.
IA para Jogos - Movimentos aleatórios. - Tetris. Você separa um espaço para encaixar uma peça quadrada, e ela nunca vem. Parece IA mas, na realidade, é um movimento aleatório. - Zombie Tsunami.
IA para Jogos - Uma das definições diz que qualquer coisa que dê uma ilusão de inteligência até um certo nível, tornando o jogo mais imersivo, desafiador e divertido pode ser considerado IA para jogos. Mesmo um cheating ou um movimento aleatório. - Essa definição não é totalmente adequada, por ser muito ampla, é como se qualquer coisa fosse IA. É oposta ao teste de Turing que é muito estreito.
IA para Jogos - A melhor definição seria considerar a IA para jogos como um conjunto de técnicas que permitem a implementação de comportamentos inteligentes (“humanos”) em jogos, com foco em: - 1. Movimento de personagens. - 2. Tomada de decisão. - 3. Estratégia. Jogos RTF, xadrez, etc.
- Isso serve para jogos mais ou menos sofisticados.
IA para Jogos
Agentes Inteligentes - Quanto mais complexo o ambiente, mais sofisticado deve ser o algoritmo para lidar com aquilo.
- Percept: entrada em um determinado momento. - Actions: normalmente dependem da sequencia do percept atĂŠ aquele momento.
Agentes Inteligentes - Existe uma função que faz o “mapeamento” implementada por um programa mais ou menos complexo de acordo com o ambiente.
- Por exemplo, no xadrez você observa todo o ambiente, vê todas as peças. Enquanto você pensa, nada acontece. É mais controlado. - É diferente de um carro autônomo que, mesmo tendo um mapa de rota, pode ser que durante o processamento do mapa tenham fechado uma via, o trânsito aumentou, do nada surgiu um pedestre, um buraco. É um ambiente dinâmico e cheio de incertezas.
Tipos de Ambientes - Completamente Observável (vs Parcialmente Observável) - No completamente observável os sensores lhe dão informação completa sobre o mundo. Você tem informações sobre todo o ambiente, como, por exemplo, no xadrez. - No parcialmente observável você não conhece todo o ambiente. Por exemplo, Age of Empires.
Tipos de Ambientes - Determinísticos (vs Estocásticos). - O determinístico está sob seu controle. É completamente determinado. O ambiente possui seu estado, que é o conjunto de variáveis que definem aquele ambiente). - Por exemplo, no xadrez o tabuleiro tem uma configuração, e permanece daquela forma até que você faça seu movimento. Depende apenas de você, da configuração anterior, de seu movimento e do outro agente, não depende de mais coisas aleatórias. Você joga, adversário joga (outro agente) e você volta a jogar. - É diferente de um robô adentrar um prédio antigo e ele desabar independentemente da ação deste robô. Esse ambiente é imprevisível, aleatório, estocástico.
Tipos de Ambientes - Episódico (vs Sequencial). - Nos episódicos seus eventos são separados em eventos independentes. Neste caso uma ação realizada agora não depende das anteriores e não interfere nas futuras. - Nos sequenciais a ação que o agente faz em um determinado momento depende das anteriores e influenciam as futuras. - Jogos dentro de uma mesma partida são, na maioria dos casos, sequenciais. Você pegar ou não determinado item te influenciará mais ao longo da partida, sua munição pode acabar, você não terá a chave certa para abrir a passagem, etc. - Os episódicos são os mais simples de serem lidados, pois as ações não geram as consequências. - Por exemplo, duas partidas diferentes de um jogo contanto que você não leve conhecimento de uma partida para a próxima. - Um robô que precise separar porcas de parafusos fará isso e ele pegar um parafuso não dependerá do anterior, nem influenciará o próximo.
Tipos de Ambientes - Estáticos (vs Dinâmicos). - Os estáticos são os mais simples, pois o mundo não muda enquanto você pensa. Nada ocorre enquanto você define sua jogada. - No dinâmico coisas podem ocorrer enquanto se pensa a jogada. - Semidinâmicos: enquanto eu penso o ambiente não muda, mas eu posso estar perdendo pontos nesse caminho, por consequência de tempo, etc. Por exemplo, jogo de xadrez com cronômetro. - A função de utilidade em um ambiente semidinâmico muda. Essa função é a que o agente utiliza para definir o melhor movimento, a melhor e mais rentável ação.
Tipos de Ambientes - Discretos (vs Contínuos). - Nos ambientes discretos temos variáveis discretas, como tempo, grid, estrutura de dados. - No contínuo temos fatores como aceleração, etc.
Tipos de Ambientes -
Agentes Únicos (vs Múltiplos). Nos únicos você joga sozinho. Nos múltiplos existem mais agentes, que podem jogar: Competitivamente | Para ele ganhar você tem que perder. Colaborativamente | Juntos por um bem comum.
- Os jogos são mais simples que o mundo real, que é bem mais complexo. Por isso é difícil fazer agentes para agirem no mundo real.
Tipos de Ambientes
Tipos de Ambientes
Scripts - Scripts são linguagens de programação bastante simplificadas, escritas especificamente para lidar com tarefas específicas dentro de um jogo, como controle de fluxo de diálogos, controle de ações, entre outras. - Os scripts ficam em arquivos separados do código principal do programa, na forma de arquivos de texto simples. - Para dificultar a alteração desses arquivos de script, alguns desenvolvedores criam compiladores para a linguagem, armazenando os mesmos na sua forma compilada de modo que sua leitura seja irreconhecível ao usuário. - Isto evita que os mesmos sejam alterados com intenções maliciosas.
Scripts - Uma grande vantagem da utilização de scripts é que, conforme o tamanho do projeto aumenta, a alteração de constantes dentro do código fica cada vez mais difícil, já que o tempo de compilação é bastante demorado. - Armazenando essas constantes na forma de scripts, o código em linguagem de programação fica separado do código referente às regras do jogo, e isto permite ainda que pessoas leigas em programação possam ser incumbidas de tal tarefa. - Mas isso não é tudo: - “Uma linguagem script mais avançada aumenta a interação entre o script e o executável, permitindo não apenas inicializar variáveis mas criar a lógica do jogo e até mesmo objetos do jogo, tudo a partir de um ou mais arquivos de script.” (BUCKLAND, 2005)
Scripts | Construção - Para que os scripts funcionem de maneira independente do programa executável, é necessário que este último tenha consigo um interpretador compatível com a sua linguagem. - Este interpretador irá carregar o arquivo de script para inicializar as variáveis dentro do jogo, como no exemplo abaixo:
- O exemplo acima é um pequeno arquivo de script que especifica os atributos de um personagem controlado pelo computador. - Veja o exemplo abaixo:
Scripts | Construção - Repare como a linguagem script pode ser utilizada para controlar aspectos lógicos do computador. Este exemplo utiliza uma linguagem de alto nível, mais próxima à linguagem natural. - Scripts como este requerem maior tempo gasto no desenvolvimento de interpretadores e compiladores para a linguagem, mas permitem a criação de “mods”.
- Mods são extensões de um jogo criadas através de scripts pelos próprios jogadores. Através de sua linguagem, o desenvolvedor pode permitir quais aspectos do jogo o jogador poderá alterar, ou criar, dando a ele a oportunidade de criar novos mundos, armas, inimigos, entre outros. Isto tem sido uma tendência em jogos recentes para aumentar o tempo de duração do jogo e alavancar as vendas. Um grande exemplo de utilização de mods é o jogo Unreal Tournament 2004, da Epic Games.
Movimentação de Agentes - Uma das principais aplicações de IA nos jogos é a movimentação dos NPCs. - Tipos mais comuns: - Padrão (Patterns). Mais simples, como um NPC patrulhando uma entrada que só vai e volta. - Perseguição | Fuga (Chase | Evade). Por exemplo, PAC MAN. Uma hora você está fugindo dos fantasmas que te seguem e, outra, eles que fogem de você. - Planejamento de Caminhos (Planning, Pathfinding). - Mais utilizado. Existe um mapa e você quer que o personagem vá de um ponto a outro. - Desvio de Obstáculos (Steering). Desviar de obstáculos que surgem. - O desvio de obstáculos é feito e aplicado junto com o planejamento de caminhos.
Movimentação de Agentes - A diferença entre o Desvio de Obstáculos e o Planejamento de Caminhos é o Deliberativo (primeiro você planeja, pensa e depois executa) e o Reativo (mais imediato, aparece o obstáculo do nada e você deve desviar). - O Planejamento de Caminho está em um nível mais alto e o Desvio de Obstáculos em um mais baixo.
Movimentação de Agentes - Movimento de Grupo (Flocking, Swarming). - Mover vários personagens em conjunto. - Como uma tropa movida em um jogo RTS. - Possui algoritmos comuns às áreas de Computação Gráfica, Robótica e Jogos. - Estouro da manada de búfalos de o Rei Leão. Utilizaram a técnica de Flocking para a trajetória, não animaram um a um.
Características dos Algoritmos -
Tipo de Ambiente Estático x Dinâmico Parcialmente Observável x Completamente Observável Determinístico x Estocástico Contínuo x Discreto
- Custa de Espaço x Tempo - Ordem de Complexidade (quadrático, linear). - Por exemplo, não adianta fazer o software levar minutos para planejar uma rota pelo fato de o algoritmo ser exponencial. Nesse caso deveria ter uma heurística para funcionar mais rapidamente. - Deliberatovo (pensa demais antes de agira) x Reativo (reações imediatas) x Híbrido.
Características dos Algoritmos - Algoritmo completo. - Se tem um caminho no mapa entre o personagem e o ponto de destino, esse algoritmo é capaz de achar esse caminho. - Algoritmo ótimo. - Acha o melhor caminho possível entre os dois pontos (dependendo da métrica padrão utilizada, pode ser por distância, ou seja, o mais curto, ou o que tenha menos risco, menos inimigos, o que menor gasto de energia, etc). - Normalmente usamos a métrica de distância, calculando o menor caminho.
Campos de Potencial - Surgiu e é muito utilizado na robótica. Aplicação intuitiva. - A ideia é simular que o agente está sujeito a um conjunto de forças, como campo gravitacional, eletromagnético, que será atraído por algumas coisas e repelido por outras. Essas atrações e repulsões faz ele se movimentar de um local a outro. Analogia com a física. - É o Potencial (U) que o faz se mover em determinada direção.
- Neste exemplo o agente está sendo atraído pelo objetivo e repelido pelo obstáculo e, disso, se tem essa trajetória. Mecânica gravitacional, eletromagnetismo.
Gradiente de uma função - Muito usado para desvio de obstáculos, perseguição e fuga, movimento de grupo.
- Você tem seu campo potencial, se deriva esse potencial, ou seja, pegando o gradiente desta função, f. - O gradiente aponta para o maior crescimento da derivada. - O mínimo desta função pode ser encontrado se o gradiente negativo for seguido.
- O gradiente de uma função f em duas dimensões é dado por:
Funções Potenciais
- Ambiente 2D, tenho o obstáculo e a chegada (Go). - Isso é um gradiente. Meu agente é como uma bolinha que, ao soltar, ela escorrega em direção à chegada, desviando do obstáculo, nesse gradiente parabolóide. Independente do local em que eu comece. Isso é o campo potencial, projetado no 2D o objeto vai contornar o obstáculo e chegar ao destino.
Funções Potenciais - É análogo à física. A partir de um campo potencial você gera uma força, que transforma em aceleração, em velocidade, que faz o agente andar. - Deriva o potencial para ter força e a partir da força você integra seu movimento para ter aceleração, velocidade e atingir seu destino.
Funções Potenciais - Problemas que isso pode envolver: Ponto de mínimo local (região onde o somatório das forças é zero). - Se no caso eu tivesse dois obstáculos, o ponto de sela (de equilíbrio instável), você poderia ter uma força atrativa de um lado, uma repulsiva de outro, o somatório das forças seria zero e ele ficaria parado. - Problema: Como transformar o campo potencial em equação matemática para fazer o relevo, modelar esse grid.
- É complexo gerar esse campo potencial.
Funções Potenciais - Normalmente, nestes campos potenciais o go, a chegada, estará no mínimo, mais em baixo. E os obstáculos você pode ter um campo infinito, juntando as partes teríamos o esquema abaixo, como uma curva de nível, curva de relevo. Quanto mais alto, maior o potencial, quanto mais baixo, menor o potencial.
Exemplo de Função Potencial - Lennard-Jones - Modela forças inter-moleculares. - Sua derivada gera forças atrativas ou repulsivas dependendo da distância entre as moléculas. - Derivar a constante de r elevado a n e a de r elevado a m para gerar a equação. - Na derivada eles se repelem, aponta para baixo, até chegar em um ponto em que ela estabiliza e atinge no zero um ponto de equilíbrio e depois se atraem. - Distância e potencial. Para certa distância o potencial é zero, não tem força, moléculas ficam inertes. Diminuindo distância, moléculas se aproximam, tem força atrativa até atingir um ponto de equilíbrio. Se chegar mais próximo elas se repelem.
Exemplo de Função Potencial - O exemplo apresentado era para duas moléculas. O problema é se eu tiver várias. Modelar isso a partir de uma punica função fica muito complexo. Então devo considerar um somatório de forças. - O agente, conforme for se movendo no mundo, será atraído por algumas coisas, repelido por outras. Tratamos essas forças de forma separada e consideramos o somatório das forças para obter a resultante. - Considera-se diretamente um somatório de forças (derivadas de funções potenciais). - Agente segue a força resultante. - Legenda: - Seta verde força atrativa que me leva ao Go. Quando o agente chega perto do obstáculo começa a ter uma força repulsiva (seta vermelha) e ele começa a seguir a resultante, a seta azul.
Potencial Atrativo - Potencial é uma função parabólica: quadrado da distância entre o robô e o goal Potencial atrativo é o quadrado da distância, então a força atrativa é proporcional à distância.
- Converge linearmente para zero: - Força atrativa negativa, maior distância maior atração, menor distância menor atração.
Potencial Repulsivo -
Inversamente proporcional à distância. Funciona como uma barreira ao redor do obstáculo. Mais forte quando está mais próximo ao obstáculo. Não influencia se estiver distante.
- P (q): menor distância para o obstáculo. - Força tende para o infinito quando o agente está muito próximo ao obstáculo.
Potencial Repulsivo - Você gera força para dar aceleração e velocidade ao agente. - F = ma (força é igual à massa multiplicada pela aceleração). - Com isso você pode também simular massas aos agentes, os deixando mais leves ou mais pesados. Os mais pesados são mais lentos. - A partir da aceleração você integra a velocidade e a partir da velocidade você integra que se tenha o deslocamento. - Os agentes se repelem. - Se a força atrativa for muito maior que a repulsiva o objeto tromba com o obstáculo.
Game Loop - Todo jogo funciona com o Game Loop. - Nesse loop o agente faz tudo que tem que fazer, receber as entradas de teclado, computar a física, fazer a parte de IA de tomada de decisões, computar as novas posições dos agentes, executar a nova tela e te mostrar. - A 30Hz, 1/30 segundos normalmente, ele faz o loop 30 vezes por segundo. -
Intervalo de Integração Distância é velocidade x tempo. Cada Delta t multiplicado ele anda mais rápido. Ex: Tem um agente andando e eu tiro várias fotos. Quanto menor o intervalo de integração, mais fotos eu tiro e você vê passo a passo o movimento. Se eu aumento o intervalo de integração, tiro uma foto agora e outra segundos depois e acelero o processo. Mas, durante essa aceleração eu perco informações e posso trombar com obstáculos. Algoritmos de AI estão embutidos no loop do jogo.
Exemplos -
Força atrativa proporcional à distância: F = Ka . d Força repulsiva inversamente proporcional à distância: F = Ka/d Detalhes: Forças repulsivas só estão ativas se ele estiver próximo ao obstáculo d<T É feito uma saturação nas velocidades para evitar velocidades muito grandes (também poderia ser feito para F). Saturação é quando você não quer força ou aceleração muito grande, infinita. Exemplo: simulando um carro que tem aceleração máxima. Faço a força proporcional à distância mas limito, em determinado momento eu saturo. - Cuidado nas escolhas das constantes. - Para caso holonômico (agente que pode se mover em qualquer direção), computa-se Fx e Fy. Posso computar de forma diferente a força no eixo x e y, vejo a resultante e mando para o agente. - Um carro não é holonômico, não pode ir para qualquer direção, tem que fazer manobra, balisa. Carro não anda de lado.
Características dos métodos baseados em potencial - Trabalha em espaço contínuo. - Não é necessária a discretização do ambiente. Já computa as forças, trabalha diretamente, calcula aceleração e anda. - Planejamento e execução de trajetórias. Faz planejamento implícito. A tarjetória é gerada pelas forças e ele usa a resultante das forças para seguir seu caminho. - Campo potencial é vetorial, pode ser pré-calculado e ele segue em tempo de execução. - As forças computadas podem ser utilizadas diretamente no controle do NPC. - Podem ser calculadas em tempo de execução. - A posição dos obstáculos não precisa ser conhecida a priori, ele é completamente reativo, percebe as coisas e reage.
Problema dos Mínimos Locais - Somatório de forças é nulo em uma posição que não é o mínimo da função potencial. - Soluções: - Aplicar forças randômicas (como mais agentes para “empurrarem”, impulsionarem). - Utilizar funções de navegação. Funções potenciais sem mínimo local, garantido. Wavefront Planner.
- U invertido. Esse algoritmo não é completo. No completo, se existe um caminho, ele acha. No do exemplo ele não consegue fazer a volta.
Wavefront Planner - Se o ambiente é conhecido, é possível criar funções potenciais sem mínimos locais, como o Wavefront Planner. - Discretiza o ambiente em um grid. - Células com obstáculos são desconsideradas ou coloca-se um valor infinito. - As demais células guardam sua “distância” para o goal. - A célula em que está o goal é o valor mais baixo do obstáculo. - Usar um algoritmo para ir fazendo uma descida de gradiente, é possível atingir o goal a partir de qualquer célula. - Se constrói uma função potencial de baixo para cima. - Algoritmo de planejamento.
Wavefront Planner | Exemplo - Ambiente:
Wavefront Planner | Exemplo - Primeiro passo, discretizar o ambiente, ou seja, colocar um grid.
Wavefront Planner | Exemplo - Problema, ao discretizar o ambiente, você perde espaço. Tem células em que tenho obstáculos pela metade.
Wavefront Planner | Exemplo - Essas células devem se tornar células ocupadas. No ambiente discretizado os obstáculos descem um pouco. Ou a célula deve ser ocupada, ou livre, não existe meia célula ocupada.
Wavefront Planner | Exemplo - Marquei o Goal com valor zero e faรงo o Wavefront Planner (expansรฃo de frente de onda). Alguns chamam o algotimo de flood field (encher de รกgua uma bacia), outros de grass fire (queimar a grama).
Wavefront Planner | Exemplo - ExpansĂŁo de frente de onda ĂŠ como jogar uma pedra na ĂĄgua e vai expandindo. Os vizinhos do Goal viram valor 1, os vizinhos do vizinho viram 2, os demais 3 e assim por diante.
Wavefront Planner | Exemplo - Expansão de frente de onda é como jogar uma pedra na água e vai expandindo, cresce, a onda espalha. O zero é a pedra que caiu. Os vizinhos do Goal viram valor 1, os vizinhos do vizinho viram 2, os demais 3 e assim por diante.
Wavefront Planner | Exemplo - Ignoro os locais com obstรกculos.
Wavefront Planner | Exemplo - Dessa forma expando minha frente de onda. Cada célula tem um número que, na realidade, é o potencial. Agora trata como potencial. Agente começa em uma célula e desço o gradiente até atingir o Goal.
Wavefront Planner | Exemplo - Por exemplo, o agente começa no 15 e desce para 14, 13, 12, 11, até atingir o Goal. Aqui não tem mais mínimo local. Se eu tivesse o obstáculo em U, o gradiente chegaria por trás, seriam valores mais altos, não entraria naquele local. O problema é conhecer a priori meu ambiente. O segundo fantasminha tem duas opções de caminho da mesma distância, é indiferente.
Exemplo 2 - Meu agente é um quadrado que não passa em algumas áreas do plano. - Um macete é você tratar o agente como um ponto e ampliar todos os obstáculos.
Exemplo 2 - Aplicar o Wavefront sendo o goal o zero. - Essa malha não tem local mínimo, ela tem suas descendências. - Se soltar uma bolinha de gude nesse relevo ela desce até o Goal, os obstáculos são mais altos.
Exemplo 2 - Curvas de nĂvel
Campos de Potencial - Além do uso para planejamento (e execução) de trajetórias, os campos de potencial tem algumas aplicações interessantes em jogos: - Perseguição | O goal passa a ser móvel.
- Múltiplos Agentes - Interações entre os agentes modeladas através de forças. - Inspiração biológica: Swarming, Flocking, entre outras.
Boids - Uma das técnicas mais utilizadas para se movimentar grupos de agentes. - Reynolds, SIGGRAPH 87 - Animação de grupos de pássaros. Simular da forma mais realista sem calcular a trajetória de um para um. - Comportamento emergente (emergent behavior). Não tme muito controle sobre as coisas. Cada agente baseado com a interação de forças com os vizinhos gera o comportamento que o faz navegar pelo ambiente.
- Definição de regras simples para os agentes ao interagir resultam em um comportamento global interessante. - Não há a necessidade de definir uma velocidade global para um grupo, um líder, etc.
Boids -
3 regras: Coesão. Alinhamento. Separação.
Vizinhança - Outras unidades que devem ser consideradas nos cálculos. - Considera-se as unidades que estão em uma área específica por um ângulo e um raio. - Por exemplo, considerar todos que estão a volta, ou só os que estão a frente, etc.
Coesão - As unidades devem ficar juntas em um grupo. - Para isso cada unidade possui a tendência de se mover para a posição média de seus vizinhos. - Quanto mais distante da média, maior será a força nesta direção. - Os vizinhos que influenciam o agente verde são os que estão dentro do círculo branco. Tem uma força aplicada nele que o fará se deslocar para o ponto médio dos vizinhos. - Campo potencial, é atraído para o centróide dos vizinhos.
Separação - Deseja-se que as unidades mantenham uma distância mínima entre si. Serei repelido dos vizinhos em uma determinada vizinhança. - Para isso define-se uma nova vizinhança chama de vizinhança de repulsão. Geralmente a vizinhança de repulsão é menor que a de atração. - Se alguma outra unidade adentrar a esta região especificada, a tendência é dos dois se afastarem. - Basicamente tratamos de campos potenciais também.
Alinhamento - Deseja-se que a unidades se movam de forma geral na mesma direção. Ver qual direção meus vizinhos se movem e tento me mover na mesma direção. - Para isso cada unidade assume um alinhamento que seja igual a média do alinhamento de seus vizinhos. - A correção será proporcional à diferença dos alinhamentos.
Composição de Regras - Resultante | Deve-se normalizar cuidadosamente as três forças de forma a se obter o comportamento desejado. - O trabalho de normalização geralmente é feito manualmente, mas as técnicas de aprendizado também podem ser utilizadas. - Além das três regras: Desvio de obstáculos; - Goal seeking. - VÍDEO PEIXES | Boids | Força e alinhamento - Cardumes andam apenas com suas próprias espécies. - Maior força atrativa dos peixes de sua espécie. Força repulsiva maior entre peixes de espécies diferentes. - Búfalos de O Rei Leão. - Jogos RTF, grupos de agentes.
Composição de Regras - Vantagem: Você não precisa pensar no comportamento complexo do grupo, ele emerge. - Desvantagem: Você não tem muito controle sobre esse resultado. - Você terá um pouco mais de controle sobre isso se incorporar Desvio de Obstáculos, além de desviarem deles mesmos e o Goal Seeking, ir a um goal específico. - Jogos RTS você define um ponto específico para as tropas, mas as interações entre os soldados é por essas definições.
Composição de Regras - Modelar o campo para formarem letras.
Composição de Regras - Algoritmo de resgate.
Representação do Mundo - Trabalhamos as técnicas de campos potenciais em ambientes contínuos mas, normalmente, em jogos os ambientes são discretos, seja por já ter um grid por trás, por trás do algoritmo tenha uma estrutura de dados discreta e a ideia de seu algoritmo é trabalhar sobre essa estrutura discreta. - Necessário representar o ambiente por meio de uma estrutura de dados que permita sua implementação. - A mais comum é o Grafo. - A questão mais importante é como transformar o ambiente em um grafo.
- Duas formas principais: - Pontos (Waypoints). - Células (Navmeshes).
Representação do Mundo - No caso dos Navmeshes o grafo é a união das células.
Grafos - Um gravo é uma coleção de nós (vértices) e arestas: G = (V,E). - Grafo não direcionado x Grafo direcionado. - O grafo forma caminhos possíveis para o agente.
WayPoints - Na representação por Waypoins os nodos do grafo representam posições do ambiente e as arestas os caminhos entre estas posições. Posições físicas, por exemplo, das coordenadas em pixels dos nodos e coloco as arestas ligando estas posições. - Normalmente chamado de Roadmap. - Analogia com o mapa rodoviário. - A princípio nem toda posição está presente em meu grafo, a não ser que cada pixel tenha um ponto. O grafo não preenche completamente o ambiente. Se meu agente está em um ponto que não representa um nodo do grafo, ele tem que encontrar o nodo mais próximo, localizar, ir até ele, navegar no grafo, encontrar o melhor caminho até o objetivo, ponto mais próximo, sair dele e chegar ao goal. - O NPC deve saber “entrar” e “sair” do mapa, e encontrar neste mapa o “melhor” caminho. - Após construído o grafo, passa-se a fazer consultas sobre possíveis caminhos.
Points os Visibility Construção manual de grafos - O grafo é construído de forma que as arestas conectem os pontos nos quais existam linhas diretas livres de obstáculos (line of sight). - Manualmente você clica nas posições, as marca e clica para ir as conectando. Você tem visibilidade entre dois pontos e os conecta. Pode considerar determinada distância, raio. - Em geral construídos manualmente. | Editores de mapas.
Grafo de Visibilidade Geração automática - Tenho o ponto de início, chegada e obstáculos.
Grafo de Visibilidade Geração automática - Cada quina de obstáculos vira um ponto, um nódulo.
Grafo de Visibilidade Geração automática - Se tenho visibilidade entre cada nódulo, eu gero uma aresta. - Ele escolhe as menores arestas e gera o menor caminho possível até o goal.
Grafo de Visibilidade Geração automática - Problemas: - Muitas arestas. A cada novo obstáculo crescem arestas a níveis exponenciais. Você pode restringir, considerar obstáculos só de uma certa distância para gerar arestas. Se não localizar obstáculos aumenta a distância. - Limitado a polígonos. Problema menor. - Agente passa raspando nos obstáculos, pois os nodos estão nos obstáculos. Uma solução possível para resolver isso é aumentar o obstáculo artificialmente. - Solução: - Aumento artificialmente meu obstáculo. É como se eu criasse um obstáculo em volta dele. Posso aumentar em proporção ao tamanho do agente. - Problema, você perde espaço. Tem um limite para aumentar os obstáculos, para ter o espaço de passagem.
Diagrama de Voronoi - Tenho ambiente com pontos e o diagrama é o conjunto de retas equidistantes a esses pontos. - Formalmente é o conjunto de pontos equidistantes a um ou mais pontos. - Decomposição do espaço que leva em conta a distância de um ponto qualquer (x,y) a um conjunto discreto de pontos S. Células de Voronoi.
- As bordas das células serão os conjuntos de pontos mais distantes de S. - Cria-se um conjunto de caminhos que passa o mais distante dos pontos.
Diagrama de Voronoi Generalizado - Diagrama de Voronoi funciona para pontos. - Conjunto de retas e parábolas contendo os pontos equidistantes a 2 ou mais obstáculos. - Caminho com a maior distância entre os obstáculos. Em cima disso grafo um grafo colocando os nodos e arestas.
Diagrama de Voronoi Generalizado - Exemplo de Diagrama de Voronoi com grafo gerado. - Quanto mais arestas colocadas, mais se aproxima as curvas. Aproximação de curvas por arestas. - Vantagem, tenho o caminho que passa mais distante dos obstáculos. - Desvantagens, é complexo gerar o grafo a partir do diagrama de Voronoi. - Mais caro computar o Diagrama e gerar o grafo.
Diagrama de Voronoi Generalizado - Exemplo de Diagrama de Voronoi em cenĂĄrio real, foto de satĂŠlite.
Navmeshes - A ideia é dividir o espaço em regiões simples, convexas, chamadas de células. Mais utilizado em jogos. - As células adjacentes (conectadas) formam um grafo de adjacência. Grafo mostra a conectividade entre essas células. - O nó representa uma célula, não mais um ponto no eixo X e Y, e a aresta entre dois nodos representa uma conexão entre elas. - É possível fazer o planejamento de caminhos em cima desse grafo, com diferença que os NPCs tem liberdade de navegar dentro das células. Diferente do Waypoint em que o NPC só anda em cima dos caminhos. - Em jogos essa técnica tem recebido o nome de Navigation Meshes ou NavMeshes.
Navmeshes - Personagem navega entre as células andando de forma independente dentro delas. Vantagem, trabalhando num nível mais topológico se navega à vontade dentro dessas células convexas.
Decomposição em Células - Pode ser feita de forma manual ou automática. - Muitas vezes o level designer | level artist já decompõe o cenário em polígonos. - As formas tradicionais para decomposição do ambiente em forma automática são: - Decomposição exata. - Grids uniformes. - Quadtrees.
Decomposição Exata - Vai passando um raster, uma linha e cada vez que ele encontra uma quina de obstáculo ele gera uma célula. Começo a andar na horizontal com a linha vertical. - É chamada de decomposição exata porque eu aproveito todo o espaço possível.
Decomposição Exata - É gerado o grafo de conectividade. Arestas ligando as células. Isso não significa que o personagem deve passar por cima desta linha. Aqui está a principal diferença desta técnica e do Waypoint. - A posição pode ser, por exemplo, a mediana entre a célula 1 e a 2.
Exemplo
Decomposição em Grids - Grid Uniforme | Problema, perco espaço, igual no Wavefront. Se tem uma célula parcialmente ocupada por um obstáculo, aquele espaço do grid será totalmente ocupado.
Transformar Grids em Grafos - Tenho o Grid, para cada posição do Grid gero um nodo e para cada conexão eu gero uma aresta. - Posso ter grafo com vizinhança 4, que só conecto na vertical e horizontal ou grafo com vizinhança 8, que também conecto na diagonal.
Decomposição em Grids - No Grid uniforme precisaria de um grafo muito grande para representar esse grid. Inflaciono meu espaço. Como os algoritmos são proporcionais ao tamanho do grafo, ficaria algo muito complexo. - Solução para evitar esse problema é fazer o Quadtree. Grid não uniforme onde as áreas que não tenho obstáculos, tenho mais espaço faço grids de resolução menor, ou seja, quadrados maiores e onde tenho obstáculos faço quadrados menores. Vai dividindo cada quadrante em 4 para diminuir os quadrados e ter assim um grafo de menos conectividades.
Decomposição em Grids - Perda de espaço em grids uniformes e resolução de QuadTree.
Passo a passo - Agente quadrado no ambiente.
Passo a passo - Amplio os obstĂĄculos e trabalhar com agente pontual (o agente passa a ser um ponto). Fica claro que na passagem de baixo o agente quadrado nĂŁo passa, mesmo tendo a abertura, nĂŁo tem o tamanho suficiente. Passagem desapareceu.
Passo a passo - Decomposição em células (exata). Não perde nenhum espaço. Tenho um caminho que passa na metade de cada borda de célula.
Passo a passo - Decomposição em grid (aproximada). Perco espaço.
Mapas Topológicos - Tenho regiões do meu ambiente e o grafo representa as conexões entre essas regiões. - É o que fazemos quando decompomos por células. - Os mapas topológicos guardam informações sobre a conectividade de regiões e ambientes, sem se preocupar com caminhos detalhados. - Uteis para planejamentos de mais altos níveis. - Muitas vezes são construídos manualmente.
Mapas Topol贸gicos - F sem conex茫o, porque tem uma porta.
Pathfinding - Busca de caminhos. Algoritmo de mais alto nível, feito em cima de um grafo. - Jogos usam grafos para mapear ambientes. - Em geral os grafos possuem pesos (custos) em suas arestas para indicar a “dificuldade” de se seguir aquele caminho. - Ex: Distância, tipo de terreno, etc. - É necessário um algoritmo que, dado um grafo com pesos, ache o menor caminho entre dois nós. - Algoritmo mais utilizado é o A* (A estrela). - Acha o melhor caminho, é um algoritmo de busca que utiliza a heurística para localizar esse caminho.
Pesquisa em Grafos - Explora os nodos em sequência em busca de um nó objetivo (ou de um caminho até o nó). - Exemplo: Estou no nó A e quero chegar ao D, faço uma exploração para saber por qual caminho passar. - A ordem de expansão é importante. - Busca sem informação, só se baseia nas características do grafo para fazer a expansão: - Busca em largura (ABCD). Do A passo para os vizinhos (B ou C) e depois para os vizinhos deles, em outro nível. - Busca em Profundidade (ABDC). - ...
-
Busca com informação, busca heurística: A* Além da informação do grafo, uso outra Informação que eu tenha sobre o problema Para criar as possibilidades ...
Algoritmo A* - Um dos algoritmos mais utilizado em jogos para se fazer uma busca de caminhos. - Algoritmo de pesquisa em grafos no qual o próximo nodo a ser pesquisado é escolhido com o auxílio de uma função heurística. - Normalmente envolve ter um conhecimento prévio sobre o problema. - Algoritmo de “busca com informação”: informed Search.
Algoritmo A* -
A escolha do nodo a ser investigado é feita considerando-se: F(n) = g(n) + h(n) g(n) | Custo de chegar ao nó atual. h(n) | estimativa do custo do nó atual para o gol.
- Portanto, f(n) vai ser a estimativa de custo da melhor solução que passa por n. - O A* faz o cálculo do custo real utilizado para chegar até o atual nó com mais uma estimativa de custo para se chegar até o final, dependendo do peso da aresta do grafo. - Expandir o nó de menor custo.
Exemplo - Estamos na Romênia e queremos navegar entre Arad e Bucarest [Russell e Norvig 2003]
- Jogo: Em busca do Conde Drácula. - Possuímos um mapa com as estradas e respectivas distâncias entre as cidades (grafo). - A heurística usada será a distância direta entre qualquer cidade e Bucarest.
Exemplo - Ao lado distância em linha reta de qualquer cidade até Bucarest. - Expandir os nós de menor custo primeiro.
Exemplo - f(n) = g(n) + h(n) - Como comecei nesse nó, o custo real para chegar até esse nó foi zero. - 366 é a heurística em linha reta de Arad até Bucarest.
Exemplo - Considerar os vizinhos de Arad.
Exemplo - O f(n) privilegia Sibiu que está na direção, no caminho de Bucarest. - Zerind eu teria um custo real menor, mas estaria me distanciando de Bucarest, e a heurística me informa isso. - Expando Sibiu, que é o nodo de menor custo total.
Exemplo - Expansão de Sibiu. - Voltar para Arad não faz sentido. - Nesse caso, Arad e Sibiu estão em cor diferente por serem nós fechados, ou seja, já os explorei, já os expandi. - Escolho o de menor custo e o expando.
Exemplo - Expans達o de Rimncu Vilcea.
Exemplo - Lembrando que o f(g) que aparece nos n铆veis posteriores 茅 o somat贸rio das rotas anteriores, o somat贸rio dos custos reais.
Exemplo - Notem que, a partir de Rimnicu V, o melhor caminho é Pitesti, com 417, porém, no nível anterior tinha um 415 em Fagaras. Signifique que talvez o caminho por Fagaras seria melhor. A heurística não é perfeita. A heurística era um pouquinho menor que o custo real.
Exemplo - IMPORTANTE: - Nestes casos, essas rotas que estou escolhendo são um PLANEJAMENTO, ou seja, o meu NPC não está se movendo enquanto eu estou traçando o caminho. Devido a isso não terei um custo para voltar o nó, pois ainda não comecei a andar. Posso sim voltar um nó para replanejar o caminho. - Nesse caso, como Fagaras em um nível anterior acabou apresentando menor f(n), posso voltar ao nível anterior e, agora, expandir Fagaras.
Exemplo - Expans達o de Fagaras.
Exemplo - A partir de Fagaras chego, fim, a Bucarest. A heurística de Bucarest é zero, pois já cheguei lá. E o custo real foi 450.
Exemplo - Cheguei e achei o caminho, mas esse não é necessariamente o melhor caminho. Ainda não acabou. Tenho que explorar todas as alternativas que dê um custo menor que 450. - Por exemplo, ainda tenho uma opção. O custo até Pitest é 417. Quem sabe o custo de Pitest até Bucarest seja, ao fim, menor.
- Só paro quando cheguei ao nó destino e não tenho nenhum nó aberto no grafo com um custo menor do que o valor que achei.
Exemplo - Expando Pitesti. E vejo que de Pitesti atĂŠ Bucarest tenho mais um gasto de 101 que, somado ao custo real para chegar em Pitesti, de 317 me dĂĄ um total de 418.
Exemplo - Ou seja, ĂŠ muito melhor eu fazer o caminho Arad | Sibiu | Rimnicu V. | Pitesti | Bucharest, com um custo de 418 do que o caminho Arad | Sibiu | Fagras | Bucharest, com custo de 450.
Busca A* | Solução - Agora a princípio acabou, pois do custo de 418, não tem nenhum ní aberto com valor menor.
Algoritmo A* - Provavelmente fornece solução ótima se a heurística é admissível, ou seja, o custo indicado pela heurística é menor ou igual ao custo real para o gol. O custo real, no melhor caso, é igual a heurística, isso significa que ela é admissível. - No exemplo, a distância direta entre duas cidades é sempre menor ou igual a distância através das estradas. Logo, a solução encontrada é ótima. A distância euclidiana entre dois pontos é uma heurística admissível. - O fato de a heurística ser admissível me garante que eu possa parar quando encontrar o menor custo, pois nenhum outro nó terá custo menor. - Complexidade depende da heurística. - Pior caso é exponencial no tamanho da solução. - Mas tem como mostrar que a heurística não cairá no pior caso e, assim, a uso com mais segurança.
Algoritmo A* - Uma heurística consistente, que não caia no pior caso segue a lógica do triângulo. Se eu tenho um caminho em linha reta e um caminho que passa por duas arestas de um triângulo, preferencialmente irei pelo que passa em linha reta, é mais curto. É a lógica da distância euclidiana. - Tem situações em que eu expanda um nó e depois tenho que reabri-lo novamente, revisitar esse nó.
Algoritmo A* - No código tem uma lista open e uma lista closed e o algoritmo fica rodando até uma solução ótima ser encontrada.
- A lista open é um rip, uma lita de qualidade onde o primeiro nó é o de menor custo. Tiro ele e investigo, se não for o certo pego os “filhos”, ou “vizinhos” e os incluo na lista open e vou tirando até finalizar o processo.
Outros Detalhes - Existem diversas melhorias e variações de A*, algumas interessantes para jogos.
- Indicação: Survey e paralelismo do A*.
- Várias implementações de A* para pesquisa em grids. - Nodos = quadros do grid. - Arestas = vizinhança (4 ou 8).
Outros Detalhes - O A* apresentado foi o clássico, mas existe variação dele para a ambiente dinâmico. - Por exemplo, fiz o planejamento até Pitesti e percebo ao chegar que a estrada até Bucharest está fechada por desmoronamento.
Outros Detalhes - N찾o preciso recomputar tudo novamente. Existe uma vers찾o do algoritmo A*, o Z* que consegue recomputar s처 uma parte do grafo e me indicar um desvio local que me leve ao destino.
Outros Detalhes - Existem versões paralelas do A*. - Existe o A* em tempo real, pois em um grid com milhares de nodos, embora o A* pareça rápido, pode ser meio demorado computar o A*. Mesmo que eu não caia no pior caso, pelo tamanho do espaço, do grid, pode ficar muito caro. E o jogo está rodando a 30 frames por segundo. Posso querer uma solução em tempo real. Bateu o clock, o personagem deve andar naquele momento e preciso da melhor solução para aquele momento, mesmo que não seja a solução ótima. - Any Time, lhe fornece a solução no momento em que você precisa, você pede. - E diversas outras variações. - Heurística em grid: Distância de Manhatan, a soma das distâncias dos quadrados verticais e horizontais, sem considerar os obstáculos.
Comportamento dos NPCs - Basicamente o “comportamento” define quais ações o NPC deve tomar em um determinado momento do jogo. - Tomada de decisões: - Sob fogo inimigo, o NPC deverá atirar, se esconder ou fugir? - Dada a decisão, qual a melhor ação do meu agente. - Apesar do grande potencial, a maioria dos jogos comerciais usa algoritmos simples: - FSM, sistemas baseados em regras, etc. - A IA acadêmica já estuda os algoritmos mais complexos, mas eles ainda não estão sendo implementados na indústria de jogos.
Máquinas de Estados Finitos (FSM) - É um grafo. Cada nodo do meu grafo modela o comportamento de meu NPC e cada aresta modela a mudança de comportamento. Estou andando, vejo um inimigo e mudo para estado correndo. Estou andando, vejo munição e mudo para buscar munição. - Uma das abordagens mais utilizadas para modelar comportamentos em jogos. - Ideia Geral: O NPC vai estar em um dentre vários estados possíveis e pode mudar de estado quando certas condições são satisfeitas.
- O estado determina o comportamento. - As transições modelam as mudanças de comportamento.
Exemplo clássico: Pac Man - Fantasma fica andando aleatoriamente pelo labirinto, pelas bifurcações. Se ele vê o Pac Man e o percebe passa a perseguir. Ocorreu uma condição (Pac Man ficou visível) e houve uma transição de estado (perseguir). Se o Pac Man sair da área visível, o fantasma volta ao movimento aleatório.
Exemplo clássico: Pac Man - Se em algum momento o Pac Man comer a pílula azul, o fantasma começa a fugir até ser comido ou, depois de um certo tempo (tempo máximo), o fantasma volta ao movimento aleatório. Apesar de ser extremamente simples e utilizado, parece que o fantasma tem um certo nível mínimo de inteligência. A transição de estados é uma variação de expressão lógica que pode ser baseada na percepção do agente. Se comer a pílula, se acabar o tempo, se ficar visível.
Exemplo clássico: Pac Man - Posso ter ações específicas que ocorrem na transição. Mudar a cor do fantasma, fazer ele piscar (era uma falha do sistema isso, na realidade). Na transição zero o cronômetro, faço ele piscar, etc.
Máquinas de Estados Finitos - Vantagens: - Intuitivas: - Facilita iteração com roteiristas, artistas, etc. Pessoas que não precisam saber os algoritmos, mas conseguem entender os contextos. - Comportamentos tratados separadamente. - Modelagem e testes mais simples. Pode testar um por um os comportamentos.
Máquinas de Estados Finitos - Extremamente simples de codificar. - Um computador, por exemplo, é uma máquina de estado finito. Ou seja, uma máquina que guarda meu estado. - O estado corrente é armazenado em uma variável. - No game loop de acordo com o estado corrente, diferentes ações são implementadas (switch). Uma ação para um estado. Por exemplo, se meu estado é “corre”, movimenta o personagem de uma forma, se é “persegue”, movimenta de outra. Se o estado é “ficar parado”, não movimenta o personagem. - Um “if” que faz uma condição para cada estado. - Uma sequência de testes (if) é feita para as mudanças de estado (ou utilizar uma tabela de mudança de estados). Uma sequência de estados que muda o estado. - Múltiplas FSM (máquinas de estado finito) distribuídas: uso de eventos e mensagens. Por exemplo, se um fantasma achar algo, você pode ordenar que ele mande uma mensagem, os outros recebam e mudem também.
Demais exemplos - Quake Bots |FPS|Persegue, atira, procura saúde, abriga, foge. - Fifa (e outros jogos de esporte) | Chuta, dribla, persegue a bola, marca jogador. - Comportamentos do time de mais alto nível: defesa, ataque, etc. - Por exemplo, dentro do comportamento defesa você pode ter uma máquina de estado finito para cada agente. O atacante faz tal coisa, o meio campo outra, etc. Hierarquia de estados finitos. - Pode ter uma máquina de estado finito para um comportamento “persegue” em que, se eu estiver longe velocidade diminui, perto ela aumenta, etc. - RTS (Star Craft, Age of Empires) - Move para posição, patrulhar determinada área, segue um caminho.
Foraging - “Busca de Alimento” - Paralelo com quando as formigas vão buscar alimentos. - Jogo RTS | Agentes devem varrer uma área em busca de “alimentos” ou “tesouros” e levá-los ao abrigo. - Estado EXPLORAR (andar aleatoriamente pelo cenário), achando tesouro vou ao tesouro, achando o goal vou ao goal. - Funções Potenciais + FSM - Random, atração pelo tesouro, atração pelo goal. -
Diferentes estratégias. Sem memória. Sem comunicação. Memória e Comunicação.
Foraging - Podem dois agentes acharem o tesouro, os dois irão. O último que chegar não encontra mais o tesouro e volta ao movimento aleatório. Peguei o tesouro mudo ao estado “levar ao goal”. Chegou lá, deixa o tesouro e volta ao movimento aleatório.
Foraging - Campos potenciais. Em Movimento aleatório ele é atraído para locais aleatórios do mapa, em busca pelo tesouro é atraído pelo tesouro e em levar ao goal é atraído pelo goal. Só muda para onde ele está sendo atraído. Algo assim simples já gera um comportamento inteligente.
Foraging - Posso colocar memória em meus agentes. Por exemplo, enquanto ele carrega um tesouro, passa por outros e guarda essas posições na memória. Assim que entregar no goal, ele já busca de levar ao goal para busca de tesouro, indo ao ponto que ele havia detectado anteriormente.
Foraging - Posso ter comunicação entre os agentes. Um encontra vários tesouros e envia aos demais que estão em movimento aleatório para buscarem os tesouros.
Foraging - VocĂŞ pode ter um jogo em que o guarda persegue os bandidos e os bandidos devem fugir do guarda, por exemplo.
Extensões - Hierarquias (modularização). - Estados podem ser decompostos em conjuntos de estados. -
Máquinas de Estados não determinísticas. O mesmo evento pode levar a diferentes estados. Adicionam imprevisibilidade. Isso resolve um problema da máquina de estado finita que é ficar sempre na mesma coisa, mesmo comportamento e acabar ficando tudo previsível e “chato”, por ser repetitivo.
Extensões - Por exemplo, em jogo FPS, contra fogo inimigo ele deve se esconder ou revidar. Pode dar uma aleatoriedade a isso e variar, algumas vezes ele revida, outras vezes ele atira. - Por probabilidade: esconde 10% das vezes e atira 90%. - Isso adiciona “personalidade” ao agente, sendo um “covarde” que mais esconde e um “suicida” que mais revida. - Coloco probabilidade nas transições e deixo a máquina não determinística. - Autômato finito não determinístico | O mesmo caractere pode levar o agente a estados diferentes. - A mesma transição saindo para estados diferentes é esse não determinismo.
Árvores de Decisão - Mais simples que máquinas de estados finitos. - A ideia é codificar o conhecimento em uma árvore, nos quais os nodos internos são “perguntas” sobre o estado do agente e do mundo (decisões) e as folhas são as ações. - Vantagens: simples, rápidas e intuitivas. - Desvantagens: pode ficar complexa, estática, comportamentos previsíveis. - Extensões: aprendizado, aleatoriedade. - Clássico na década de 70 e 80 em vários sistemas, como diagnóstico médico. - Está com febre, sim ou não. Cansado, sim ou não. Dores, sim ou não. Disso se tira o diagnóstico.
Exemplo FTS - O que é feito em árvore de decisão pode ser feito em máquina de estados finitos, ambos consistem em fazer perguntas sobre o estado do agente.
Exemplo FTS - Árvore de decisão é chamada de Sistema Especialista, pois precisa de um especialista para montar isso. Por exemplo, no caso do diagnóstico é o médico. - Você pode ter um agente que veja as informações sobre o jogo, note os padrões de comportamentos e lhe dê dicas durante a partida. - Incorporar o conhecimento na árvore. - A desvantagem da árvore é que você depende do especialista para montar a árvore e ela fica complexa, difícil de gerenciar se tiver que modelar todo o jogo nela, fica imensa. - Falta aleatoriedade, mas você pode incluir. - Existem algoritmos para fazer aprendizado de árvore de decisão e aprender a árvore a partir do que ocorreu (exemplos), ao invés de montar tudo.
Rule Based Systems - De forma mais geral, FSMs e Árvores e decisão podem ser considerados simplificações de um Sistema Baseado em Regras.
- Rule Based Systems | Definição informal - Conjunto de regras no estilo if-then que são utilizadas para fazer inferências em uma base de conhecimento e decidir quais ações tomar. - Temos a estrutura de banco de regras, a de memória de trabalho. Consulto a memória de trabalho me dá a situação de jogo, consulto as regras de estados para realizar o comportamento. - Permite realização de inferências. Situação atual do mundo está na memória de trabalho, o conhecimento do especialista nas regras e consulto. - A base de conhecimento pode ser alterada dinamicamente para incluir novos fatos. - Permite a realização de inferências muito mais complexas. - Década de 70-80: sistemas especialistas.
Rule Based Systems - Mem贸ria de Regras - Regras no estilo if-then que operam sobre os fatos armazenados na mem贸ria de trabalho. - Mem贸ria de Trabalho - Armazena fatos conhecidos e conclus玫es tiradas a partir das regras.
Rule Based Systems - Funcionamento Geral - As regras são “disparadas” a partir de fatos presentes na memória de trabalho, e com isso novos fatos (asserções) são armazenados na memória. - Exemplo: memória de trabalho guarda posição do personagem. Memória de regras testa, se posição do personagem é X, move ele para Y. - Condição verdadeira, dispara a regra e executa a ação da regra que altera a memória de trabalho, movendo o personagem. - Pega memória de trabalho, dispara as regras com base nos fatos da memória de trabalho e novos fatos são incluídos nela, fica em loop.
Mecanismo de Inferência - Forward Chaining | Encadeamento Direto - Verifica-se qual das regras casa com a informação atual da memória de trabalho. - Deve-se resolver eventuais conflitos caso mais de uma regra case (árbitro). - Escolher a primeira, aleatoriamente, pesos, etc. - Dependendo da implementação, escolher mais de uma se resultados não forem conflitantes. - Regra escolhida é disparada. - O processo é repetido até que todas as inferências possíveis com os dados fatos tenham sido feitas. - Vai atualizando a memória de trabalho com os resultados das regras.
Mecanismo de Inferência - Backward Chaining - Não muito utilizado em jogos. - Funciona de maneira inversa. - A partir do resultado, tenta-se determinar quais regras foram disparadas para chegar até ali. - Em vez de sair da condição para resultado, se vai do resultado para a condição, se tenta inferir. - Normalmente o Backward Chaining é recursivo e mais difícil de implementar, por isso não é usado em jogos.
Mecanismo de Inferência - Exemplo simples | Forward Chaining - Jogo RTS. Quer inferir o estado do jogador. Em verde é a memória de trabalho. Em determinado momento tenho um pedreiro e 650 de ouro. - Tenho uma regra que se tenho um pedreiro e mais de 500 de outro, construo um castelo. Diminui a quantidade de ouro em 500 pepitas e tenho o castelo. - Fico com 150 de ouro e um pedreiro. - Na memória de regra penso que, se alguém tem um castelo, cria soldados e dispara a regra. A partir da ´memória de trabalho vejo quais regras disparam e atualizo a memória.
Mecanismo de Inferência - No modo inverso, o Backward Chaining, sei que para ter um castelo com certeza tenho um pedreiro e mais de 500 de ouro. - Caminho inverso. Com certeza tal regra foi disparada. - Para teoremas faz sentido, para jogos não muito, se usa a cadeia direta. - Posso implementar isso a partir de uma Árvore de Decisão, de máquina de estado finito, mas o método mais formal é a partir de um sistema baseado em regras. Ele facilita para implementar como banco de dados, consultar e usar “select” e SQL para saber se condição é verdadeira.
Mecanismo de InferĂŞncia - No sistema baseado em regras, se as consultas aos bancos de dados e regras forem muito complexas, ele se torna mais caro e difĂcil de ser implementado ao jogo.
RBS | Conclusão - Rule Based Systems são interessantes quando o problema pode ser representado por if-then rules e não é grande. - Vantagens: muito estudado em IA. - Permitem a criação de comportamentos mais complexos. - Desvantagens: - Pode ser lento dependendo do tamanho do problema. - Requer um especialista para montar a base de conhecimento. - De repente você não precisa de uma complexidade de um RBS para resolver o problema, uma máquina de estado finito já resolve.
Lógica Nebulosa - Sair da lógica booleana, em que tudo é verdadeiro ou falso. - Lógica Nebulosa permite ter um certo grau de verdadeiro ou falso. - Permite resolver essa dificuldade linguística em modelar um problema em verdadeiro ou falso. - Maior grau de liberdade para definir as coisas. Por exemplo, a temperatura do ambiente hoje não precisa ser quente ou fria, pode ser um meio termo. - Muito frio, frio, agradável, quente, muito quente. - A lógica nebulosa (Fuzzy Logic) surgiu como uma alternativa para essas situações.
- Não substitui a teoria da probabilidade, que trata a incerteza das coisas. - Hoje a IA está estudando muito os casos de probabilidade, mas isso não tem nada a ver com Lógica Nebulosa.
Jogo de Golfe - Se a bola está longe do buraco e o terreno é levemente inclinado da esquerda para a direita, bata na bola forte e numa direção um pouco à esquerda da bandeira. - Se a bola está muito perto do buraco e o terreno é plano, bata na bola gentilmente e diretamente na direção do buraco.
- Aqui deixo as coisas em aberto, não determino “se distância for maior que X.” - Isso não traz a necessidade de ficar codificando tudo, como “if” xxxxxx, “then” yyyyy; “if” zzzzzzzz, “then” wwwwww. - Resolve a linguística.
Jogo de Golfe -
Uma possível definição de distância seria: Muito perto: <1m. Perto: 1 – 3m. Média: 3 - 5m. Longe: 5 – 7m. Muito longe: > 7m
- Isso não é bom, pois dependendo do detalhamento que quero, isso pode ser infinito. - Como classificar a distância 4,99m? Está dentro da distância média, mas quase longe. É um médio-longe? - A Lógica Nebulosa faz uma transição suave entre esses conjuntos. Ao invés de algo pertencer somente a um conjunto, do tipo está perto ou longe, ela pode dizer que está mais para médio que para longe. 55% médio e 45% longe, por exemplo. A partir disso faz inferências e facilita a lógica do jogo.
Lógica Nebulosa - Surge em 1965 por Lotfi Zadeh. - É uma forma de representar problemas nos computadores de uma forma que nós, seres humanos, pensamos. - Nós não somos booleanos. Não somos tão lógicos, usamos coisas menos discretas e mais contínuas. - A essência da Lógica Nebuosa é uma questão de grau. O grau de pertencimento. - Muito perto, perto, médio, longe, muito longe. - 4,99m está mais para longe do que para médio. Faz mais parte do conjunto longe do que do conjunto médio.
Lógica Nebulosa - Exemplo, controle de ar condicionado: - ~Quente é negação, not quente. - Gray Area é uma Área Nebulosa. Transição suave entre os dois estados (conjuntos nebulosos). 15º com certeza é ~Quente, 30 com certeza é quente, mas 26 pode ser 40% ~Quente e 60% Quente, etc. - Não é completamente verdadeiro, nem falso. - Controlador do ar condicionado booleano seria o bang bang, que liga e desliga, liga e desliga. No nebuloso se tem o controlador de termostato.
- Lógica Nebulosa permite diferentes graus de verdadeiro e falso.
Lógica Nebulosa - A princípio qualquer coisa que você representa com Lógica Nebulosa se consegue representar com Lógica Booleana. - Tradicionalistas em lógica argumentam que lógica booleana pode ser utilizada para representar as mesmas coisas. - Vários atributos: T21-24, T25-27, T27-30, T30-33. - Fazer os intervalos ficarem cada vez menores. - Com isso, o número de regras em um Rule Based System é muito maior. - 50% a 80% maior.
Lógica Nebulosa | Processo de Inferência - Crisp | Valor claro. Por exemplo, o valor da temperatura hoje, de 28,6º. - Pego esse valor e o transformo, faço a fuzzificação, que é o processo que transforma esse valor claro e absoluto em um grau de pertencimento dos conjuntos. Por exemplo, falar que esse valor de temperatura é meio quente e meio médio.
Lógica Nebulosa | Processo de Inferência - A partir do momento em que se tem os conjuntos “fuzzificados” você faz a inferência, aplica as diversas Regras Nebulosas. Tal valor disparará tais regras. - A partir do resultado de aplicação dessas regras você terá um novo conjunto nebuloso que você poderá fazer a defuzzificação para, se necessário, transformar em um valor Crisp.
Lógica Nebulosa | Processo de Inferência - Por exemplo, tem um jogo de corrida e você quer fazer o controle do volante. Você tem um sensor que dá uma distância em metros e um ângulo em graus do carro da frente. Transformo a distância em metro para um conjunto booleano, para saber se ele está perto, longe, muito perto, etc. Os ângulos transformo em um conjunto booleano para saber se está mais à esquerda, direita, muito à esquerda, um pouco à direita. - Terei regras nebulosas da seguinte forma: se o adversário está perto e o ângulo é muito à esquerda, vire um pouco o volante à direita. Se está perto e em frente, vire muito à direita. Esse resultado é um conjunto nebulosos. - Depois terei que fazer a defuzzificação para transformar esse “vire MUITO à direita”, “vire POUCO à direita”, em um conjunto de graus que fará o carro andar.
Lógica Nebulosa | Processo de Inferência - Peguei o valor claro, transformei em conjunto nebuloso, fiz as inferências em cima desses conjuntos nebulosos através das regras nebulosas e faço a defuzzificação.
Conjuntos Claros | Crisp -
Exemplo: Universo (U): números inteiros entre 1 e 15. Pares = {2, 4, 6, 8, 10, 12, 14} Ímpares = {1, 3, 5, 7, 9, 11, 13, 15} 2 pertence aos pares, 3 pertence aos ímpares.
-
Operações: União. Interseção. Complemento.
Conjuntos Nebulosos -
Conjuntos Crisp não são adequados em várias situações práticas. Exemplo: Teste de QI. Abaixo = {70, 71, 72, ..., 89} Mediano = {90, 91, 92, ..., 109} Inteligente = {110, 111, ..., 129}
- Como comparar os QIs 89 (abaixo) com 90 (mediano), 91 e 109? - Um passo faz você sair de um conjunto e pertencer a outro. - Os conjuntos nebulosos permitem que os elementos pertençam a diferentes conjuntos. Grau de pertencimento a um determinado conjunto. - Partial Membership. Exemplo: o 89 é meio abaixo, meio na média.
Membership Functions - Transforma uma entrada Crisp em uma entrada nebulosa. Transforma o valor absoluto em conjunto, em grau de pertencimento ao conjunto. - As funções irão indicar o grau daquela entrada para um determinado conjunto nebuloso. - Definem uma transição gradual. - Mapeiam a entrada em valores 0.1. - Virtualmente qualquer função pode ser utilizada. - Esse processo é chamado de Fuzzification.
Membership Functions - Na lógica booleana eu tenho simplesmente um degrau. Ou o QI é abaixo, ou é mediano. Ou está frio, ou está quente. - A Lógica Nebulosa dá essa transição mais sutil.
Funções Típicas
Membership Functions - Modelo o gráfico das funções do Teste de QI.
Membership to Fuzzy Sets - Todos de QI abaixo de 80 são 100% “burros”. Começa a virar mediano. QI 100 é completamente mediano. Depois deixa de ser mediano e vai passando a ser inteligente. QI 120 é inteligente. - As demais são todas transições.
Membership to Fuzzy Sets - Funções nebulosas são um grau de pertencimento de um determinado valor no conjunto. - A função de 115, por exemplo, no conjunto mediano é 0,25. O valor de 115 no conjunto inteligente é 0,75.
DOM - VocĂŞ tem um DOM | Degree of Membership - O grau de pertencimento do valor. Por exemplo, o de 115 ĂŠ 25% mediano e 75% inteligente.
Fuzzyficação - Esse é o processo de fuzzyficação, pega o valor absoluto, no caso 115 e transformo nos graus de pertencimento em cada um dos conjutos.
Dicas para uma boa escolha - De forma a fazer transições suaves a soma das DOMs deve ser próxima de 1. - Não colocar mais de dois conjuntos para cada valor de X. - Não faz muito sentido ser mais de um conjunto ao mesmo tempo, a pessoa no caso seria burra, mediana e inteligente ao mesmo tempo. - A transição é sempre de um conjunto para outro.
Operadores - Como qualquer lógica, posso ter operações sobre elas. - Pode ter AND (e), OR (ou), NOT (negação). - Mediano AND Inteligente.
Operadores - Quando você tem os graus de pertencimento, o AND é o mínimo e o OR o máximo.
Operadores - O AND de mediano e inteligente ĂŠ, entĂŁo, o menor valor, ou seja, 0,25.
Operadores - O inverso para o OR. - Mediano OR Inteligente.
Operadores - O OR é o maior dos dois. - Lembrança do OR Lógico, em que o OR de duas variáveis verdadeiras é verdadeiro. - O OR de um verdadeiro e um falso é verdadeiro, é o maior de 1 e 0, enquanto AND é o menor de 1 e 0. AND de 1 e 0 é 0. - Operador OR Nebuloso é o máximo do grau de pertencimento de dois conjuntos.
Operadores - O NOT é o menos. - Por isso é ideal deixar a soma próxima de 1 para aplicar o NOT.
Operadores - Nesse caso o NOT Inteligente ĂŠ 1 menos o F de inteligente. - 1 â&#x20AC;&#x201C; 0,25. - E assim monto minhas vĂĄrias regras nebulosas.
Regras Nebulosas - If A then B | Se A, então B. - A é chamado antecedente ou premissa, condição. - B é chamado consequente ou conclusão. -
Exemplos: If Perto and Tem_Munição then Atira Se está perto e tem munição, então atire. If Longe then Faz_Nada Se está longe, então não faça nada.
- Uma variável que mede a distância e outra que mede a munição. - Na hora da inferência, por exemplo, ele substitui esse “perto” pelo grau de pertencimento da variável crisp no conjunto perto. - No Tem Munição ele pega o grau de pertencimento da variável munição e substitui no conjunto Tem_Munição.
Regras Nebulosas - Em seguida pega o AND dos dois, o menor valor e dispara o consequente ATIRA, que receberá o valor de A. - Diferentemente da lógica booleana, A vai ter valores entre 0 e 1, não será só verdadeiro ou falso. - B vai receber o mesmo valor de A. - Se tenho determinado valor na condição, meu consequente, conclusão terá o mesmo valor. - Se o resultado do AND, por exemplo, for 0.3, tenho o Atira em um conjunto nebuloso de 0.3. - No caso do jogo de corrida, vira muito, médio, o volante com valor 0.3, 0.2.
Regras Nebulosas - As regras são disparadas com um certo grau. - Após a aplicação de todas as regras, pode-se ter diferentes graus para a conclusão (não é só true ou false, ele carrega os valores, como 0.3). Inferência Nebulosa Para cada regra: Para cada Antecedente, calcular seu grau. Calcular a Conclusão. Combinar os resultados para determinar o conjunto nebuloso (Fuzzy Associatuon Matrix – FAM). Matriz de Associação Nebulosa. Se desejada uma saída crisp fazer a defuzzificação.
Exemplo - Temos um lançador de granadas, e queremos saber quando ele é útil, de forma a escolhe-lo e usá-lo na hora certa. -
Variáveis (FLVs | Fuzzy Linguistic Variables) Antecedentes: Distância par ao alvo. Ex: 200 pixels. Quantidade de munição. Ex: 8 granadas.
- Conclusão: - Utilidade. Pode ser muito útil, mais ou menos útil e pouco útil.
Exemplo - Primeiro passo, construir os conjuntos nebulosos. - No caso utilizando o software MathLab.
Exemplo - Distância menor que 50 é completamente perto. Começa transição que deixa de ser perto e começa a ser médio, e vira longe. - Menos de 10 granadas e é baixo, acima de 30 é completamente carregado, etc.
Exemplo - O de baixo é o conjunto nebuloso de Utilidade, para fazer a Defuzzyficação. - Se o resultado for maior de 70% de utilidade é útil, entre 25% e 75% serve e abaixo de 25% é inútil
Exemplo | Regras - Próximo passo são as regras. - Lançador de granadas é mais útil à média distância. Perto pode matar.
Exemplo | Regras - Poderia colocar, por exemplo, que se está perto é inútil, independentemente de qualquer outra coisa.
Exemplo | Regras
Exemplo | Inferências - 200 pixels de distância com 8 granadas. - Usar lançador de granadas? - Pelo gráfico anterior vemos que 200px é 0,33 de longe. E 8 granadas é 0, pois está distante de carregada. - Inferência:
Exemplo | Inferências - Inferência:
- Regra 1: Longe 0.33 AND Carregada 0, o AND é o mínimo, então é 0. Essa regra não foi disparada, deu 0. - A Regra 2 disparou o inútil com 0,33.
Fuzzy Association Matrix (FAM) - Gerei a Matriz de Associação Nebulosa. Ela indica qual regra disparou com qual valor.
Fuzzy Association Matrix (FAM) - Ela n茫o dispara regras com valor 0. S贸 quatro regras dispararam.
Exemplo: Agregação - Considerar apenas as regras “disparadas”. - O valor obtido pode ser considerado como um nível de confidência daquele resultado. - Útil = 0.67 - Serve = 0.2 - Inútil = 0.33 - Max das duas que dispararam. Pode usar o mínimo, a soma ou alguma média. Por exemplo, a regra Inútil disparou duas vezes, considero a maior delas, a média, etc. Considerei o maior, o Max das duas.
Exemplo: Agregação - Volto ao gráfico de saída e tento observar os valores, jogá-los no gráfico.
Exemplo: Resultados Graficamente - Pego os valores e traรงo no grรกfico direto. Cortar no grรกfico anterior onde as utilidades servem.
Exemplo: Defuzzificação - Agora, voltando às etapas anteriores, quero obter um valor Crisp daquele conjunto.
Exemplo: Defuzzificação - Uma das formas de Defuzzificar é fazer o centro de massa dos gráficos. Somo os três. A massa maior está para o útil.
Exemplo: Defuzzificação - Processo de obter um resultado Crisp a partir de um conjunto nebuloso. -
Vários métodos: Centróide (centro de massa do exemplo). FOM | First of Maximum (primeiro dos máximos). MeOM | Mean of Maximum (média dos máximos). RCOM | Random Choice of Maximum (escolha randômica dos máximos). - Etc.
Exemplo: Defuzzificação -
Centróide. O método mais preciso mas também o mais complexo de calcular. Computa-se o centróide (centro de massa) do conjunto. A utilidade é de 58,9%
Exemplo: Defuzzificação - Na prática peguei todos os valores Crisp, joguei no arcabolço do Conjunto Nebuloso e o resultado final, após fazer a Defuzzificação é um que me dá a utilidade. - Você pode ter um threshold, se a utilidade for maior que 60% usa, menor não usa, usa moderadamente. O que faz com o resultado depende da aplicação.
Exemplo: Resultado Final - No resultado final você pode traçar um gráfico que me dá o valor da defuzzificação para todos os valores possíveis de entrada.
Exemplo: Resultado Final - Eixo X munição, eixo Z distância, eixo Y utilidade. - Note que, se eu estou perto, pequena distância, a utilidade é sempre baixa. Começo a afastar, utilidade vai subindo até que uma distância média é meu melhor valor de utilidade, depois vai caindo.
Exemplo: Resultado Final - Distância média e muita munição representa meu máximo de utilidade. - Aumenta distância ou diminui a munição, a utilidade cai.
Lógica Nebulosa - A lógica nebulosa me permite tratar o problema de uma forma menos estrita. Não se limita a true ou false. Posso modelar meu problema fazendo estas inferência de “se”, “e”, “então”. - O resultado fica mais perto do que acostumamos a fazer na vida real.
Lógica Nebulosa | Aplicações em Jogos - Controle de Movimento. Jogos e Robótica. - Para onde virar o NPC? -
Tomada de Decisão | Inferência Qual decisão tomar frente ao estado atual? Exército inimigo: pequeno, médio, grande... Distância: muito longe, longe, perto... Conclusão: pouca ameaça, média ameaça... Ação: número de exército a enviar para defesa.
- Classificação - Ex: Determinar um Ranking para os seus NPCs.
Outros Tópicos de IA para Jogos - Aprendizado. Ao invés de eu especialista ficar montando árvore de decisão, sistema de regras quero que o sistema aprenda.
- Player Modeling. Determinado tipo de aprendizado. Modelar o jogador e adaptar a IA de acordo com o jogador. Principalmente em jogos difíceis como Poker (ambiente parcialmente observável, não determinístico, pois depende do fator de sorte de tirar as cartas e ainda tem o blefe). - Técnicas “modernas”. Estudadas pela IA acadêmica mas ainda não tão implementadas em jogos. - Redes neurais, algoritmos genéticos (otimização, melhorar performance do personagem, faz gerações de personagem e faz a seleção natural deles para ter o melhor NPC para determinado jogo. Seleção natural no FPS é a quantidade de vezes que morre. É como a genética. Dois indivíduos fortes gera descendente forte, dois fracos gera um fraco e a seleção natural o elimina. Vou combinando os indivíduos para ter o descendentes), redes bayesianas (probabilidade, ambiente incerto, muitas variáveis).
Outros Tópicos de IA para Jogos - Personalidade | Emoções. Agente corajoso, medroso, etc. - Interactive Storytelling. Usar IA não para coordenar agentes, mas para coordenar o enredo do jogo, alterar de acordo com o andamento. Controlar a narrativa do jogo. - Arquiteturas | APIs | Engines de IA. Algo que facilite IA para jogos, da mesma forma que hoje a GPU facilita a implementação gráfica em jogos. Dois PCs seguem padrão e conseguem comunicar, se alguém fizer um software que segue um padrão poderia usar no meu sistema. Ainda não se conseguiu criar isso, muitas nuances existem. - Jogos Clássicos. Teoria dos jogos. No poker, como lidar com incerteza, coordenar inteligência, ação da dupla no truco e buraco.
- Etc.
Redes Neurais - A humanidade sempre desenvolveu máquinas para nos auxiliar. - Elas aperfeiçoam nossa potência ou velocidade, reduzindo o tempo de trabalho ou aumentando nossa força. São poucas as máquinas que fazem o que o ser humano não faz, mas todas fazem o que fazemos de uma forma muito mais eficaz.
- Recentemente, principalmente a partir da Terceira Revolução Industrial, com o desenvolvimento de computadores e a implantação de sistemas informatizamos no trabalho, muitos pesquisadores vêm desenvolvendo máquinas para nos ajudar a pensar melhor. - Conseguimos até agora, com bastante eficácia, melhorar nossa força, nosso rendimento, nossa velocidade, mas mal arranhamos a capacidade de melhorar nossa inteligência. Isso acontece principalmente porque mal conhecemos como ela funciona.
Redes Neurais - Muitas pessoas defendem que a inteligência é fruto do pensamento lógico e desenvolveram vários sistemas lógicos diferentes, culminando na criação dos computadores. - Outras pessoas defendem que a inteligência humana é fruto de como nosso cérebro é organizado.
- Esse grupo desenvolveu, na década de 1940 e 1950, a teoria das Redes Neurais. - Essas redes eram tão promissoras, que vários pesquisadores acharam que isso não daria certo ou esse modelo nunca alcançaria as previsões feitas até então. - Durante mais de 20 anos, as pesquisas sobre redes neurais caíram em descrédito e mais ênfase foi dada à computação lógica conhecida e utilizada atualmente.
Redes Neurais - Porém, de um tempo para cá, principalmente devido ao avanço das neurociências, as pesquisas sobre redes neurais foram retomadas e muita coisa foi desenvolvida. Existem pesquisas, por exemplo, para o desenvolvimento de neurocomputadores. Para se entender melhor o que são as Redes Neurais e como seria os computadores baseados nelas, vale à pena conhecer como funcionam os neurônios.
O comportamento dos neurônios - Os neurônios são as células que formam o nosso cérebro. Elas são compostas basicamente por três partes: os dendritos, que captam informações ou do ambiente ou de outras células, o corpo celular ou Soma, responsável pelo processamento das informações, e um axônio, para distribuir a informação processada para outros neurônios ou células do corpo. Só que uma célula dificilmente trabalha sozinha. Quanto mais células trabalharem em conjunto, mais elas podem processar e mais eficaz torna-se o trabalho. Logo, para o melhor rendimento do sistema são necessários muitos neurônios.
Os neurônios às redes neurais - Foi pensando em como os neurônios trabalham que pesquisadores desenvolveram neurônios artificiais. Cada um tem dois ou mais receptores de entrada, responsáveis por perceberem um determinado tipo de sinal. Eles também possuem um corpo de processadores, responsável por um sistema de feedback que modifica sua própria programação dependendo dos dados de entrada e saída. Finalmente, eles possuem uma saída binária para apresentar a resposta “Sim” ou “Não”, dependendo do resultado do processamento. - Um neurônio artificial tenta imitar o comportamento de um neurônio natural.
Os neurônios às redes neurais - Um neurônio artificial é capaz de um único processamento. Cada entrada recebe somente um tipo de sinal ou informação. Como um neurônio pode possuir várias entradas, então ele pode perceber diferentes sinais. Porém, ligar vários neurônios similares em rede, faz com que o sistema consiga processar mais informações e oferecer mais resultados.
- Por exemplo, é possível criar um sistema para identificação de bananas e maças. Para tal, cria-se neurônios sensíveis a cor e forma. Os de cor percebem o amarelo e o vermelho. Os de forma percebem o redondo e o comprido. Cada neurônio, então, possui quatro entradas, uma para cada informação.
Os neurônios às redes neurais - Para obter um melhor rendimento do sistema, cria-se uma rede em camadas: uma primeira camada com quatro neurônios (um para cada sinal de entrada), uma segunda camada oculta de processamento com três neurônios e uma camada de saída com dois neurônios, um para avisar quando é uma maça e outro para avisar quando é uma banana.
- O segredo não está na arquitetura dessa rede, mas na forma como ela processa: Redes Neurais não rodam programas, elas aprendem!
Os neurônios às redes neurais
O aprendizado das redes neurais - Não existe uma programação pré-definida dos neurônios artificiais, como existem nas portas lógicas utilizadas nos circuitos computacionais. Ao invés disso, eles possuem um sistema de feedback que modifica sua programação. Cada informação processada gera um peso, dependendo do resultado. Se for um acerto, ela ganha um ponto, se for um erro, ela perde meio ponto.
- Dessa forma, a rede neural do exemplo acima testa várias vezes a percepção do objeto. A cada acerto, os neurônios envolvidos no processamento ganham um ponto e aquela rede é reforçada. A cada erro, esses neurônios perdem meio ponto. Dessa forma, o sistema cria a rotina de seguir o caminho com mais pontos sempre. Quanto mais tentativas, mais aprimorado fica o sistema, chegando, ao final de um processo de aprendizado, a executar tarefas quase sem erro algum.
O aprendizado das redes neurais - A grande vantagem disso é que para executar tarefas, uma rede neural não precisa guardar instruções de comando e executá-las de forma lógica, como num computador tradicional. Ao invés disso, a rede aprende o que é preciso ser feito e executa a função. Dessa forma, uma mesma rede, se ela for capacitada com os neurônios necessários para tal, é capaz de executar várias funções diferentes, independente de espaço de memória.
O aprendizado das redes neurais - Isso porque em uma mesma rede é possível criar várias regras diferentes. No exemplo acima, podemos ainda ensinar a rede a detectar bolas amarelas ou bastões vermelhos, utilizando os mesmos neurônios e as mesmas regras. - A diferença é q precisaríamos capacitá-las com neurônios de saída extras para cada nova informação que queremos dela e outros neurônios ocultos para facilitar o processamento. - Mas isso não implica em criarmos novas regras ou novas programações, somente em ensinar o sistema e executar novas funções utilizando a mesma rede existente. - Em sistemas mais elaborados, uma rede neural consegue aprender qualquer função que uma pessoa possa saber e não há limites para a quantidade de informação que ela possa processar.
Inteligência Artificial | IA - As redes neurais são principalmente utilizadas para criar sistemas de inteligência artificial. - Os computadores tradicionais podem fazer isso de forma simulada, mas sua principal função é seguir regras ou comandos oferecidos pelo usuário.
- Assim, a inteligência artificial gerada por computadores tradicionais são simulações de inteligência real, ou seja, apresentam respostas segundo regras e comandos de um programa pré-estabelecido.
Inteligência Artificial | IA - Acontece que a verdadeira inteligência não é a capacidade de seguir regras, mas sim a capacidade de resolver problemas. Mais inteligente é o sistema que consegue resolver problemas diferentes de forma eficaz. - Baseado nisso, temos então duas formas diferentes de inteligência artificial, ou IA, a simbólica e a conexionista. - A IA simbólica simula o comportamento inteligente. Ela é baseada em uma programação que indica quais respostas devem ser dadas diante de determinados comandos. - Essa IA é a utilizada em programas “inteligentes”, como corretores ortográficos ou simuladores dos mais variados.
- A questão é que esses programas dificilmente aprendem coisas novas, somente se você incluir novas programações. Essa é a IA mais comum.
Inteligência Artificial | IA - A IA conexionista simula a estrutura do cérebro, pois acredita-se que a inteligência está na forma de processar informação e não na informação processada. - Como o sistema do cérebro é inteligente, usa-se tal modelo para desenvolver IA. Assim, os sistemas de IA baseados em redes neurais conseguem aprender com seus erros e executar diferentes processos, independente de instruções.
As Redes Neurais e o Perceptron - Não só pensando nisso, mas principalmente tentando desenvolver melhores formas de inteligência artificial, alguns pesquisadores começaram a estudar o funcionamento dos neurônios. - Em especial, Frank Rosenblatt pesquisou a estrutura da retina humana. Ela é composta por vários neurônios sensoriais, responsáveis por perceber as cores e as formas. - Cada um desses neurônios transmite uma resposta em rede para vários outros neurônios que então enviam suas informações para o cérebro para finalmente processá-las e transformá-las em imagens. - Essa é a base de funcionamento dos neurônios artificiais, que levaram ao desenvolvimento do Perceptron.
As Redes Neurais e o Perceptron - O Perceptron foi a primeira máquina criada para processamento de informação feita sobre o sistema de redes neurais. - Ele foi o primeiro sistema de processamento pequeno o suficiente para ser usado por uma pessoa, diferente dos computadores da época que ocupavam salas enormes com seus processadores. Ele foi considerada por muitos como o pai do computador pessoal. - Atualmente, o Perceptron é conhecido como a forma de processamento de informação baseado em redes neurais. Ele é construído com neurônios artificiais, formando redes de processamento. Uma rede dessas é chamada de Perceptron.
As Redes Neurais e o Perceptron
Diferenças entre Computador e Perceptron - A melhor forma de compreender a singularidade desse sistema é compará-lo ao computador. - Talvez a característica mais marcante de um Perceptron seja que ele não executa programas, mas os aprende. Em um computador, instalase instruções de comando que formam um programa. Em um Perceptron, treina-o para executá-los. - As informações não são gravadas, mas aprendidas. - Um computador funciona a partir da execução de operações lógicas, rodando programas que podem - Ser reduzidos à combinação de procedimentos de lógica booleana. Por sua vez, um Perceptron é capaz de processos não-lógicos, comparações e transformações, pois seus sistema não é condicionado a um funcionamento lógico e linear.
Diferenรงas entre Computador e Perceptron
Diferenças entre Computador e Perceptron - Ao mesmo tempo, um Perceptron é capaz de múltiplos processamentos e testes de hipóteses em paralelo, enquanto computadores funcionam com um processamento em cada circuito de cada vez. - Isso faz com que a velocidade de processamento do Perceptron seja muito maior do que a de um computador tradicional. - Finalmente, um computador está preso à sua programação. - Ele só executa aquilo que foi programado. - Enquanto isso, um Perceptron pode perceber novas possibilidades, aprender com as tentativas e erros e apresentar novos resultados.
Diferenças entre Computador e Perceptron - Sabe-se que nenhuma máquina é capaz de superar a inteligência humana. - Muitas são capazes de vários processamentos por segundo, de calcular inúmeras possibilidades, mas nenhum computador é capaz de aprender com seus erros. - Já os Perceptrons nos mostram que podemos construir máquinas realmente inteligentes, capazes de aprender, de errar, de melhorar e principalmente, que não são presos a programações que podem falhar.
- O que limita uma máquina dessas é sua própria experiência. - Aliado a isso e ao uso de nanotecnologia, podemos esperar grandes avanços nos computadores e na forma como entendemos a mente humana. O que virá disso tudo, só o futuro pode dizer.
RNs - Foi só recentemente que as redes neurais, ou RNs, começaram a ser utilizadas em jogos comerciais. - Devido à falta de recursos disponíveis tanto nos PCs quanto nos consoles das gerações passadas, era preferível utilizar técnicas mais simples e determinísticas na implementação da IA.
- Mas conforme o tempo foi passando, tanto a quantidade de memória quanto de processamento disponível evoluiu muito, e agora é cada vez mais comum o uso das redes neurais em jogos.
RNs - As redes neurais são baseadas no modelo de ligações entre neurônios dos seres vivos, onde que cada neurônio possui três partes básicas: dendrito, corpo celular e axônio. - O cérebro possui aproximadamente 100 bilhões desses neurônios, que se comunicam através de sinais eletro-químicos.
- A troca de informações entre neurônios é denominada “sinapse”, que é a ligação entre o axônio de um neurônio com o dendrito de outro. - Quando um neurônio recebe um sinal, ele executa uma espécie de “cálculo”, que, ao ultrapassar um limiar, dispara o neurônio, e este envia um sinal ao próximo neurônio da rede, através de seu axônio.
RNs
O neurônio artificial - Redes neurais são formadas por vários neurônios artificiais. Um neurônio artificial é modelado à semelhança de um neurônio biológico. - Cada neurônio possui um conjunto de entradas, uma função de ativação e uma saída.
- Cada entrada do neurônio possui um peso associado. - O número de neurônios do qual a rede é formada depende da tarefa que ela irá desempenhar, podendo variar de poucos neurônios (3 ou 4) a milhares deles. - Em aplicações da vida real, as RNs são utilizadas no reconhecimento de padrões, categorização, aprendizado, competição, autoorganização, entre outras áreas.
O neurônio artificial - Uma vez criada a rede, ela deverá ser treinada para que funcione da maneira esperada. Treinar uma rede neural nada mais é que ajustar os pesos, ou seja, a força entre suas conexões. - Cada peso está associado a uma entrada do neurônio, e é representado por um número de ponto flutuante negativo ou positivo (exercendo influência excitatória ou inibitória) na entrada. - Quando uma entrada é apresentada ao neurônio, ela é multiplicada pelo seu peso.
- O neurônio então soma todas essas entradas, gerando um valor de ativação. Se este valor for maior que um certo limiar, o neurônio gera um sinal de saída, que dependendo da topologia da rede pode ser a saída desejada, ou uma saída que servirá como entrada para outro neurônio.
O neur么nio artificial
Redes neurais | Vantagens - As principais vantagens das redes neurais são: - • tolerância a falhas: as redes neurais podem ser treinadas para reconhecerem padrões distorcidos e até mesmo incompletos, além serem capazes de operar, até certo ponto, mesmo quando parte da rede for danificada; - • compatibilidade com a tecnologia atual: é possível treinar uma rede para executar uma tarefa especializada e depois implementá-la em um hardware de baixo-custo. Assim, elas podem ser facilmente inseridas em sistemas existentes;
- • auto-organização: redes neurais possuem uma capacidade de aprendizagem adaptativa, auto-organizando as informações recebidas. Isto permite que a rede responda satisfatoriamente mesmo quando forem apresentadas informações novas.
Redes neurais em Jogos - Até o momento, não existem técnicas para modelagem de uma rede com inteligência complexa (ao nível de um animal, por exemplo), mesmo sendo possível, com a tecnologia de hoje, montar uma rede com milhares de neurônios. - A maioria das aplicações atuais de RNs utilizam cerca de uma dúzia ou mais neurônios, e elas são feitas para desempenhar tarefas específicas. E em jogos isto não é diferente. Redes neurais são usadas em conjunto com outras técnicas, executando tarefas que necessitam um certo grau de aprendizado ou para realizar tarefas em que as unidades controladas pelo computador sejam menos previsíveis.
Redes neurais em Jogos - Uma das redes mais utilizadas em jogos é a rede feedforward de três camadas. - Ela é assim chamada devido ao fato de seus neurônios enviarem suas saídas à próxima camada até que seja obtida a saída final da rede.
Redes neurais em Jogos - A rede possui uma camada de entrada, uma camada escondida e uma camada de saída. - Não há restrições quanto ao número de neurônios em cada camada, e a quantidade ideal deles depende do problema a ser resolvido. - Cada neurônio da camada de entrada é ligado a todos os neurônios da camada escondida, e cada neurônio da camada escondida é ligado a todos os neurônios da camada de saída. - Maiores detalhes sobre o cálculo de funções de ativação, bem como de outros tipos de RN pode ser encontrados em FREEMAN 1991.
Redes neurais em Jogos - A rede poderia ser utilizada, por exemplo, para controlar a direção de uma unidade, tendo como entrada as informações enviadas por seus sensores visuais e como saída, para qual direção a unidade deve seguir. - Observe que apenas a parte da tomada de decisão é controlada pela RN. Para a movimentação pode-se utilizar um algoritmo simples de perseguição e fuga. Veja abaixo uma ilustração para o problema.
Mapeando o Problema - Toda rede neural recebe como entrada um conjunto de números reais. O problema ocorre quando precisamos utilizar outros tipos de valores de entrada, como enumerações e valores lógicos verdadeiro/falso –o que é comum na implementação de jogos.
Mapeando o Problema - O mapeamento pode ser feito utilizando os valores 0 (zero) para o valor lógico “falso” e 1 (um) para o valor lógico “verdadeiro”. - Quando a variável for uma enumeração, utiliza-se um vetor de entrada, sendo que cada posição do vetor possui valor 0 ou 1. - Por exemplo: se temos uma variável enumerada que pode assumir os valores “espada”, “revólver” e “canhão”, por exemplo, teríamos um vetor de três posições com os valores “{0, 0, 1}”, caso o valor desta variável seja “canhão”, por exemplo (aqui assumimos que as variáveis se excluem mutuamente, não podendo assumir mais de um valor ao mesmo tempo). Se a enumeração tivesse um valor “revólver”, o vetor de entrada seria “{0, 1, 0}”.
Mapeando o Problema - Quando nosso problema já se encontra no domínio contínuo, apenas precisamos enviar suas variáveis como entrada na rede neural. - Deve-se atentar para entradas com diferenças acentuadas entre seus elementos. - Por exemplo, se uma rede possuir uma entrada com valor 20 e outra com valor 200, pode-se obter um valor influenciado pela entrada de maior valor. Para tal problema, pode-se dividir ambas as entradas pelo maior valor (200), obtendo valores em termos percentuais.
Algoritmos Genéticos - A pesquisa em algoritmos genéticos, assim como as redes neurais, é outra área da IA influenciada pela biologia. Ela é baseada nos estudos sobre a evolução das espécies, de Charles Darwin, moldando a população de indivíduos através da sobrevivência dos membros mais aptos a viver naquele ambiente. - No mundo real, as espécies evoluem constantemente na tentativa de melhor se adaptarem aos seus ambientes. Os seres mais “fortes” e capazes de sobreviver passam adiante suas características para a próxima geração. Tais características são codificadas nos cromossomos. A geração resultante é fruto da combinação de dois cromossomos da geração atual, num processo denominado crossover. Nessa combinação podem ocorrer mutações aleatórias, e, se estas mutações contribuírem para a sobrevivência da espécie, elas serão também passadas para as gerações futuras.
Algoritmos Genéticos em Jogos - No desenvolvimento de jogos, os algoritmos genéticos visam a busca de uma solução ótima para um determinado problema. Cada um dos indivídios mencionados anteriormente são possíveis soluções para o problema em questão. - Geralmente, os algoritmos genéticos são utilizados quando se deseja uma IA que atue mesmo em situações não previstas pelo desenvolvedor, como em tomadas de decisão de acordo com o comportamento do jogador. Para problemas como o do pathfinding, (nos quais já existem algoritmos sólidos para sua resolução) não é recomendado o uso dos algoritmos genéticos, pois estes são mais custosos computacionalmente. - A implementação dos algoritmos genéticos em jogos pode ser dividida em quatro etapas, que são a inicialização da população, validação da aptidão, seleção e evolução.
Algoritmos Genéticos em Jogos - 1) Inicialização: primeiramente, é preciso definir um modo de codificar os cromossomos da população de criaturas de IA que iremos criar. Esta codificação pode ser feita de maneira simples, utilizando um vetor de caracteres; cada índice do vetor pode representar uma característica do ambiente externo e o valor contido nesta posição representa a ação que a criatura deverá executar.
- Exemplo: Suponha que a população de criaturas controladas pelo computador tenham que responder de acordo com a arma em uso pelo jogador (espada, arco, lança e machado), e as respostas possíveis são: usarEscudo (1), ataqueComEspada (2), fugir (3), esconder (4) e ataqueComArco (5). Então os cromomossomos destas criaturas serão representados por um vetor de quatro posições, onde a posição 1 contém o identificador da ação a ser executada caso o jogador tenha uma espada, a posição 2 será executada caso o jogador tenha um arco, e assim por diante. Cada posição do vetor assume um valor de 1 a 5.
Algoritmos Genéticos em Jogos - Na etapa de inicialização, espera-se obter uma população com alto grau de variabilidade genética, portanto atribui-se valores aleatórios para os cromossomos. Veja o exemplo da tabela abaixo.
- Definidos os métodos de codificação dos genes da população, inicializamos ela conforme descrito acima, com valores aleatórios para os cromossomos das criaturas. Note que o exemplo acima possui apenas quatro situações possíveis. Numa aplicação real poderíamos ter um número muito maior de situações a considerar.
Algoritmos Genéticos em Jogos - 2) Validação da aptidão: nesta etapa do processo evolucionário, deve- se avaliar quais indivíduos da população são os mais aptos a resolver o problema em questão. Para isto, utilizamos uma função de avaliação de aptidão (também denominada função fitness). - Para o exemplo acima, uma boa função avaliação é contabilizar a diferença entre o dano que a criatura causou ao jogador e o dano recebido. - As criaturas com a maior aptidão segundo esta função terão a maior probabilidade de passar seus genes à geração seguinte.
Algoritmos Genéticos em Jogos - 3) Seleção: nesta etapa é utilizada a função calculada na etapa anterior para que sejam escolhidos os indivíduos que participarão do processo evolucionário. - Na vida real, geralmente dois pais contribuem com seus cromossomos para a geração seguinte. Já no mundo dos jogos, podemos escolher qualquer número dentre os melhores indivíduos (segundo a função de aptidão).
Algoritmos Genéticos em Jogos - 4) Evolução: nesta última etapa, serão criados os novos indivíduos que serão introduzidos no ambiente do jogo. São selecionados os melhores indivíduos e combinados seus genes no processo de crossover. Aqui também são introduzidas mutações aleatórias. Observe a tabela abaixo.
Algoritmos Genéticos em Jogos - Observe que no terceiro cromossomo do indivíduo resultante (terceira linha da tabela) a característica não foi herdada de nenhum dos pais. Isto é resultado de uma mutação aleatória. Por exemplo, na hora do crossover, podemos fazer com que a característica resultante tenha, digamos, 5% de chances de ser gerada aleatoriamente, ou seja, não estando presente em nenhum dos indivíduos da geração anterior.
Algoritmos Genéticos em Jogos - Agora o algoritmo retornará à segunda etapa, e a cada iteração, serão criados indivíduos mais aptos a enfrentar o jogador em diferentes situações. - A implementação do algoritmo genético é resumida abaixo, em pseudo-código.
Flocking - É bastante comum na implementação de jogos a necessidade de prover uma movimentação em grupos para personagens controlados pelo computador, principalmente em jogos de estratégia e RPG. Estes grupos podem ser de animais, pessoas, unidades de combate, entre outros. É claro que também é possível implementar esse tipo de movimentação com scripts bem elaborados, mas a utilização de flocking elimina a necessidade de criar um script para controlar cada criatura do jogo –ao invés disso, precisamos de apenas um script para controlar o grupo como um todo. - Um algoritmo básico de flocking foi apresentado por Craig Reynolds, em seu artigo de 1987 intitulado “Flocks, Herds, and Schools: A Distributed Behavioral Model”. A idéia principal do algoritmo é fazer os NPCs moverem-se de maneira coerciva, como se houvesse um objetivo em comum –o oposto de se ter várias unidades movendo-se de maneira independente, sem coordenaçao alguma.
Flocking - Para determinar a direção resultante de cada unidade, cada unidade controlada pelo flocking mantém informações sobre outras unidades em um raio circular de tamanho pré-definido, centrado na própria unidade. Este raio é denominado “ráio de vizinhança” (neighborhood radius) (BUCKLAND, 2005). Ainda segundo BUCKLAND, flocking também é bastante utilizado em filmes, como em “Batman Returns” e “O Senhor dos Anéis”.
Flocking - As três principais regras que regem o algoritmo de flocking são: separação, alinhamento e coesão: - • separação: é uma força que faz com que as unidades mantenham certa distância uns dos outros, evitando colisões com seus vizinhos; - • alinhamento: mantém a direção de cada unidade alinhada à direção de seus vizinhos. Isto é feito calculando-se a média dos vetores de direção de cada vizinho e subtraindo-se desta média a direção atual da unidade. O resultado é a direção que a unidade deve seguir para manter-se em rumo com seus vizinhos; - • coesão: é um tanto similar à regra anterior, mas neste caso a unidade dirige-se ao centro de massa (posição média) de seus vizinhos. A média é calculada levando em consideração o vetor de posições dos vizinhos. O vetor resultante é o centro de massa da vizinhança e indica a posição à qual a unidade deve se dirigir.
Flocking - Flocking é considerado uma área de estudo da Artificial Life, ou simplesmente A-Life (vida artificial). - “[...] Artificial Life (Alife) basicamente procura estudar a vida e suas propriedades no computador –criando a vida digitalmente dentro do computador, simulando-a ou ambos. Alife pode ser especialmente interessante para pessoas de outras áreas como a teoria do caos, pois muitos aspectos são comuns entre ambas as áreas. ” (MATTHEWS, 2002, trad.nossa). - Para emular a vida, a A-Life faz uso de técnicas como algoritmos genéticos, flocking, sistemas baseados em regras, entre outras. O comportamento das criaturas é dividido em problemas menores, que são mais tarde unidos por uma hierarquia de decisões que cada uma delas possui, determinando que ações devem ser feitas para satisfazer suas necessidades. Segundo Woodcock (2000):
Flocking -
“[...] as interações que ocorrem entre comportamentos de baixonível, explicitamente codificados e as motivações/necessidades dos personagens causa o surgimento de um comportamento de alto-nível, mais ‘inteligente’, sem qualquer programação explícita ou complexa.”
Conclusão - A área de Jogos Digitais está crescendo muito tanto na indústria quanto na academia. - Especificamente, o desenvolvimento da IA para jogos está na sua infância. - Jogos permitem trabalhos multidisciplinares, dentro e fora da computação.
ReferĂŞncias
Contatos grupoceanus.com.br nandexramos.com.br Facebook http://www.facebook.com/nandex.ramos