AAYMA
RU
Войти

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

Симулятор городских решений с условной 3D-схемой Астаны на Canvas и перетаскиванием мер на районы.

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

О проекте

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

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

Суть

Симулятор городских решений с условной 3D-схемой Астаны на Canvas и перетаскиванием мер на районы. Есть точный оптимизатор портфеля, сравнение своего плана с «одной заменой» и оптимумом модели, AI-советник объясняет компромиссы.

Как устроено

Детерминированный симулятор (src/simulator.py) считает Score по формуле датасета. Точный целочисленный оптимизатор портфеля ищет лучший план и лучшую одиночную замену; результат сверяется с независимым полным перебором в benchmark. Сервер на стандартной библиотеке Python отдаёт веб-интерфейс (HTML/JS/Canvas). Объяснения строятся на проверенных расчётных фактах через OpenAI Responses API или NVIDIA API Catalog, без модели работает резервный режим computed_facts.

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

  • точный целочисленный оптимизатор портфеля
  • сверка с полным перебором
  • условные нелинейные рекомендации
  • grounded-объяснения по расчётным фактам
  • Canvas 3D-визуализация
  • бенчмарк на London Ward Profiles

Метрики

Score: исходный 52.55768, контрольный план 56.54307, одна замена 57.20556, оптимум модели 57.236735 (совпадает с точным перебором)

Особенности

Единственная команда в пачке с математическим оптимумом и проверкой оптимизатора на внешних данных (London Ward Profiles). Запуск без зависимостей одной командой python3 src/server.py. Параллельная работа нескольких Codex-агентов в worktree плюс отдельный агент-критик.

Стек

Python · HTML · CSS · JavaScript · Canvas

Модели

gpt-4o-mini (пример) · NVIDIA API Catalog


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

README

README.md

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

Симулятор городских решений: распределите бюджет 100 между пятью мерами для пяти условных районов Астаны и посмотрите, как изменится качество жизни по формуле задачи. Исследуйте условную 3D-схему города, перетаскивайте меры на районы и сравнивайте результаты с лучшей заменой одного решения и оптимумом модели. AI-советник помогает разобрать компромиссы.

Данные районов синтетические. Интерактивная 3D-схема помогает сравнивать показатели, но не показывает реальные границы города.

Запуск за 30 секунд

  • Нужны Python 3.10+, современный браузер и доступ к репозиторию.
  • Для основного сценария не нужны pip install, API-ключ или интернет после получения кода.
git clone https://github.com/BAITC-Hacks/hack-6775166e-lossless.git
cd hack-6775166e-lossless
python3 src/server.py

Откройте http://127.0.0.1:8000/. Остановить сервер: Ctrl+C. Если порт занят: PORT=8080 python3 src/server.py и откройте порт 8080.

Проверка за минуту

  1. На первом экране нажмите «Показать проверочный сценарий».
  2. В отчёте проверьте стоимость 95, исходный Score 52,56 и новый 56,54. Сравните районы и источник объяснения.
  3. Нажмите «Проверить одну замену», затем «Сравнить с оптимумом». Оба варианта предлагаются для сравнения; применить их можно только своим решением.
ПланБюджетScore на экранеЧто меняется
Исходное состояние0 / 10052,56Одинаково для всех пользователей
Проверочный: M7, M8, M10 → Нура; M12 → город; M5 → Сарыарка95 / 10056,54Синергия M10 + M12
Одна замена: M5/Сарыарка → M3/Нура100 / 10057,21Нура выигрывает, Сарыарка теряет около 1,21 балла
Оптимум заданной модели98 / 10057,24M2/город, M3/Нура, M8/Нура, M9/Нура, M14/город

Точные значения для автоматической проверки: 52.55768, 56.54307, 57.20556, 57.236735 соответственно. Большее значение в симуляторе не означает доказанную пользу для реального города.

