AAYMA
RU
Войти

Аким на 5 часов

Симулятор городского бюджета на Go и React: 5 районов, 14 мер, 5 решений в бюджете 100.

Доведённый продукт
Команда «AI4EDU» 31💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: AI4EDU
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Симулятор городского бюджета на Go и React: 5 районов, 14 мер, 5 решений в бюджете 100. Детерминированный движок считает Score, полный перебор находит точный оптимум, а AI-автопилот из четырёх ролей строит план по цели, заданной обычным языком.

Как устроено

Go-движок internal/simulation валидирует сценарий, применяет лаг (8 − L)/8, синергии и ограничение [0,100] и считает Score = 0.7 × среднее по населению + 0.3 × худший район − число критических показателей. Оптимизатор параллельно перебирает все 694 395 допустимых сценариев. Автопилот: мастер формализует цель, независимый аудитор проверяет её, не видя выводов мастера, затем идёт полный поиск на Go, планировщик пишет объяснение, рецензент его проверяет, ошибки возвращаются на исправление. Действуют лимиты бюджета в USD и числа итераций. Отдельный Python-скрипт пересчитывает все числа в точных дробях.

Ключевые решения

  • exhaustive search (694 395 scenarios)
  • multi-agent roles (master/auditor/planner/reviewer)
  • independent verification in exact fractions
  • template fallback
  • LLM cost budgeting

Метрики

База 52.558; сбалансированный план 56.543 (стоимость 95, 0 критических); точный оптимум 57.237 (стоимость 98, 0 критических) по полному перебору 694 395 сценариев

Особенности

Доказанный потолок модели (57.236735) найден полным перебором, а не эвристикой. Вторая, независимая реализация формулы на Python в точных дробях без общего кода с Go перепроверяет все числа. Аудитор цели изолирован от выводов мастера. Расходы автопилота на LLM учитываются и ограничиваются.

Стек

Go 1.22 · React · TypeScript · Vite · Vitest · Docker Compose · Makefile · Python (verify script)

Модели

gpt-4.1-mini · NVIDIA (опционально)


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-395e4fb2-ai4edu.

README

README.md

«Аким на 5 часов» — AI-симулятор управления городом

HackAlem AI · Astana Innovations Special Track · команда AI4EDU

Бюджет 100, 5 районов Астаны, 14 мер и ровно 5 решений. Пользователь задаёт цель обычным языком или вручную выбирает мероприятия. Четыре AI-роли — мастер, независимый аудитор цели, планировщик и рецензент — готовят и проверяют план. Детерминированный Go-движок рассчитывает Astana Quality of Life Score, расходы и последствия для районов.

Данные синтетические; Score измеряется в баллах модели, не в процентах. Реальных действий в городе приложение не выполняет.

Главная страница

Проблема и решение

Ресурсы города ограничены, а у решений есть неочевидные последствия: мера начинает работать не сразу (лаг), одни меры усиливают друг друга (синергии), другие несовместимы, а вложения в один район не помогают отстающему. Симулятор позволяет безопасно попробовать разные стратегии и увидеть, как они меняют каждый район и город в целом.

  1. Проверка сценария: бюджет, ровно 5 уникальных решений, не больше 2 мер одного направления, районные и городские меры, несовместимости.
  2. Расчёт: эффекты с учётом лага (8 − L) / 8, синергии, ограничение [0, 100], районные Score, итог 0.7 × среднее по населению + 0.3 × худший район − критические.
  3. AI-объяснение: сильные стороны, риски и компромиссы на русском языке.
  4. Лучший план: точный оптимум полным перебором всех 694 395 допустимых сценариев.

Результат сценария

AI-автопилот и проверка чисел

Цель пользователя → мастер + независимый аудитор → согласованные ограничения
                  → полный поиск Go → планировщик → рецензент → готовый план
                                             ↑       │
                           исправления цели/объяснения

Аудитор получает только исходную цель и сценарий, без выводов мастера. Разногласие возвращается мастеру; ошибка объяснения — планировщику. Явные численные ограничения бюджета дополнительно проверяет код. Пользователю не нужно выбирать пять решений. Результат, ход работы, оценка расходов и история доступны в AI-автопилоте.

Go проверяет числа и допустимость, а полный поиск подтверждает оптимум для формализованной цели. LLM может ошибаться даже после рецензии: действия и числа нужно сверять с результатом Go. Без ключа доступны ручной расчёт и шаблонное объяснение; автопилот отключён. Прежний /api/advise также сохранён. Подробные протоколы, ограничения и реальные проверки: docs/autopilot.md.

Результаты

