Como deve ser a estrutura multitarefa dinâmica e interruptível?

5

Estou tentando fazer uma AI que jogue um jogo. Na verdade, estou brincando com o StarCraft e o MineCraft, que são tipos completamente diferentes de jogos. Além disso, uso linguagens de programação diferentes para ambos, e um é multi-threaded (java), outro single-threaded controlado por evento (Node.js).

Apesar de todas essas diferenças, enfrento o mesmo problema: como posso criar uma IA que possa lidar com tarefas em uma ordem sensata, mas também interromper as tarefas em casos de necessidade e retornar a elas mais tarde? Como criar uma cadeia de tarefas sensível (onde uma tarefa causa outra subtarefa)?

Exemplos acima podem ser:

  • No minecraft, você está cavando um bloco e é atacado por um monstro
  • No starcraft você está liderando um ataque e uma posição crítica na sua base é atacada
  • No minecraft, a tarefa de cortar árvores é causada pela tarefa de construir a casa - o bot deve lembrar por que está fazendo o que está fazendo.
  • No starcraft, certos edifícios são construídos apenas para desbloquear tipos de soldados

Eu estava apenas brincando com a ideia, mas continuei escrevendo e excluindo código completamente estúpido ...

Isso é o que tenho agora, mas não faz sentido. Eu posso ver muitas situações que não serão resolvidas usando este modelo.

/***
 *  Task pseudo class. After finishing the task, this task notifies the parent task.
 *  Arguments:
 *    action - function callback that will execute. The callback must call the finished() method in the end. The callback will receive
 *             this task's object as a first argument.  
 **/   
function Task(action, parent, name) {
  this.action = action;
  this.after = after;
  this.name = name||"Void task";
}

Task.prototype.start = function() {
  console.log("Task started...");
  try {
    this.action(this);
  }
  catch(e) {
    console.log("The task action has thrown an error: "+e);
  }
}
Task.prototype.finished = function() {
  console.log("Task over.");
}
//Override this
Task.prototype.pause = function() {};

Eu tenho medo de ler muito sobre isso. Mas há algumas ideias gerais conhecidas com as quais posso começar?

    
por Tomáš Zato 09.07.2015 / 22:16
fonte

2 respostas

4

Você está criando um agente de inteligência artificial, geralmente chamado de Intelligent Agent (IA) ; seu 'ambiente' é o jogo, seus 'sensores' são funções programáticas que reúnem entradas, seus 'atuadores' também são funções que produzem o teclado / controlam os processos do jogo como entrada.

De acordo com o meu conhecimento, se você estiver escrevendo uma IA artesanal, uma máquina de estados (SM) é provavelmente a melhor maneira de começar; e provavelmente você obterá o maior resultado para seus esforços.

A criação manual de um SM permite codificar prioridades nos estados e / ou transições de estado. Um sinal de perigo pode causar uma transição para um estado de defesa e, quando o perigo tiver sido resolvido, você poderá retomar o estado anterior. Alternativamente, você poderia apenas fazer a transição para o próximo estado de prioridade mais alta. Isso pode deixar um objetivo inacabado, mas isso pode ser aceitável. Por exemplo, pode não ser eficiente voltar para onde você estava se o encontro perigoso tiver deslocado a posição da IA para outro local; ou seja, reavaliar qual estado a transição com base no contexto atual é provavelmente a coisa correta a se fazer.

O Handcrafting de um agente só o levará até certo ponto, em essência, você transferirá sua experiência e seu conhecimento para o agente. Por isso, você só poderá transferir uma fração do seu conhecimento para o agente. Esse processo será difícil, demorado e propenso a erros, e seu agente nunca jogará "melhor" do que você, já que só tem um subconjunto do seu conhecimento sobre o jogo.

A alternativa para criar manualmente um agente, é construir um Agente Aprendizado, ou seja, um baseado no Aprendizado de Máquina.

Um sistema de aprendizagem precisa de uma função de objetivo , também chamada de função de perda, que precisa codificar muitas coisas:

  • metas
  • sobrevivência
  • recompensas
  • penalidades
  • ...

O sistema de aprendizagem tentará maximizar a função objetivo; basicamente, a função objetivo diz ao agente como está indo bem.

Existem muitos algoritmos de aprendizado para escolher para executar seu sistema de aprendizado, mas existem apenas algumas categorias:

Alguns algoritmos de aprendizado incluem:

Estes métodos não são mutuamente exclusivos, ex. pode-se implementar o aprendizado por reforço com uma rede neural. E esses métodos / algoritmos precisam ser utilizados / combinados de alguma maneira não trivial para criar um agente. Pode-se até querer combinar uma solução aprendida com uma solução artesanal; por exemplo, use funções aprendidas para melhorar e / ou guiar sua solução artesanal, por exemplo, usando um classificador para ajudar a escolher transições de estado.

Eu incluí esta seção para que você possa ter um ponto de partida para pesquisar uma solução Aprendida para o seu problema.

    
por 10.07.2015 / 00:12
fonte
2

Seus manipuladores de eventos devem ser rápidos, como iniciar uma ação de jogo e registrar e manipular eventos para fazer a próxima ação quando a ação for concluída. Nenhum manipulador de eventos deve aguardar o tempo do jogo para que uma ação do jogo seja concluída. No MineCraft, quando você inicia a mineração de um bloco, você solicita um evento quando a mineração termina, e você pode receber um evento antes que um monstro esteja atacando. No Star Craft, você dá a uma unidade uma ordem para mover / atacar / construir algo e pedir um evento quando essa tarefa é concluída. Enquanto aguarda a ocorrência desse evento, você pode receber um evento diferente em que sua base está sob ataque ou outra unidade concluiu sua tarefa e precisa de novas ordens.

Ao organizar suas ações de alto nível em ações realmente rápidas e de baixo nível, acionadas por eventos, você permite que eventos relevantes para outras ações de alto nível apareçam no meio.

    
por 09.07.2015 / 22:45
fonte