2013-12-12 1 views
1

Я читаю this excellent article on how to create a state machine for ai purposes. К сожалению, у меня возникли проблемы с пониманием того, как расширить конечный автомат, указанный ниже. Псевдокод для этого примера, как представляется, задать конечный автомат для действия для текущего состояния:AI, State Machine - как расширить конечный автомат для обработки нескольких монстров?

do_stateless_ai(statemachine[action][currentstate]); 

Что это значит, если мне нужно реализовать несколько монстра AIs?

Я могу создать одну реализацию конечного автомата и просто загрузить ее с помощью разных таблиц состояний, как показано ниже?

или

ли я код уникальные автоматы для каждого монстра?

или

ли я создать одну массивную таблицу состояний, если у меня есть несколько монстров? Извините, если этот вопрос кажется очень дилетантским, это первый раз, когда я пытаюсь реализовать ИИ.

Вот искусственный интеллект таблица состояний описана в статье:

DRAGON AI (частичного)

State: Obs: Action:   input L input M input H NULL 

    SLEEPING L asleep-ai  WAKING:1    HUNGRY:1 
    WAKING C none      ENRAGED:1 HUNGRY:1 CURIOUS:1 
    ENRAGED C typical-ai, p1         WAKING:1 
    HUNGRY C typical-ai, p2    ENRAGED:1 
    CURIOUS A curious-ai     ENRAGED:1 HUNGRY:1 BORED:0.1 

А вот псевдокод для реализации этой машины:

acted = 0; 
while (!acted) 
{ 
    observe(statemachine[obs][currentstate]); 
    shifted = 0; 
    for (inputs=FIRSTINPUT; inputs < LASTINPUT && !shifted; inputs++) 
    { 
     if (input_is_true(input)) 
     { /* note that what's stored in the statemachine is an expression, 
      not necessarily just a number. getshiftprob substitute in 
      values from the monster's extrinsic info and solves the expr.*/ 
      probshift = getshiftprob 
       (statemachine[input][currentstate].probshift); 
      if random() < probshift 
      { 
      currentstate = statemachine[input][currentstate].state; 
      shifted = 1; 
      } 
     } 
    } 
    if statemachine[action][currentstate] != NULL 
    { 
     do_stateless_ai(statemachine[action][currentstate]); 
     acted = 1; 
    }  
} 

ответ

0

Если вы используете одну гигантскую таблицу, тогда вы оказываетесь в одном гигантском AI, контролирующем все непосредственно. Но подумайте немного о том, как будет выглядеть эта таблица и реализация, даже для двух агентов - подумайте о комбинации состояний и наблюдений и о том, насколько велика эта таблица для двух или трех агентов. Я думаю, вы придете к выводу, что это не реально. Это может быть даже нежелательно.

Если у вас несколько таблиц, у вас есть несколько агентов, которые все независимо контролируются и имеют более разумный размер. Для меня не очевидно, почему вам нужен уникальный механизм для каждого агента. Даже если вы хотите различное поведение, а это означает разные таблицы, вы все равно сможете придумать какую-то общую инфраструктуру, которую вы можете легко персонализировать.