Как пользоваться веб-интерфейсом

  1. Изучите город. Выберите район на условной 3D-схеме или в списке под ней: справа появятся его балл и два самых слабых показателя. Нажмите «Перейти к мерам» для своего плана. Кнопка «Показать проверочный сценарий» сразу откроет готовый расчёт из таблицы выше и заменит текущий пакет.
  2. Соберите пять мер. Откройте «Все 14 мер» и при желании отфильтруйте каталог по направлению. В карточке видны стоимость и лаг, в окне меры — её полный эффект. Перетащите районную меру на район схемы или цель «Назначить на территорию»; городская мера охватит все пять районов. Без перетаскивания нажмите «Выбрать меру», укажите район и «Включить в пакет». Панель плана показывает число решений и расходы из бюджета 100.
  3. Рассчитайте последствия. Когда выбраны ровно пять разных допустимых мер, нажмите «Рассчитать результат». Отчёт покажет исходный и новый Score через 8 кварталов, потраченный и оставшийся бюджет, изменения районов, диаграммы, синергии и источник объяснения. Выберите район и переключайте на схеме «Было» / «Стало». При повторе меры, третьей мере одного направления, неверном районе, превышении бюджета или конфликте интерфейс покажет причину; невалидный план не получает Score.
  4. Сравните варианты. В отчёте кнопки «Проверить одну замену» и «Сравнить с оптимумом» покажут другой набор мер, его стоимость, Score и разницу по районам. Выберите «Оставить свой» или «Применить план». Применение возвращает в планировщик: предложенный пакет можно изменить и затем снова нажать «Рассчитать результат».
  5. Задайте приоритет советнику. В поле «Ваш приоритет» напишите, например, «Помочь Нуре, не ухудшив Сарыарку», и нажмите «Разобрать варианты». Вы увидите свой план, одну замену и оптимум заданной модели с их компромиссами. AI, если доступен, объясняет уже рассчитанные факты; без модели текст помечен computed_facts. Советник не применяет план за вас.

Score считает только симулятор по формуле датасета: порядок мер не влияет на результат, а остаток бюджета не даёт бонуса. Полная формула и ограничения — в сводке ТЗ; формат API — в контрактах.

Проверяйте живую модель в интерфейсе, запущенном из того же клона, где лежит .env. На другом сервере или в worktree без этого файла советник покажет расчётные факты без вызова LLM. После изменения .env перезапустите сервер и обновите страницу. Метка «AI-разбор проверенных расчётов» означает ответ модели; «Расчётные факты · AI-модель не настроена/недоступна» означает резервный разбор. Три числовых варианта всегда считает симулятор.

Подключить живое AI-объяснение — необязательно

Основной сценарий работает без ключа. Если нужен ответ модели:

  1. Если локального .env ещё нет, создайте его из образца: cp .env.example .env.

  2. Заполните одну пару настроек:

    ПровайдерПеременные в .envДополнительный шаг
    OpenAI APIOPENAI_API_KEY, OPENAI_MODELНе нужен; пример ID модели — gpt-4o-mini
    NVIDIA API CatalogNVIDIA_API_KEY, NVIDIA_MODELpython3 -m pip install -r requirements-model.txt
  3. Перезапустите python3 src/server.py и повторите проверочный сценарий. Метка model означает реальный ответ API; computed_facts — резервное объяснение при отсутствии ключа или ошибке.

  • Настройки читаются из .env текущего клона. Переменные процесса имеют приоритет, включая пустые. Если заданы оба провайдера, выбирается NVIDIA. Для явного выбора OpenAI: NVIDIA_API_KEY= NVIDIA_MODEL= python3 src/server.py.
  • Для живого ответа нужен ваш разрешённый ключ провайдера; проект не выдаёт тестовые ключи.
  • Ключи не вводятся в браузере и не должны попадать в Git. .env уже исключён из репозитория.
  • Сетевые таймауты: OpenAI — 20 с, NVIDIA — 45 с; интерфейс ждёт расчёт и объяснение до 75 с. При ошибке автоматического переключения провайдера нет.

