Метод 9: project_stochastic_seed()

Домен: SIMULATION | Контур: Выбор итогового действия (Взвешенная рулетка)

WarningОграничение публичной документации

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

  • Полная спецификация метода: Будет доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).

1. Бизнес-спецификация метода

  • Идентификатор метода: BPDS-SIM-M09
  • Системное имя: project_stochastic_seed()
  • Микросервис: simulation-core-engine
  • Домен: SIMULATION
  • Класс / Компонент: simulation.engine.generator.StochasticGeneratorImpl

1.1. Описание логики работы

Этот метод принимает решение, какое именно действие из 4-х возможных выполнит пользователь на текущем шаге. Метод берет карту процентов (вероятностей), рассчитанную на Шаге 8, и имитирует бросок кости методом «взвешенной рулетки» (кумулятивной суммы отрезков).

Это гарантирует, что действия, которые пользователь хочет совершить сильнее всего (у которых больше процент), будут выпадать чаще. При этом сохраняется стохастический (случайный) шанс для альтернативного поведения. Метод находит выигравшее действие и передает его имя обратно главному оркестратору для запуска нужного сценария в Части 3.

1.2. Пошаговое выполнение

  1. Калькуляция процентов: Метод последовательно запускает Метод 7 (расчет желаний) и Метод 8 (перевод желаний в проценты). На выходе получается готовая карта распределения шансов.
  2. Бросок кости: Системный генератор случайных чисел выдает случайную дробь от 0.0 до 1.0.
  3. Накопление отрезков: Программа начинает по очереди складывать проценты каждого действия в одну накопительную переменную (строит отрезки на шкале от 0 до 1).
  4. Фиксация попадания: Как только сгенерированное на Шаге 2 случайное число оказывается меньше или равно накопленной сумме отрезков, прокрутка останавливается. Текущее действие признается выигравшим.
  5. Роутинг (Перенаправление): Имя выбранного действия возвращается главному оркестратору (evaluate_next_step) для запуска конкретного qmd-контура Части 3 (BUY, COOK, CONSUME или WASTE).

2. Диаграмма последовательности метода (Вход и Выход флоу)

Диаграмма наглядно показывает, как метод собирает данные математического контура, бросает случайное число и возвращает управляющий сигнал для роутинга потока выполнения в Часть 3.

sequenceDiagram
    autonumber
    participant Core as Метод 3 (CoreSimulationEngineImpl)
    participant Gen as StochasticGeneratorImpl
    participant M7 as Метод 7 (calculate intents density)
    participant M8 as Метод 8 (logistic normalization)

    %% ВХОД МЕТОДА И МАТЕМАТИЧЕСКИЙ КАСКАД
    Core->>Gen: Вызов projectStochasticSeed(TwinContext)
    activate Gen
    Note over Gen: Вход метода: Утвержденный TwinContext с параметрами пользователя
    
    Gen->>M7: Внутренний вызов расчета плотностей желаний
    M7-->>Gen: Возврат: Карта сырых чисел (Map)
    
    Gen->>M8: Внутренний вызов Softmax-нормализации
    M8-->>Gen: Возврат: Карта выровненных процентов (probabilities Map)

    %% СТОХАСТИЧЕСКИЙ ВЫБОР
    Note over Gen: Бросок кости: random_float = Math.random() (число от 0.0 до 1.0)
    
    loop Проход по карте процентов действий
        Note over Gen: cumulative_sum += процент_действия
        alt random_float <= cumulative_sum
            Note over Gen: Интервал на шкале найден. Останавливаем цикл.
        end
    end

    Note over Gen: Выход метода: Название сценария (ScenarioEnum)

    %% ПЕРЕДАЧА УПРАВЛЕНИЯ ОБРАТНО ОРКЕСТРАТОРУ
    Gen-->>Core: Возврат: Выбранный сценарий (Пример: SCENARIO_B2B_BUY_RECEIPT)
    deactivate Gen
    Note over Core: Оркестратор принимает сигнал и перенаправляет поток в Часть 3


3. Схемы данных и SQL-взаимодействие

Этот метод является финальной логической развилкой математического ядра симулятора в оперативной памяти и напрямую запросы к PostgreSQL не выполняет.


4. Спецификация обмена данными (Вход / Выход)

Данные передаются внутри локального потока выполнения микросервиса.

4.1. Пример внутренней карты процентов и броска кости (Внутренний срез)

{
  "calculated_probabilities_matrix": {
    "SCENARIO_B2B_BUY_RECEIPT": 0.5422,
    "SCENARIO_COOKING_MEAL": 0.1526,
    "SCENARIO_CONSUMING_FOOD": 0.1526,
    "SCENARIO_WASTE_DISPOSAL": 0.1526
  },
  "generated_stochastic_seed": 0.4500
}

4.2. Выходной управляющий сигнал роутинга (Выходные параметры для Метода 3)

Поскольку случайное число 0.4500 меньше или равно первому отрезку шкалы (0.5422), рулетка мгновенно выбирает сценарий покупки:

{
  "selected_scenario_token": "SCENARIO_B2B_BUY_RECEIPT",
  "routing_metadata": {
    "matched_cumulative_boundary": 0.5422,
    "engine_decision": "DISPATCH_TO_PART_3_CONTOUR"
  }
}

5. ЗАДАЧА ДЛЯ РАЗРАБОТЧИКА: BACKEND

Заголовок: Реализация алгоритма кумулятивной взвешенной рулетки и роутинга project_stochastic_seed

5.1. Что нужно сделать

  1. Обновить публичный метод projectStochasticSeed в существующем классе StochasticGeneratorImpl.
  2. Подключить последовательный вызов ранее разработанных методов: this.calculateIntentsDensity(context) и this.logisticNormalization(rawDensities).
  3. Реализовать бросок случайного числа через Math.random().
  4. Написать цикл for по карте процентов. Внутри цикла накапливать значения в переменную cumulativeSum. Добавить проверку: как только случайное число стало меньше или равно cumulativeSum, записывать тип сценария в переменную и прерывать цикл через break.
  5. Добавить защитный fallback-механизм: если из-за микроскопических погрешностей окружения процессора случайное число выпало в 0.99999, а сумма отрезков составила 0.99998, метод не должен возвращать пустоту (null). В этом случае принудительно выбирать последний элемент карты (например, сценарий покупки).
  6. Вывод итоговой карты распределения процентов обернуть в лог уровня DEBUG.

6. ЗАДАЧА ДЛЯ РАЗРАБОТЧИКА: МИГРАЦИЯ

Заголовок: Настройка конфигурации уровней логирования для аудита стохастического роутера

6.1. Что нужно сделать

Чтобы разработчики и аналитики могли отлаживать и проверять корректность распределения процентов «взвешенной рулетки», необходимо настроить конфигурационные профили логирования приложения. В файле настроек src/main/resources/application.yml нужно активировать вывод дебаг-логов строго для класса генератора, оставив остальные компоненты в режиме стандартного вывода.

logging:
  level:
    # Включение вывода матриц распределения процентов для аудита стохастики
    simulation.engine.generator.StochasticGeneratorImpl: DEBUG
    simulation.engine.core.CoreSimulationEngineImpl: INFO