СценарийСтоимостьScoreКритических
Ничего не делать (база)052.5582
Всё вложить в богатый Есиль9353.5772
Полезная мера в неудачном месте (M11 в Алматы)9355.1441
Сбалансированный golden: M7, M8, M10 → Нура; M12 город; M5 → Сарыарка9556.5430
Лучший план: M2, M14 город; M3, M8, M9 → Нура9857.2370

Потолок текущей фиксированной модели — 57.236735 балла при максимизации городского Score и бюджете 100. Он не означает «57% качества»: нельзя честно обещать более высокий Score без изменения данных, мер или формулы.

Все числа таблицы независимо пересчитывает make verify (scripts/verify_scores.py): вторая реализация формулы на Python в точных дробях, без общего кода с Go-движком, плюс полный перебор для проверки оптимума.

Вклад в один район почти не повышает Score: 30% веса у худшего района и штраф за каждый показатель ниже 40 не дают «забыть» Нуру. Сценарий показа с командами: docs/demo.md.

Документация

Быстрый запуск

docker compose up --build

Открыть http://localhost:8080 — сайт и API на одном адресе. Время сборки и фонового поиска зависит от компьютера; до готовности поиска API возвращает 503 not_ready. Для AI задайте OPENAI_API_KEY в серверном .env. Создавайте .env из .env.example только если файла ещё нет; существующие ключи не перезаписывайте. Без ключа работает шаблонное объяснение. NVIDIA для автопилота не нужна.

Для разработки: Go 1.22+, Make, Node.js 22.22.2+ или 24.15+, npm. Запустите make run; во втором терминале — cd web, npm ci, npm run dev. make run загружает .env; прямой go run читает только окружение процесса.

Демо для жюри

  1. Запустить проект с OpenAI-ключом и открыть AI-автопилот. Ввести: «Максимизируй городской Score при бюджете 100, устрани все критические показатели». Показать четыре роли, результат 57.236735 / стоимость 98 / критических 0 и историю. Следующие шаги показывают ручной сценарий и детерминированный резерв.
  2. Открыть http://localhost:8080: исходные показатели районов, в Нуре два критических значения (S1, S2 < 40). Базовый Score 52.56 виден на экране результата как «До».
  3. «Составить план» → добавить M7, M8, M10 → Нура, M12 (город), M5 → Сарыарка → «Рассчитать результат»: Score 56.54, стоимость 95, критических 0, сработала синергия M10 + M12, объяснение с меткой AI или шаблона.
  4. «Лучший план по модели»: точный оптимум 57.24 (M2, M14; M3, M8, M9 → Нура). Пока фоновый поиск не завершён, интерфейс показывает «Считается…».
  5. Попробовать нарушить правила (M1 + M3, третью меру соцсферы, перерасход бюджета): Score не выдаётся, показывается причина.

Те же шаги через curl и дополнительные сценарии: docs/demo.md.

Проверка

make check                      # Go: формат, vet, тесты, race
make verify                     # независимый пересчёт на Python + полный перебор
cd web && npm ci && npm test     # тесты фронтенда

Архитектура

  • internal/simulation — данные, валидация и детерминированный расчёт Score.
  • internal/explanation — AI-объяснение результата и шаблонный fallback.
  • internal/autopilot — четыре роли, аудит цели, цикл исправлений, бюджет и фоновые задачи.
  • internal/advisor — прежний OpenAI-советник с инструментом симуляции.
  • internal/httpapi — HTTP API расчёта, объяснения и рекомендаций.
  • internal/optimizer — полный перебор сценариев через simulation.Simulate.
  • internal/httpapi/web.go — раздача собранного сайта рядом с API.
  • web/ — React + TypeScript + Vite; числа получает от API.
  • cmd/server — запуск сервера и настройка из переменных окружения.

Настройки

ПеременнаяПо умолчаниюНазначение
ADDR:8080Адрес Go API
OPENAI_API_KEYпустоКлюч для живого AI
OPENAI_MODELgpt-4.1-miniМодель объяснения и резервная модель ролей
OPENAI_MASTER_MODEL, OPENAI_AUDITOR_MODEL, OPENAI_PLANNER_MODEL, OPENAI_REVIEWER_MODELчерез OPENAI_AGENT_MODEL / OPENAI_MODELИндивидуальные модели ролей
AUTOPILOT_RUN_BUDGET_USD0.10Оценочный лимит одного запуска
AUTOPILOT_TOTAL_BUDGET_USD50Общий лимит локального учёта автопилота
AUTOPILOT_MAX_ITERATIONS3Общий лимит итераций, допустимо 1–5
AUTOPILOT_BUDGET_FILE.autopilot/usage.jsonПостоянный журнал расходов
CORS_ORIGINпустоРазрешённый origin отдельного фронтенда
WEB_DIRпусто; /web в DockerКаталог собранного сайта
HOST_PORT8080Внешний порт Docker