Проверка настроек без API-запроса, затем объяснения плана, сравнения и совета:

python3 scripts/check-model.py --check-config
python3 scripts/check-model.py --scenario both
python3 scripts/check-model-advice.py

Скрипты следуют тому же приоритету провайдеров, что приложение. Для проверки конкретного провайдера добавьте --provider openai или --provider nvidia к первым двум командам; советника с OpenAI при настроенной NVIDIA запустите как NVIDIA_API_KEY= NVIDIA_MODEL= python3 scripts/check-model-advice.py. Живая проверка успешна только при source: model; резервный ответ даёт код выхода 2. Скрипты не печатают ключи. Фактические прогоны и ограничения — в журнале интеграции и проверке модели.

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

python3 -m unittest discover -s tests -q
python3 benchmark/optimizer_benchmark.py --scenario official --oracle --optimizer python3 src/optimizer.py
  • Тесты проверяют базовый и контрольный Score, ошибки валидации, лаг, синергии, независимость от порядка, оптимизатор и объяснение.
  • Второй шаг сравнивает оптимизатор с независимым точным перебором: на официальных данных ожидается максимум 57.236735. Дополнительные сценарии и команды — в описании benchmark.
  • Для ручной проверки пройдите сценарий «Проверка за минуту» выше: он использует обычную серверную валидацию.

Данные, компоненты и ограничения

  • Источник чисел: два документа в task/ — ТЗ и синтетический датасет районов. Права на их публикацию отдельно не указаны; командный репозиторий приватный.
  • Реализация: Python, HTML, CSS, JavaScript и Canvas, включая 14 условных 3D-моделей мер, написаны для этой задачи. Светлая гамма восстановлена из исходного интерфейса команды; официальный бренд и логотип Astana Hub не используются. До старта в репозитории были инфраструктурные скрипты и рабочие инструкции; состав описан в плане команды.
  • Необязательная библиотека: для NVIDIA используется openai==3.16.2 (Apache-2.0) через совместимый API. OpenAI Responses API вызывается средствами стандартной библиотеки Python.
  • Отдельный benchmark: использует открытый London Ward Profiles (OGL v2) как технический тест оптимизатора; его данные не входят в Score Астаны. Происхождение и нормировка — в описании benchmark.
  • Границы результата: это симуляция по заданной формуле, не прогноз реальных эффектов. Успешный сквозной NVIDIA-прогон пока не подтверждён. Без доступной модели объяснение строится из вычисленных фактов и явно помечается.

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

Звёзды
⭐ 2
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
120
Авторы
4
Файлы
44
Ветки
6

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

AleksandraMikheeva 94neverexz 22AleksandraMikheeva 2AleksandraMikheeva 2

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

  • 2026-09-23 17:45docs: distinguish prior and current verification runsAleksandraMikheeva
  • 2026-09-23 17:44docs: record authorized main advice API checkAleksandraMikheeva
  • 2026-09-23 17:40Merge team README guide with advisor diagnosticsAleksandraMikheeva
  • 2026-09-23 17:38docs: explain advisor model verification and fallbackAleksandraMikheeva
  • 2026-09-23 17:38docs(ui): clarify when advisor checks model availabilityAleksandraMikheeva
  • 2026-09-23 17:38docs(readme): добавить краткий гид по веб-интерфейсуneverexz
  • 2026-09-23 17:38fix(ui): explain advisor fallback and request failuresAleksandraMikheeva
  • 2026-09-23 17:37fix(advice): return safe model failure diagnosticsAleksandraMikheeva
