{"schemaVersion":1,"record":{"key":"lesson/npc-action-selection","type":"lesson","id":"npc-action-selection","lang":"ru","title":"Как NPC выбирает действие","summary":"Разделяем допустимость, приоритет и выполнение действия, чтобы персонаж принимал объяснимые решения и не метался между ними.","updatedAt":"2026-10-20","status":"active","url":"https://gamemechanics.pro/ru/lessons/npc-action-selection/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/npc-action-selection.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/npc-action-selection.md","aliases":[],"tags":["npc-ai","decision-making","debugging"],"sourceIds":["source-25e079ce502c5d9b","source-8ad8c2778e5aab6e"],"sources":[{"id":"source-25e079ce502c5d9b","title":"Dawe et al.: Behavior Selection Algorithms, An Overview","url":"https://www.gameaipro.com/GameAIPro/GameAIPro_Chapter04_Behavior_Selection_Algorithms.pdf","verifiedAt":null},{"id":"source-8ad8c2778e5aab6e","title":"David Rez Graham: An Introduction to Utility Theory","url":"https://www.gameaipro.com/GameAIPro/GameAIPro_Chapter09_An_Introduction_to_Utility_Theory.pdf","verifiedAt":null}],"sections":[{"id":"prerequisites","title":"Что нужно знать","body":"Персонажу могут одновременно требоваться зарядка, ремонт и помощь игроку. Напишите правило выбора явно, прежде чем усложнять архитектуру поведения."},{"id":"principle","title":"Принцип","body":"Сначала отберите допустимые действия, затем выберите одно, затем выполните его. Не позволяйте каждой подсистеме независимо управлять движением. Обзор алгоритмов в Game AI Pro сравнивает машины состояний, деревья поведения и другие способы выбора; универсального победителя здесь нет.\n\nДля нескольких жёстких режимов удобна машина состояний. Для последовательностей проверок и действий подходит дерево поведения. Для сравнения ситуативной полезности можно оценивать кандидатов общей шкалой, как описано в главе о utility theory. Система оценок не заменяет запреты и проверку доступности действия.\n\n<span id=\"пример-ремонтный-робот\"></span>"},{"id":"example","title":"Практический пример","body":"### Ремонтный робот\n\nВ нашей учебной модели робот может заряжаться, чинить насос или помогать игроку открыть тяжёлую дверь. Заряд нормирован от 0 до 1. Ниже 0,1 действует обязательное правило: отправиться на доступную зарядку. Если путь к ней отсутствует, робот переходит в безопасное ожидание и сообщает причину.\n\nВ остальных случаях сравним допустимые кандидаты:\n\n| Действие | Оценка в этой модели | Условие допуска                       |\n| -------- | -------------------- | ------------------------------------- |\n| Зарядка  | `1 - battery`        | Станция достижима                     |\n| Ремонт   | `leakSeverity`       | Есть детали и путь к насосу           |\n| Помощь   | `requestUrgency`     | Запрос ещё актуален и дверь достижима |\n\nВсе входы ограничены диапазоном 0..1. При заряде 0,6, утечке 0,8 и срочности 0,5 выигрывает ремонт. Это выбранные проектные оценки, а не измерение человеческих желаний.\n\nЧтобы близкие оценки не вызывали метания, сохраняйте текущее действие, пока конкурент не лучше минимум на 0,15. Недопустимое или завершённое действие освобождайте сразу. При равенстве используйте стабильный порядок. Порог можно менять после наблюдения; жёсткое правило низкого заряда всё равно имеет приоритет."},{"id":"mistakes","title":"Частые ошибки","body":"- Сравнивать расстояние в метрах с срочностью 0..1 без преобразования шкалы.\n- Каждый кадр начинать ремонт заново, сбрасывая прогресс.\n- Удерживать действие ради стабильности, когда цель уже уничтожена."},{"id":"checks","title":"Проверка результата","body":"- Запишите входы, исключённые действия, оценки и причину выбора.\n- Проверьте равенство оценок, потерю цели и отсутствие любого допустимого кандидата.\n- Колеблите срочность рядом с порогом и проверьте отсутствие частых переключений.\n- Отдельно проверьте обязательную зарядку и её недостижимость."},{"id":"agent-task","title":"Задание для ИИ-агента","body":"> Реализуй выбор как чистую функцию снимка мира и текущего действия. Отдельно сделай выполнение. Подготовь таблицу граничных ситуаций и объясни каждый результат без случайного выбора. Не подключай языковую модель к покадровому управлению.\n\nПроверьте решение через призмы [«Действия»](/ru/lenses/#schell-031) и [«Прозрачность»](/ru/lenses/#schell-062)."}],"relations":[{"type":"requires","direction":"outgoing","label":"Перед началом","key":"lesson/npc-perception","title":"Восприятие NPC и память о цели","url":"https://gamemechanics.pro/ru/lessons/npc-perception/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/npc-perception.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/npc-perception.md"},{"type":"explains","direction":"outgoing","label":"Применение принципа","key":"mechanic/point-and-click--family-31","title":"Поведение NPC, животных и живых систем","url":"https://gamemechanics.pro/ru/knowledge/mechanic/point-and-click--family-31/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/mechanic/point-and-click--family-31.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/mechanic/point-and-click--family-31.md"},{"type":"practices","direction":"outgoing","label":"Применить на практике","key":"practice/maintenance-patrol","title":"Ремонтный патруль","url":"https://gamemechanics.pro/ru/knowledge/practice/maintenance-patrol/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/practice/maintenance-patrol.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/practice/maintenance-patrol.md"},{"type":"reviews","direction":"outgoing","label":"Проверить через призму","key":"lens/schell-031","title":"Действия","url":"https://gamemechanics.pro/ru/knowledge/lens/schell-031/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lens/schell-031.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lens/schell-031.md"},{"type":"reviews","direction":"outgoing","label":"Проверить через призму","key":"lens/schell-062","title":"Прозрачность","url":"https://gamemechanics.pro/ru/knowledge/lens/schell-062/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lens/schell-062.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lens/schell-062.md"},{"type":"contains","direction":"incoming","label":"Учебные маршруты","key":"path/npc-behavior","title":"Поведение NPC","url":"https://gamemechanics.pro/ru/learn/npc-behavior/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/path/npc-behavior.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/path/npc-behavior.md"}],"placements":[],"supersededBy":[],"attributes":{"category":"engineering","level":"intermediate","minutes":6},"endsAt":null,"provenance":"Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём проекте.","license":"CC-BY-4.0","codeLicense":"MIT","attribution":"gamemechanics.pro contributors"}}