Агент с tree search (MCTS) для математической задачи
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Агент с tree search (MCTS) для математической задачи
1. Цель задачи
Разработать агента, использующего метод Monte Carlo Tree Search (MCTS) для решения математической задачи с тремя вариантами действий. Агент должен на основе симуляций строить дерево состояний и выбирать оптимальную последовательность операций, приводящую к целевому числу. Ключевой результат агент находит решение за ≤5000 симуляций в 9 из 10 запусков, превосходя baseline (случайный перебор) по доле успешных решений и среднему числу шагов.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Определение математической задачи | Сформулировать самостоятельно (см. ниже) |
| Среда (class MathEnv) | Реализовать на Python |
| Реализация MCTS (UCT) | Написать с нуля |
| Baseline (случайный агент) | Создать как часть скрипта |
| Инструмент визуализации дерева | Matplotlib / networkx |
Задача для решения
Начальное число: 1.
Действия (всегда применимы, если не оговорено):
A: умножить на 2 (*2)B: прибавить 3 (+3)C: возвести в квадрат (**2)
Цель: получить число 100.
Ограничение: максимальная глубина поиска — 10 шагов (иначе задача считается нерешаемой).
Если нет готового окружения — симулируем:
- Создать Python-файл
math_env.pyс классом MathEnv. - Написать класс MCTSAgent в файле
mcts_agent.py. - Проверить на примере:
start=1, goal=100.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык | Python 3.10+ | Основная разработка |
| Визуализация | matplotlib, networkx | Построение дерева поиска |
| Численные расчёты | NumPy | Статистика по симуляциям |
| Логирование | logging / print | Отладка работы MCTS |
| Тестирование | pytest | Проверка корректности компонентов |
4. Этапы выполнения
Этап 1: Проектирование среды и действий (1 час)
Действия
-
Определить структуру состояния
- State :
int(текущее число). is_terminal:True, если число равно цели (100) или превысило 1000 (выход за разумные пределы).is_goal:True, если число == 100.
- State :
-
Реализовать класс MathEnv
-
Проверить среду
env = MathEnv() state = 1 for a in ['*2', '+3', '^2']: print(f"{a}: {state} -> {env.step(state, a)}")
Ожидаемый результат этапа Рабочий класс MathEnv, проходит минимальные тесты (например, test_goal_reached).
Этап 2: Реализация MCTS с UCT (2–3 часа)
Действия
-
Создать класс MCTSNode
- Поля: state,
parent,children, visits,total_reward,action_that_led_here,untried_actions. - Метод
is_fully_expanded()→len(self.untried_actions) == 0. - Метод
best_child(c=1.41)→ выбор по UCB1.
- Поля: state,
-
Создать класс MCTSAgent
- init(self, env, iterations=1000, c=1.41, max_depth=10)
- search(state) → выполняет итерации MCTS:
- Selection спуск по дереву с помощью
best_childдо терминального или не полностью раскрытого узла. - Expansion если узел не терминальный и не полностью раскрыт – добавить один новый дочерний узел (случайное действие из
untried_actions). - Simulation (Rollout): из нового узла симулировать случайные действия до терминала или max_depth; подсчитать накопленную награду.
- Backpropagation: обновить visits и
total_rewardна всём пути от нового узла до корня.
- Selection спуск по дереву с помощью
- best_action(state) → после всех итераций выбрать действие с максимальным visits или средним reward.
-
Детали реализации симуляции
def rollout(self, state, depth=0): if env.is_terminal(state) or depth >= self.max_depth: return env.reward(state) action = random.choice(env.get_actions(state)) next_state = env.step(state, action) return self.rollout(next_state, depth+1)
Ожидаемый результат этапа Агент способен делать осмысленный ход для задачи.
Этап 3: Интеграция агента и тестирование (1–2 часа)
Действия
-
Написать скрипт
solve_with_mcts.py -
Реализовать baseline
def random_agent(env, start, max_steps=10): state = start path = [] for _ in range(max_steps): if env.is_goal(state): return path action = random.choice(env.get_actions(state)) state = env.step(state, action) path.append(action) return None -
Сравнить результаты (10 запусков):
- MCTS: доля успешных решений, среднее число шагов, среднее кол-во симуляций.
- Random: аналогично.
Ожидаемый результат этапа Агент MCTS находит решение чаще и быстрее, чем случайный.
Этап 4: Визуализация и анализ (1 час)
Действия
-
Построить дерево поиска для лучшего решения:
- Использовать
networkx.DiGraph. - Узлы — числа, рёбра — действия.
- Раскрасить узлы по количеству посещений (чем больше — тем темнее).
- Подписать число посещений и среднюю награду.
- Использовать
-
Построить график сходимости
- По оси X — номер итерации MCTS.
- По оси Y — максимальная награда среди листьев.
- Показать, как улучшается оценка.
-
Собрать статистику
- Размер дерева (количество узлов) для каждой итерации.
- Количество узлов на каждом уровне глубины.
Ожидаемый результат этапа Визуализация дерева и кривая сходимости.
Этап 5: Документация и фиксация артефактов (0.5 часа)
Действия
- Оформить README с описанием задачи, архитектуры, результатов сравнения.
- Закоммитить все файлы в репозиторий (или папку проекта).
- Написать краткий post-hoc анализ: что бы изменили для ускорения (например, эвристики, расширение действий, уменьшение iterations).
Ожидаемый результат этапа Готовый проект с кодом, визуализациями и документацией.
5. Критерии приемки (Definition of Done)
- Среда
MathEnvкорректно реализует переходы и терминальные условия. - MCTS с UCB1 выбирает действие за ≤5 вызовов после обучения (1000+ симуляций).
- Агент находит решение для
start=1, goal=100за ≤10 шагов хотя бы в 8 из 10 запусков. - Baseline (случайный) решает задачу менее чем в 30% запусков за 10 шагов.
- Дерево поиска визуализировано с помощью networkx; на рисунке указаны числа.
- Кривая сходимости показывает рост максимальной награды.
- Код покрыт минимум 3 тестами (test_env, test_mcts_node, test_full_solve).
- README содержит инструкцию по запуску и пример вывода.
6. Ожидаемый результат
Основной артефакт Python-скрипты (math_env.py, mcts_agent.py, solve.py), файл с результатами (results.md или stats.json), визуализации (tree.png, convergence.png).
Содержание результатов
- Лог лучшего найденного пути (например:
1 -> *2=2 -> +3=5 -> ^2=25 -> *2=50 -> *2=100) - Статистика по 10 запускам (таблица: метод, успех, шаги, симуляции)
- Графики
Опционально
- Сравнение с разными константами C (exploration) и числом итераций.
- Добавление четвёртого действия (например,
/2).
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Экспоненциальный рост дерева | Ограничить max_depth = 10 и количество итераций; использовать pruning (отбрасывать узлы с низким upper bound). |
| Низкая награда при rollout | Ввести промежуточные награды (например, -distance_to_goal / 100), чтобы направлять поиск. |
| Несбалансированность UCB1 | Подбирать константу C экспериментально (попробовать 0.5, 1.0, 1.41, 2.0). |
| Долгая симуляция | Заменить полный rollout на эвристику (например, выбирать действие, приближающее к цели). |
| Визуализация при >1000 узлов | Использовать nx.spring_layout и ограничить отрисовку только поддеревом с лучшим путём. |
8. Бюджет времени (оценка)
| Этап | Время (часы) |
|---|---|
| 1. Проектирование среды | 1 |
| 2. Реализация MCTS | 2.5 |
| 3. Интеграция и тестирование | 1.5 |
| 4. Визуализация и анализ | 1 |
| 5. Документация | 0.5 |
| Итого | 6.5 |
Примечание для первого раза Рекомендуется заложить +2 часа на отладку UCB1 и настройку параметров. Если задача решается слишком легко/сложно — изменить действия (добавить -2 или заменить квадрат на куб).
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 10 | Основы Reinforcement Learning |
| 25 | Monte Carlo Tree Search (MCTS) |
| 50 | Upper Confidence Bound (UCB1) |
| 100 | Decision trees (поиск в пространстве состояний) |
| 150 | Exploration vs Exploitation |
| 200 | Reward shaping |
| 250 | Backpropagation в дереве |
| 300 | Симуляция (rollout) |
| 350 | Применение MCTS в играх |
| 400 | Оценка эффективности поиска (симуляции vs качество) |
10. Чек-лист самопроверки
- Я реализовал среду и проверил её на простых примерах (1 -> *2 -> 2).
- Я написал класс
MCTSNodeс корректным подсчётом UCB1. - Я проверил, что после 1000 симуляций для
state=1агент выбирает разумное действие. - Я сравнил MCTS с baseline и получил значимое превосходство.
- Я создал визуализацию дерева и график сходимости, и они выглядят содержательно.