---
id: npc-action-selection
lang: ru
title: Как NPC выбирает действие
description: >-
  Разделяем допустимость, приоритет и выполнение действия, чтобы персонаж
  принимал объяснимые решения и не метался между ними.
category: engineering
level: intermediate
minutes: 6
updatedAt: '2026-10-20'
tags:
  - npc-ai
  - decision-making
  - debugging
sources:
  - title: 'Dawe et al.: Behavior Selection Algorithms, An Overview'
    url: >-
      https://www.gameaipro.com/GameAIPro/GameAIPro_Chapter04_Behavior_Selection_Algorithms.pdf
  - title: 'David Rez Graham: An Introduction to Utility Theory'
    url: >-
      https://www.gameaipro.com/GameAIPro/GameAIPro_Chapter09_An_Introduction_to_Utility_Theory.pdf
url: 'https://gamemechanics.pro/ru/lessons/npc-action-selection/'
markdownUrl: 'https://gamemechanics.pro/content/ru/npc-action-selection.md'
license: CC-BY-4.0
codeLicense: MIT
attribution: gamemechanics.pro contributors
---

## Что нужно знать

Персонажу могут одновременно требоваться зарядка, ремонт и помощь игроку. Напишите правило выбора явно, прежде чем усложнять архитектуру поведения.

## Принцип

Сначала отберите допустимые действия, затем выберите одно, затем выполните его. Не позволяйте каждой подсистеме независимо управлять движением. Обзор алгоритмов в Game AI Pro сравнивает машины состояний, деревья поведения и другие способы выбора; универсального победителя здесь нет.

Для нескольких жёстких режимов удобна машина состояний. Для последовательностей проверок и действий подходит дерево поведения. Для сравнения ситуативной полезности можно оценивать кандидатов общей шкалой, как описано в главе о utility theory. Система оценок не заменяет запреты и проверку доступности действия.

<span id="пример-ремонтный-робот"></span>

## Практический пример

### Ремонтный робот

В нашей учебной модели робот может заряжаться, чинить насос или помогать игроку открыть тяжёлую дверь. Заряд нормирован от 0 до 1. Ниже 0,1 действует обязательное правило: отправиться на доступную зарядку. Если путь к ней отсутствует, робот переходит в безопасное ожидание и сообщает причину.

В остальных случаях сравним допустимые кандидаты:

| Действие | Оценка в этой модели | Условие допуска                       |
| -------- | -------------------- | ------------------------------------- |
| Зарядка  | `1 - battery`        | Станция достижима                     |
| Ремонт   | `leakSeverity`       | Есть детали и путь к насосу           |
| Помощь   | `requestUrgency`     | Запрос ещё актуален и дверь достижима |

Все входы ограничены диапазоном 0..1. При заряде 0,6, утечке 0,8 и срочности 0,5 выигрывает ремонт. Это выбранные проектные оценки, а не измерение человеческих желаний.

Чтобы близкие оценки не вызывали метания, сохраняйте текущее действие, пока конкурент не лучше минимум на 0,15. Недопустимое или завершённое действие освобождайте сразу. При равенстве используйте стабильный порядок. Порог можно менять после наблюдения; жёсткое правило низкого заряда всё равно имеет приоритет.

## Частые ошибки

- Сравнивать расстояние в метрах с срочностью 0..1 без преобразования шкалы.
- Каждый кадр начинать ремонт заново, сбрасывая прогресс.
- Удерживать действие ради стабильности, когда цель уже уничтожена.

## Проверка результата

- Запишите входы, исключённые действия, оценки и причину выбора.
- Проверьте равенство оценок, потерю цели и отсутствие любого допустимого кандидата.
- Колеблите срочность рядом с порогом и проверьте отсутствие частых переключений.
- Отдельно проверьте обязательную зарядку и её недостижимость.

## Задание для ИИ-агента

> Реализуй выбор как чистую функцию снимка мира и текущего действия. Отдельно сделай выполнение. Подготовь таблицу граничных ситуаций и объясни каждый результат без случайного выбора. Не подключай языковую модель к покадровому управлению.

Проверьте решение через призмы [«Действия»](/ru/lenses/#schell-031) и [«Прозрачность»](/ru/lenses/#schell-062).