По умолчанию: до двух одновременных запусков и 180 секунд на задачу. Четыре вызова в обычном успешном цикле; до 12 при трёх итерациях, до 20 при пяти. Повторная формализация не сбрасывает время, итерации и бюджет. Журнал расходов сохраняется между перезапусками, в Docker — в томе autopilot-state. Это локальный лимит автопилота, не баланс OpenAI; другие API-вызовы он не учитывает. Неизвестные модели требуют явных тарифов в переменных из .env.example.

API-ключи хранятся только на сервере. Пользовательская аутентификация не реализована; для публичного доступа нужен внешний контроль доступа к платным маршрутам. Результаты задач хранятся в RAM, история интерфейса — в браузере. Текущие правила допускают несколько мер одного направления, поэтому пять решений не гарантируют охвата всех пяти направлений; это ограничение описано в задании и модели.

Разработка

make web-install — установить зависимости фронтенда; make run — запустить Go API на :8080. make web-dev — сайт на http://127.0.0.1:5173 с прокси /api (в другом терминале). make help — все цели.

Звёзды
⭐ 0
Форки
0
Язык
Go
Последний push
в прошлом месяце
Коммиты
36
Авторы
4
Файлы
130
Ветки
3

Авторы коммитов

adal4ik 13YepSultan 10Adilet Rabayev 7roka 6

История коммитов

  • 2026-09-23 17:45Merge latest main background styling into integrated appYepSultan
  • 2026-09-23 17:43Merge main into ai-integration: combine web visualizations and four-agent autopilotYepSultan
  • 2026-09-23 17:39Merge pull request #9 from BAITC-Hacks/style/web-refreshAdilet Rabayev
  • 2026-09-23 17:39style: soft animated backgroundadal4ik
  • 2026-09-23 17:34feat: add independent goal auditor agentYepSultan
  • 2026-09-23 17:24feat: verify optimum and repair agent goal constraintsYepSultan
  • 2026-09-23 17:23Merge pull request #8 from BAITC-Hacks/docs/readme-trimAdilet Rabayev
  • 2026-09-23 17:22docs: trim README for juryadal4ik
Все коммиты (36)
  • 2026-09-23 17:17Merge pull request #7 from BAITC-Hacks/feat/webroka
  • 2026-09-23 17:16Update web interface and visualizationsRoka-popka
  • 2026-09-23 16:56Merge pull request #6 from BAITC-Hacks/docs/readme-finalAdilet Rabayev
  • 2026-09-23 16:55feat: add goal-driven multi-agent city autopilotYepSultan
  • 2026-09-23 16:51test: add independent Python score verificationadal4ik
  • 2026-09-23 16:51docs: add product overview, screenshots and results to READMEadal4ik
  • 2026-09-23 16:31Merge pull request #5 from BAITC-Hacks/feat/serve-webAdilet Rabayev
  • 2026-09-23 16:31feat: serve built frontend alongside APIadal4ik
  • 2026-09-23 16:19Merge remote-tracking branch 'origin/main' into ai-integrationYepSultan
  • 2026-09-23 16:18fix: ground advisor comparisons in verified scenario resultsYepSultan
  • 2026-09-23 16:11Merge pull request #4 from BAITC-Hacks/feat/webroka
  • 2026-09-23 16:08feat: align web with API contract and optimizerRoka-popka
  • 2026-09-23 16:06Merge pull request #3 from BAITC-Hacks/docs/demoAdilet Rabayev
  • 2026-09-23 16:05docs: add verified jury demo scenariosadal4ik
  • 2026-09-23 16:01Merge remote-tracking branch 'origin/main' into feat/webRoka-popka
  • 2026-09-23 16:01feat: add React frontendRoka-popka
  • 2026-09-23 15:40Merge pull request #2 from BAITC-Hacks/feat/optimizerAdilet Rabayev
  • 2026-09-23 15:36perf: parallel optimizer search and non-blocking startupadal4ik
  • 2026-09-23 15:26feat: add exhaustive optimizer and recommendation APIadal4ik
  • 2026-09-23 15:21merge: sync backend API docs into AI integrationYepSultan
  • 2026-09-23 15:13feat: add AI advisor with verified simulations and NVIDIA reviewYepSultan
  • 2026-09-23 15:10upd: READMEYepSultan
  • 2026-09-23 15:03Merge pull request #1 from BAITC-Hacks/docs/api-contractAdilet Rabayev
  • 2026-09-23 14:57docs: document API contract with verified server examplesadal4ik
  • 2026-09-23 14:28docs: add quick start, architecture and demo to READMEadal4ik
  • 2026-09-23 14:28chore: add Docker, Compose, Makefile and env exampleadal4ik
  • 2026-09-23 14:27feat: add scoring engine, HTTP API and AI explanationadal4ik
  • 2026-09-23 13:56docs: add task and scoringadal4ik
