
- •Филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования «Национальный исследовательский университет «Московский энергетический институт»
- •Нейросеть
- •Алгоритмы обучения с надзором и без надзора
- •Продукционные правила и базы знаний
- •Автоматы
- •Одномерная табличная схема «стимул-реакция»
- •Марковские цепи дискретного времени
Автоматы
Несмотря на свою простоту это метод оказывается очень эффективным и применяется во многих играх. Для определения такой системы нужно задать два ключевых элемента: множество состояний и множество правил перехода системы из одного состояния в другое. Состояния имеют вид наподобие: иду, стою, стреляю, бездельничаю и т.д. Правила перехода: если ИДУ и вижу врага, тогда начинаю СТРЕЛЯТЬ; если ИДУ и устал, тогда нужно немного поСТОЯТЬ, отдохнуть.
Рассмотрим небольшой пример. Пусть нам нужно придумать ИИ для солдата, который держит дубину и патрулирует местность. Для простоты будем считать, что на местности нет никаких препятствий, а солдат ходит по четко определенному маршруту (ключевым точкам). Итак, какие действия он может выполнять? Первое, конечно — ходить по прямой от одной контрольной точки к другой. Введем еще состояние поворота от одной точки по направлению к следующей. Плюс, конечно же, каждый уважающий себя солдат должен уметь преследовать жертву и молотить ее дубиной.
Теперь нужно разобраться с правилами изменения состояний. Ходьба: если увидел врага — переход в состояние преследования; если пришел в нужную точку — начать поворот к следующей. Поворот: увидел врага — преследовать; если повернулся на достаточный угол — начать ходьбу. Преследование: врага не видно — разворот к нужной точке (возврат к патрулированию); подошел достаточно близко к противнику — начать бой. Бой: враг отошел дальше — преследовать; враг исчез (умер, сбежал) — поворот. Вот и все. Когда уже определены все состояния и переходы, закодить такую систему не составит большого труда.
Теперь немного о преимуществах и недостатках. Из преимуществ можно назвать относительную простоту в понимании, написании и отладке небольших систем, а также высокую производительность в работе. Недостатки: при большом количестве состояний и переходов реализация превращается в настоящий кошмар; такие системы трудно расширять — логика состояний и переходов жестко зашита в коде системы.
Конечные автоматы являются, пожалуй, одной из самых старых (и проверенных временем) техник создания ИИ, особенно в шутерах. Всем известные Doom, Quake и Wolfenstein, — все имели ИИ, построенный на основе конечных автоматов.
Можно усовершенствовать конечные автоматы, чтобы системы на их основе выглядели еще лучше. Вначале вспомним, что конечные автоматы бывают полностью детерминированными и недетерминированными. Различие состоит в том, что в недетерминированных переходы между состояниями являются не такими жесткими и имеют элемент случайности, непредсказуемости. Если в примере выше «научить» солдата с 10% вероятностью не замечать врага, а в случае исчезновения врага в 50% случаев возвращаться к патрулированию и еще в 50% — начинать поиски сбежавшей жертвы, то такая система уже становится недетерминированной.
Создавать конечный автомат с большим количеством состояний и правил перехода — задача не из легких. Иногда бывает проще разделить систему ИИ на несколько параллельно действующих и (почти) не связанных конечных автоматов, каждый из которых имеет свои состояния. Например, один автомат отвечает за патрулирование/преследование/атаку, а второй — за систему ведения огня: стрелять, не стрелять, перезарядить и т.д.
Еще более удивительных результатов можно добиться при синхронизации конечных автоматов, работающих параллельно. Допустим, в нашей игре будут присутствовать отряды из трех солдат, которые охраняют некоторые локации. Конечно, каждый солдат может реализовывать свою логику ведения боя, но представь, насколько интереснее они смотрятся, если действуют слаженно. Например, один из солдат, заметив противника, сообщает об этом по рации (записывает это в общую память отряда) и принимает бой. Получив из общей памяти информацию о происходящем, другой солдат прикрывает товарища издалека («сообщая» об этом в ту же общую память). Наконец, третий боец начинает закидывать врага гранатами (Halfe Life).