Все коммиты (120)
  • 2026-09-23 17:25Merge latest server fallback check into design releaseAleksandraMikheeva
  • 2026-09-23 17:21Lift citywide initiative dock clear of scene footerAleksandraMikheeva
  • 2026-09-23 17:21Merge AI integration with light 3D interfaceAleksandraMikheeva
  • 2026-09-23 17:18fix(server): добавить reason в аварийное объяснениеneverexz
  • 2026-09-23 17:13docs(readme): упростить запуск и проверку симулятораneverexz
  • 2026-09-23 17:13Unify light civic surfaces and pin dialog actionAleksandraMikheeva
  • 2026-09-23 17:13Use neutral wording for plan comparisonAleksandraMikheeva
  • 2026-09-23 17:12Spread initiative sculptures across district platformsAleksandraMikheeva
  • 2026-09-23 17:12Merge verified advisor notes into design integrationAleksandraMikheeva
  • 2026-09-23 17:10Restore focus to a usable control after dialog closeAleksandraMikheeva
  • 2026-09-23 17:10Apply display font at final theme cascadeAleksandraMikheeva
  • 2026-09-23 17:07Improve measure preview and report baseline clarityAleksandraMikheeva
  • 2026-09-23 17:05Document light 3D decision flow and scene contractAleksandraMikheeva
  • 2026-09-23 17:05docs: record final clean and live integration checksneverexz
  • 2026-09-23 17:01Merge district-safe advisor constraints from mainneverexz
  • 2026-09-23 17:01Label planned initiatives before simulationAleksandraMikheeva
  • 2026-09-23 17:00Restore Egor palette and surface initiative targetsAleksandraMikheeva
  • 2026-09-23 16:58Show initiative models in city and compact dioramaAleksandraMikheeva
  • 2026-09-23 16:56Merge AI integration with priority advisor and city interactionsneverexz
  • 2026-09-23 16:53Keep stage navigation off the app containerAleksandraMikheeva
  • 2026-09-23 16:51Record live district-safe advisor resultAleksandraMikheeva
  • 2026-09-23 16:49Constrain advisor model to district-safe optionsAleksandraMikheeva
  • 2026-09-23 16:48Record exact advisor verification questionAleksandraMikheeva
  • 2026-09-23 16:47docs: record clean checkout and live optimizer acceptanceneverexz
  • 2026-09-23 16:45Merge remote-tracking branch 'origin/main' into agent/human-advisorAleksandraMikheeva
  • 2026-09-23 16:44Ground advisor answers in relevant district factsAleksandraMikheeva
  • 2026-09-23 16:44Document one-minute AI verification pathAleksandraMikheeva
  • 2026-09-23 16:41Merge latest city visualization into jury releaseAleksandraMikheeva
  • 2026-09-23 16:41Allow first structured OpenAI request more timeAleksandraMikheeva
  • 2026-09-23 16:40Constrain OpenAI selections with strict dynamic schemasAleksandraMikheeva
  • 2026-09-23 16:37Document drag interactions and scene picking contractAleksandraMikheeva
  • 2026-09-23 16:37Clear city highlight after rejected dragAleksandraMikheeva
  • 2026-09-23 16:36Put one-minute judge path at top of READMEAleksandraMikheeva
  • 2026-09-23 16:33Make verification scenario and report visible to judgesAleksandraMikheeva
  • 2026-09-23 16:33Give measure cards one readable column on phonesAleksandraMikheeva
  • 2026-09-23 16:32Merge AI integration with 3D city and preserve optimizer flowsneverexz
  • 2026-09-23 16:32Always show district loss in comparison adviceAleksandraMikheeva
  • 2026-09-23 16:32Merge branch 'agent/human-advisor' into agent/jury-releaseAleksandraMikheeva
  • 2026-09-23 16:30Keep drag grip tap activation availableAleksandraMikheeva
  • 2026-09-23 16:30Show blocked state on every drag targetAleksandraMikheeva
  • 2026-09-23 16:29Avoid accidental drops on short drag gesturesAleksandraMikheeva
  • 2026-09-23 16:27Clarify invalid drag preview and snap on canvasAleksandraMikheeva
  • 2026-09-23 16:26Add measure drag and drop onto city targetsAleksandraMikheeva
  • 2026-09-23 16:24Add district picking and drop preview to 3D sceneAleksandraMikheeva
  • 2026-09-23 16:19Merge remote-tracking branch 'origin/main' into agent/human-advisorAleksandraMikheeva
  • 2026-09-23 16:12fix(ui): keep advice errors visible and verify OpenAI flowneverexz
  • 2026-09-23 16:11Merge latest city deck with human advisorAleksandraMikheeva
  • 2026-09-23 16:10Localize model-backed fact text tooAleksandraMikheeva
  • 2026-09-23 16:10Localize computed fact labels in reportAleksandraMikheeva
  • 2026-09-23 16:09Document integrated 3D city flow and review stepsAleksandraMikheeva
  • 2026-09-23 16:07Improve mobile labels and dark report chart contrastAleksandraMikheeva
  • 2026-09-23 16:06Allow redraw after a hidden scene frameAleksandraMikheeva
  • 2026-09-23 16:02Apply dark chart overrides after chart stylesheetAleksandraMikheeva
  • 2026-09-23 16:01Merge remote-tracking branch 'origin/main'AleksandraMikheeva
  • 2026-09-23 16:01Add grounded human priority advisorAleksandraMikheeva
  • 2026-09-23 16:01Reset catalogue direction when entering from city mapAleksandraMikheeva
  • 2026-09-23 16:00Use result-specific guidance in district dossierAleksandraMikheeva
  • 2026-09-23 16:00Clarify before state and reveal district context on mobileAleksandraMikheeva
  • 2026-09-23 16:00Make 3D buildings selectableAleksandraMikheeva
  • 2026-09-23 15:59Build interactive city control deck and district-first planning flowAleksandraMikheeva
  • 2026-09-23 15:58Fit scene controls on narrow phonesAleksandraMikheeva
  • 2026-09-23 15:56Keep district controls current without CanvasAleksandraMikheeva
  • 2026-09-23 15:54Add interactive 3D district sceneAleksandraMikheeva
  • 2026-09-23 15:52feat(ai): verify OpenAI explanations and comparison integrationneverexz
  • 2026-09-23 15:48Define ownership and API for interactive city sceneAleksandraMikheeva
  • 2026-09-23 15:43feat(explanation): загружать настройки модели из .envneverexz
  • 2026-09-23 15:30Integrate decision dashboard with one-change adviceAleksandraMikheeva
  • 2026-09-23 15:17Verify OpenAI explanations on both scenariosAleksandraMikheeva
  • 2026-09-23 15:11Merge remote-tracking branch 'origin/main' into agent/interfaceneverexz
  • 2026-09-23 15:10Merge interface with current main and preserve plan comparisonneverexz
  • 2026-09-23 15:06Prepare live NVIDIA acceptance for both explanation flowsAleksandraMikheeva
  • 2026-09-23 15:05Reassess integrated MVP against critic findingsAleksandraMikheeva
  • 2026-09-23 15:04Merge current main and preserve both comparison flowsAleksandraMikheeva
  • 2026-09-23 15:00Connect one-change comparison to grounded AI explanationsAleksandraMikheeva
  • 2026-09-23 14:59Show plan specific residual risk in explanationsAleksandraMikheeva
  • 2026-09-23 14:59Match chart score rounding to result tableAleksandraMikheeva
  • 2026-09-23 14:59Document verified MVP comparison flowAleksandraMikheeva
  • 2026-09-23 14:58feat(interface): добавить сценарий «Пять распоряжений»neverexz
  • 2026-09-23 14:57Review MVP against hackathon requirementsAleksandraMikheeva
  • 2026-09-23 14:57Compare manual plan with optimizer before adoptionAleksandraMikheeva
  • 2026-09-23 14:53Assign independent critic worktreeAleksandraMikheeva
  • 2026-09-23 14:41Document optimizer compliance and AI gap auditAleksandraMikheeva
  • 2026-09-23 14:34Add reproducible London ward data benchmarkAleksandraMikheeva
  • 2026-09-23 14:34Document external-data optimizer checkAleksandraMikheeva
  • 2026-09-23 14:34fix(explanation): проверять NVIDIA при контрольном прогонеneverexz
  • 2026-09-23 14:32Add conditional nonlinear portfolio recommendationsAleksandraMikheeva
  • 2026-09-23 14:27docs(agents): закрепить владельцев веток и правила интеграцииneverexz
  • 2026-09-23 14:12Integrate optimizer guidance and NVIDIA verificationAleksandraMikheeva
  • 2026-09-23 14:12Add grounded optional AI explanationAleksandraMikheeva
  • 2026-09-23 14:12Space district scores and changesAleksandraMikheeva
  • 2026-09-23 14:12Add result charts for city score and districtsAleksandraMikheeva
  • 2026-09-23 14:12Add exact integer portfolio optimizerAleksandraMikheeva
  • 2026-09-23 14:12Add optimizer plan suggestion to web UIAleksandraMikheeva
  • 2026-09-23 14:12Support NVIDIA model explanationsAleksandraMikheeva
  • 2026-09-23 14:09docs(team): закрепить роли Егора и Сашиneverexz
  • 2026-09-23 13:55Build city simulator web interfaceAleksandraMikheeva
  • 2026-09-23 13:54Add deterministic optimizer benchmark and data provenanceAleksandraMikheeva
  • 2026-09-23 13:53Add integration contracts and local HTTP APIAleksandraMikheeva
  • 2026-09-23 13:52Implement deterministic city simulation engineAleksandraMikheeva
  • 2026-09-23 13:52Include baseline score on validation errorsAleksandraMikheeva
  • 2026-09-23 13:33docs(submission): зафиксировать форму сдачи и дедлайнneverexz
  • 2026-09-23 13:28chore(git): объединить требования задачи и правила APIneverexz
  • 2026-09-23 13:27docs(task): зафиксировать ТЗ симулятора и датасетneverexz
  • 2026-09-23 13:06Route critical model runs to Egor NVIDIA accountAleksandraMikheeva
  • 2026-09-23 13:04Document API budgets and NVIDIA run acceptance workflowAleksandraMikheeva
  • 2026-09-23 12:29Merge remote-tracking branch 'origin/main' into testneverexz
  • 2026-09-23 12:24Prepare isolated agent worktreesAleksandraMikheeva
  • 2026-09-23 12:02Clarify Codex task coordination before specAleksandraMikheeva
  • 2026-09-23 11:34Prepare parallel Codex worktreesAleksandraMikheeva
  • 2026-09-23 11:16docs: add hackathon working instructionsneverexz
  • 2026-09-20 16:47remove preflight connectivity testAleksandraMikheeva
  • 2026-09-20 16:45preflight testAleksandraMikheeva
Структура репозитория (44 файлов)
.env.example
.gitignore
.worktreeinclude
AGENTS.md
README.md
benchmark/london_ward_benchmark.py
benchmark/optimizer_benchmark.py
benchmark/ward-profiles-excel-version.csv
docs/benchmark-data.md
docs/conditional-optimization.md
docs/contracts.md
docs/critic-review.md
docs/model-run-issue.md
docs/model-verification.md
docs/optimizer-audit.md
docs/parallel-agents.md
docs/submission.md
docs/task-requirements.md
docs/visualization.md
requirements-model.txt
scripts/agent-worktree
scripts/check-model-advice.py
scripts/check-model-comparison.py
scripts/check-model.py
src/explanation.py
src/optimizer.py
src/server.py
src/simulator.py
task/HackAlem AI_ «Аким на 5 часов» - AI-симулятор управления городом.docx
task/submission-form-2026-09-23.png
task/Датасет районов.docx
tests/test_advice.py
tests/test_explanation.py
tests/test_http_integration.py
tests/test_optimizer.py
tests/test_recommendation.py
tests/test_simulator.py
web/app.js
web/charts.css
web/charts.js
web/city3d.css
web/city3d.js
web/index.html
web/style.css
Ветки (6)

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

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

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