Структура репозитория (130 файлов)
.dockerignore
.env.example
.gitignore
Dockerfile
Makefile
README.md
cmd/server/main.go
compose.yaml
docs/ai-integration.md
docs/api.md
docs/autopilot.md
docs/demo.md
docs/images/home.png
docs/images/result.png
docs/scoring.md
docs/task.md
go.mod
internal/advisor/openai.go
internal/advisor/openai_test.go
internal/advisor/service.go
internal/advisor/service_test.go
internal/autopilot/auditor_test.go
internal/autopilot/budget.go
internal/autopilot/budget_test.go
internal/autopilot/config.go
internal/autopilot/constraints.go
internal/autopilot/constraints_test.go
internal/autopilot/live_test.go
internal/autopilot/openai.go
internal/autopilot/openai_test.go
internal/autopilot/optimality.go
internal/autopilot/optimality_test.go
internal/autopilot/service.go
internal/autopilot/service_test.go
internal/autopilot/types.go
internal/explanation/fallback.go
internal/explanation/nvidia.go
internal/explanation/nvidia_test.go
internal/explanation/openai.go
internal/explanation/openai_test.go
internal/explanation/service.go
internal/explanation/service_test.go
internal/httpapi/advise_test.go
internal/httpapi/autopilot.go
internal/httpapi/autopilot_test.go
internal/httpapi/cors.go
internal/httpapi/cors_test.go
internal/httpapi/demo_test.go
internal/httpapi/docs_test.go
internal/httpapi/explain_test.go
internal/httpapi/handler.go
internal/httpapi/handler_test.go
internal/httpapi/recommend.go
internal/httpapi/recommend_test.go
internal/httpapi/web.go
internal/httpapi/web_test.go
internal/optimizer/goal.go
internal/optimizer/goal_test.go
internal/optimizer/optimizer.go
internal/optimizer/optimizer_test.go
internal/simulation/dataset.go
internal/simulation/decision_json.go
internal/simulation/engine.go
internal/simulation/engine_test.go
internal/simulation/models.go
internal/simulation/regression_test.go
internal/simulation/validator.go
scripts/verify_scores.py
web/.env.example
web/.gitignore
web/DEMO-CHECK.md
web/README.md
web/index.html
web/package-lock.json
web/package.json
web/src/App.tsx
web/src/api.ts
web/src/components/AutopilotDetails.tsx
web/src/components/CityScene.tsx
web/src/components/DistrictVisualization.tsx
web/src/components/ImprovePlan.tsx
web/src/components/Layout.tsx
web/src/components/Recommendation.tsx
web/src/components/ResultCharts.tsx
web/src/components/Skyline.tsx
web/src/components/city-scene.css
web/src/components/common.tsx
web/src/components/district-visualization.css
web/src/components/districtGeometry.ts
web/src/components/skyline.css
web/src/components/useSceneMotion.ts
web/src/contract.ts
web/src/env.d.ts
web/src/interface.css
web/src/main.tsx
web/src/mock-scenario.json
web/src/pages/Autopilot.tsx
web/src/pages/Decisions.tsx
web/src/pages/History.tsx
web/src/pages/Overview.tsx
web/src/pages/Result.tsx
web/src/storage.ts
web/src/style.css
web/src/types.ts
web/src/useAutopilot.ts
web/src/usePlanAssessment.ts
web/src/validation.ts
web/tests/api.test.ts
web/tests/app.test.tsx
web/tests/assessment.test.tsx
web/tests/autopilot-details.test.tsx
web/tests/autopilot.test.tsx
web/tests/city-animation.test.tsx
web/tests/district-flow.test.tsx
web/tests/district-visualization.test.tsx
web/tests/fixtures/golden-explain.json
web/tests/fixtures/golden-improve.json
web/tests/fixtures/golden-result.json
web/tests/improve-plan.test.tsx
web/tests/live-api.mjs
web/tests/live-flow.tsx
web/tests/recommendation.test.tsx
web/tests/result-charts.test.tsx
web/tests/setup.ts
web/tests/storage.test.ts
web/tests/validation.test.ts
web/tsconfig.json
web/vite.config.ts
web/vitest.config.ts
web/vitest.integration.config.ts
Ветки (3)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.