![]() |
Искусственный интеллект. Как?
Хотелось бы узнать какие существуют приемы для создания умного, легкорасшираемого, приятночитаемого ИИ.
Сам я всегда делал через бесконечность if-else-end + state = true. Кто как делает? |
Ответ: Искусственный интеллект. Как?
Ээээ? "Хотелось бы иметь аппарат!" Хоть какого применения ИИ?
см. ещё |
Ответ: Искусственный интеллект. Как?
Цитата:
Вот, например, только что нашел: ИИ в Халфе |
Ответ: Искусственный интеллект. Как?
Цитата:
|
Ответ: Искусственный интеллект. Как?
Цитата:
|
Ответ: Искусственный интеллект. Как?
Могу рассказать об AI в Faded.
Там тупняка покамест много конечно с ботами, но все части интеллекта хорошо изолированы, и баги являются частью конкретных стейтов/их недостатка для конкретных ситуаций, а не всей системы в целом. Я прошёл через 3 итерации полной переписки системы, и нынешняя версия мне нравится. Первое, на что стоит обратить внимание, это, как подметил Taugeshtu, стейт-машины. Они простые и нормально работают для простого ИИ (турелям хватит). Обычно стейт это какая-то последовательность действий, которую повторяет бот, пока не перейдёт в другой. В стайте про HL ими можно назвать shedule'ы по сути. В идеале стейты должны иметь чёткую задачу, чтоб если не понимаешь, что бот творит, достаточно было глянуть в каком он стейте. Херня начинает происходить при попытке написать для сложного бота при каких условиях бот должен быть в каком стейте, т.к. событий в игре много и стейтов тоже становится много. Распространённый вариант - State transition table, когда у нас есть таблица в какой стейт перейти при получении ботом каждого эвента в зависимости от того, в каком он стейте сейчас, но с ней случается комбинаторный взрыв, и невозможно за всем уследить. Далее (уже не про стейт-машины), если Behaviour trees. Вкратце, суть такова (насколько я её понял из разных презентаций): есть дерево, ноды которого - условия, а конечные листья - собственно, действия или их последовательности. Условия могут возвращать успех, тогда мы идём дальше вниз по нему, а если возвращают неудачу, то мы возвращаемся на родительскую ноду и пробуем следующую её ветвь, если же следующей нет, то он тоже возвращает к своему паренту. Тут одновременно 2 удобства, на мой взгляд - иерархически удобно разбитая логика + непрямое наличие приоритетов у действий. Там они много типов нод напридумывали ещё, но судя по докам, всё это мотивировалось желанием создать юзер-френдли систему, в которой нубы-дизайнеры без знания кода смогли бы городить поведения. Мои хотелки и бекграунд требовали немного иного: 1. Хочу задавать весь AI в коде. 2. Долгое время я прототипировал AI в движке первой Мафии, а там все скрипты по дефолту были coroutine'ами, и для меня было естественным описывать растянутое во времени поведение ими, наподобие: Код:
персонаж_идисюда точка1 Из этих условий у меня вышел странный code-driven гибрид стейтмашины и BT: У бота по-прежнему есть стейты. и он может находится только в одном. Стейт представляет собой корутину, идущую циклом. Каждый тик AI (0.5 сек у меня) сначала заполняются переменные бота тем, что он видит/слышит, а затем на основе перменных проверяется дерево, схожее с BT, но цель которого - выбрать стейт. Начало дерева выглядит так: Это его часть. Проверки написаны по приоритетам - от важных до неважных. Это проверки базового AI, ниже там могут быть ещё проверки каждого уникального бота свои. Внутри каждого чека ветвление более частное, например: Если функция по частным проверкам не позволяет уйти в стейт - она возвращает false, и мы идём дальше вниз по списку первому. Если она выбирает стейт и возвращает true, дерево заканчивается. changeState проверяет, в каком мы стейте, если в том же самом - то ничего не делается, если в другом - то корутина прошлого резко дропается, и начинается новая. Тут можно порассуждать, лучше ли делать так, или лучше иметь некую exitState функцию для каждого стейта (типа курил сигарету в стейте, а на выходе надо её выкинуть), сначала я делал второе, но это было мутно, т.к. нам, к примеру, не надо прятать пистолет при переходе из стрельбы в перезарядку, но надо при переходе в спокойное состояние, так что подумал что лучше заканчивать действия в начале самих стейтов. |
Ответ: Искусственный интеллект. Как?
Кстати, в state transition table можно записывать вероятность перехода в каждое другое состояние для имитации недетерминированного поведения.
Behavior trees по-сути, тоже являются конечными автоматами, но с ограничениями на структуру. Думаю, можно при реализации сохранить лучшее от обоих - сделать конечный автомат, но при организации связей считать, что |
Часовой пояс GMT +4, время: 22:05. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot