AAYMA
RU
Войти

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

Локальный симулятор городского бюджета: пользователь выбирает ровно 5 мероприятий из 14 для 5 районов Астаны, система проверяет ограничения и…

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

О проекте

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

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

Суть

Локальный симулятор городского бюджета: пользователь выбирает ровно 5 мероприятий из 14 для 5 районов Астаны, система проверяет ограничения и детерминированно рассчитывает Astana Quality of Life Score с визуализацией «до/после» по районам.

Как устроено

Данные из JSON (районы с 10 показателями, 14 мероприятий, правила, синергии, несовместимости) загружаются и валидируются. Валидатор проверяет бюджет ≤100, ровно 5 мер, отсутствие повторов, не более двух мер одного направления, несовместимые пары. Движок применяет эффекты с лагами и синергиями, ограничивает шкалу 0–100 и штрафует за критические показатели. Объяснение строится локально по готовому ScoreResult; для LLM предусмотрен только адаптер. Отдельный solver исчерпывающе ранжирует допустимые сценарии.

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

  • детерминированный скоринг с лагами и синергиями
  • валидация ограничений
  • исчерпывающий перебор сценариев
  • моделирование событий-рисков
  • рекомендации однократной замены меры

Метрики

Эталонный сценарий: бюджет 95/100, Score 56.54, +3.99 к базовому, 0 критических значений (совпадает с ожидаемым ~56.5 из задания)

Особенности

Без внешних зависимостей: только стандартная библиотека Python и чистый JS. Чистая архитектура (data → validator → engine → ai → web), расчёт воспроизводит эталон из ТЗ. Есть переключатель RU/KK/EN, экспорт Markdown-отчёта, сравнение сохранённых сценариев и публичная демо-версия.

Стек

Python · http.server · HTML · CSS · JavaScript · unittest


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

README

README.md

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

О проекте

«Аким на 5 часов» — локальный симулятор для задачи Hackeron. Он помогает городскому управленцу, аналитику или участнику команды проверить последствия распределения ограниченного виртуального бюджета между инициативами по транспорту, экологии, социальной инфраструктуре, безопасности и городским сервисам.

Пользователь выбирает ровно пять мероприятий для условных районов Астаны. Система проверяет ограничения, детерминированно рассчитывает Astana Quality of Life Score и показывает, как изменились показатели каждого района. Это делает компромиссы сценария прозрачными: учитываются и средний результат по городу, и самый слабый район, и критические показатели.

Быстро для жюри

  • Что решает продукт: позволяет сравнить последствия пяти городских решений при фиксированном бюджете и увидеть влияние на районы, слабые места и критические показатели.
  • Публичная демо-версия: https://hackalemai.amrosia.dev/.
  • Как запустить локально: нужен Python 3.10+; выполните python3 -m src.web, затем откройте http://127.0.0.1:8000. Установка зависимостей и ключи API не нужны.
  • Технологии: Python 3.10+, стандартная библиотека (http.server, json, unittest), HTML/CSS/JavaScript и локальные JSON-данные. Расчёт не использует внешние API или сервисы.
  • Как проверить: воспроизведите эталонный сценарий из раздела «Как проверить решение» (Score 56.54) или запустите PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p '*_test.py' -v.

Что реализовано

  • Локальный веб-интерфейс на русском языке: пять карточек решений, выбор района для районных мер, текущий бюджет и кнопка расчёта.
  • Каталог из 14 мероприятий и синтетические исходные данные для 5 районов.
  • Проверка правил до расчёта:
    • бюджет не выше 100;
    • ровно 5 решений;
    • без повторов мероприятий;
    • район обязателен для районной меры и не допускается для городской;
    • не более двух мер одного направления;
    • контроль несовместимых пар.
  • Детерминированный расчёт Astana Quality of Life Score с лагами, синергиями, ограничением шкалы 0–100 и штрафом за критические показатели.
  • Визуальный дашборд результата: SVG-сравнение районных оценок «до/после» и интерактивный просмотр всех 10 показателей выбранного района.
  • Локальное сохранение сценариев и их сравнение в браузере, экспорт Markdown-отчёта, три моделируемых события-риска и три рекомендации однократной замены меры от детерминированной модели.
  • Локальное фактологическое объяснение результата на русском языке. Для внешней LLM предусмотрен внедряемый адаптер, но готовая интеграция с провайдером в репозитории отсутствует.
  • Терминальный интерфейс и необязательный модуль исчерпывающего ранжирования допустимых сценариев.
  • Автоматические тесты модели, CLI, API, объяснений и ранжирования.

Как работает решение

  1. В браузере пользователь выбирает пять мероприятий и при необходимости район.
  2. Интерфейс показывает суммарную стоимость и остаток от бюджета.
  3. После нажатия «Рассчитать сценарий» браузер передаёт только выбранные идентификаторы в локальный JSON API.
  4. Валидатор проверяет набор. Если есть нарушение, Score не рассчитывается и выводятся причины.
  5. Для допустимого набора движок применяет эффекты с учётом лага и синергий, затем вычисляет районные оценки, среднее по городу, минимум района, число критических значений и итоговый Score.
  6. Веб-интерфейс отображает аудит результата по районам и фактологическое текстовое объяснение, сформированное из уже рассчитанных чисел.

Технологии

ОбластьИспользовано
ЯзыкPython 3.10+
Веб-сервер и APIСтандартная библиотека Python: http.server, json
КлиентHTML, CSS, JavaScript без сторонних библиотек
ДанныеЛокальные JSON-файлы
Тестированиеunittest из стандартной библиотеки
AI-слойЛокальное фактологическое объяснение; опциональный интерфейс адаптера для LLM
Внешние API/сервисыНе используются

Проект не требует установки пакетов, ключей API или сетевого доступа для запуска основной версии.

Архитектура

data/*.json
    │
    ▼
src/data ──► src/validator ──► src/engine ──► src/ai
                                  │               │
                                  └────► src/web ◄┘
                                            │
                                     браузер / JSON API

src/solver ──► validator + engine
src/app    ──► validator + engine + ai
  • data/ — исходные синтетические данные: районы, мероприятия, веса, правила, синергии и несовместимости.
  • src/data/ — загрузка JSON и проверка структуры набора.
  • src/validator/ — чистая проверка пользовательского набора решений.
  • src/engine/ — чистый расчёт Score и полный журнал расчётных изменений.
  • src/ai/ — объяснение только по готовому ScoreResult; арифметику не выполняет.
  • src/web/ — локальный HTTP-сервер, JSON API и статический интерфейс; не дублирует правила или расчёты.
  • src/app/ — альтернативный CLI.
  • src/solver/ — необязательное ранжирование допустимых сценариев.
  • tests/ — тесты правил, расчёта, API, интерфейсов, объяснения и ранжирования.

Установка и запуск

Требование: Python 3.10 или новее.

git clone https://github.com/BAITC-Hacks/hack-15801fec-hackeron.git
cd hack-15801fec-hackeron
python3 -m src.web

Откройте в браузере: http://127.0.0.1:8000.

Если порт занят:

python3 -m src.web --port 8765

Тогда интерфейс будет доступен по адресу http://127.0.0.1:8765.

Также доступен CLI:

python3 -m src.app

Как проверить решение

Проверка в веб-интерфейсе

Выберите следующие пять мер:

МераРайон
M7 — Школа + детсадНура
M8 — Центр семейного здоровья / поликлиникаНура
M10 — Освещение и камерыНура
M12 — Единая цифровая платформа обращенийгород
M5 — Чистое топливоСарыарка

Ожидаемый результат из текущей модели:

  • бюджет: 95 / 100;
  • Score: 56.54;
  • изменение к базовому сценарию: +3.99;
  • критических значений: 0.

Это соответствует примеру из задания, где ожидается Score около 56.5.

Автоматическая проверка

PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p '*_test.py' -v

Тесты проверяют базовый Score, эталонный набор, лаги, синергии, независимость от порядка мер, обработку недопустимых наборов, CLI, JSON API, объяснения и ранжирование.

Данные и интеграции

Все данные лежат в репозитории и не загружаются из внешних источников во время работы:

  • data/districts.json — 5 районов, доли населения и 10 показателей.
  • data/measures.json — 14 мероприятий, стоимость, лаг и эффекты.
  • data/rules.json — бюджет, веса, горизонт, критический порог, синергии и несовместимости.

Числа транскрибированы из части II INSTRUCTIONS.md. Исходные документы сохранены в task/original/, текстовые версии — в task/txt/; происхождение и контрольные суммы описаны в DOCUMENTATION.md.

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

Ограничения текущей версии

  • Публичная демо-версия доступна, но не заменяет локальный воспроизводимый запуск и не содержит многопользовательского режима.
  • Объяснение по умолчанию локальное и фактологическое, а не ответ от подключённой LLM.
  • Интерфейс не содержит многопользовательского сравнения команд, PDF/презентации и подключения к реальному набору городских данных.
  • Ранжирование сценариев исчерпывающее и может выполняться десятки секунд.
  • Датасет синтетический и предназначен для хакатонной демонстрации, а не для управления реальным городом.

Ссылка на deployed-версию

Публичный развёрнутый экземпляр: https://hackalemai.amrosia.dev/.

Для воспроизводимой локальной проверки используйте запуск по инструкции выше.

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

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

amrosia 14zhmukhamed 8Codex 4

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

  • 2026-09-23 17:35docs: finalize submission materials and deployment linkamrosia
  • 2026-09-23 17:30deploy: add minimal deploy.sh that runs the web service on 0.0.0.0amrosia
  • 2026-09-23 17:26docs(agent-chat): log local 0.0.0.0:8080 deployment of the web serviceamrosia
  • 2026-09-23 17:07chore: release paused artifact scopeCodex
  • 2026-09-23 17:06ci: remove blocked workflowCodex
  • 2026-09-23 16:43ci: verify supported Python versionsCodex
  • 2026-09-23 16:42chore: merge coordination log historiesCodex
  • 2026-09-23 16:33docs: add jury scorecardamrosia
Все коммиты (26)
  • 2026-09-23 16:23web: expand multilingual interface labelszhmukhamed
  • 2026-09-23 16:20web: add Russian Kazakh English language switcherzhmukhamed
  • 2026-09-23 16:00docs: highlight jury essentials in readmezhmukhamed
  • 2026-09-23 15:27web: add scenario tools and risk simulationzhmukhamed
  • 2026-09-23 15:15web: add interactive district visual dashboardzhmukhamed
  • 2026-09-23 15:02docs: add judge-facing Russian READMEzhmukhamed
  • 2026-09-23 14:51web: add local simulator interfaceamrosia
  • 2026-09-23 14:42solver: rank valid decision scenariosamrosia
  • 2026-09-23 14:33ai: add fact-grounded Russian explanationsamrosia
  • 2026-09-23 14:30docs: add reproducible simulator guideamrosia
  • 2026-09-23 14:29app: add Russian simulator CLIamrosia
  • 2026-09-23 14:27engine: implement deterministic scoringamrosia
  • 2026-09-23 14:22validator: enforce simulator selection ruleszhmukhamed
  • 2026-09-23 14:02data: add source-traceable simulator dataset loaderzhmukhamed
  • 2026-09-23 13:53docs(agents): add agents/ folder with general structure plan for the simulatoramrosia
  • 2026-09-23 13:45docs(task): archive source docx, add txt conversions, merged INSTRUCTIONS.md and DOCUMENTATION.mdamrosia
  • 2026-09-23 13:33docs(agent-chat): release bootstrap scopeamrosia
  • 2026-09-23 13:33docs: add AGENTS.md coordination protocol and AGENT_CHAT.md logamrosia
Структура репозитория (39 файлов)
.gitignore
DOCUMENTATION.md
INSTRUCTIONS.md
JUDGE_SCORECARD.md
README.md
data/districts.json
data/measures.json
data/rules.json
deploy.sh
src/ai/__init__.py
src/ai/explanation.py
src/app/__init__.py
src/app/__main__.py
src/app/cli.py
src/data/__init__.py
src/data/loader.py
src/engine/__init__.py
src/engine/scoring.py
src/solver/__init__.py
src/solver/ranking.py
src/validator/__init__.py
src/validator/selection.py
src/web/__init__.py
src/web/__main__.py
src/web/api.py
src/web/server.py
src/web/static/app.js
src/web/static/index.html
src/web/static/style.css
task/original/HackAlem_AI_«Аким_на_5_часов»_AI_симулятор_управления_городом.docx
task/original/Датасет районов.docx
task/txt/HackAlem_AI_«Аким_на_5_часов»_AI_симулятор_управления_городом.txt
task/txt/Датасет районов.txt
tests/ai_explanation_test.py
tests/app_cli_test.py
tests/engine_scoring_test.py
tests/solver_ranking_test.py
tests/validator_selection_test.py
tests/web_api_test.py

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

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

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