О проекте
Команда: 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.
Проверка за минуту
- На первом экране нажмите «Показать проверочный сценарий».
- В отчёте проверьте стоимость 95, исходный Score 52,56 и новый 56,54. Сравните районы и источник объяснения.
- Нажмите «Проверить одну замену», затем «Сравнить с оптимумом». Оба варианта предлагаются для сравнения; применить их можно только своим решением.
| План | Бюджет | Score на экране | Что меняется |
|---|---|---|---|
| Исходное состояние | 0 / 100 | 52,56 | Одинаково для всех пользователей |
| Проверочный: M7, M8, M10 → Нура; M12 → город; M5 → Сарыарка | 95 / 100 | 56,54 | Синергия M10 + M12 |
| Одна замена: M5/Сарыарка → M3/Нура | 100 / 100 | 57,21 | Нура выигрывает, Сарыарка теряет около 1,21 балла |
| Оптимум заданной модели | 98 / 100 | 57,24 | M2/город, M3/Нура, M8/Нура, M9/Нура, M14/город |
Точные значения для автоматической проверки: 52.55768, 56.54307, 57.20556, 57.236735 соответственно. Большее значение в симуляторе не означает доказанную пользу для реального города.
Как пользоваться веб-интерфейсом
- Изучите город. Выберите район на условной 3D-схеме или в списке под ней: справа появятся его балл и два самых слабых показателя. Нажмите «Перейти к мерам» для своего плана. Кнопка «Показать проверочный сценарий» сразу откроет готовый расчёт из таблицы выше и заменит текущий пакет.
- Соберите пять мер. Откройте «Все 14 мер» и при желании отфильтруйте каталог по направлению. В карточке видны стоимость и лаг, в окне меры — её полный эффект. Перетащите районную меру на район схемы или цель «Назначить на территорию»; городская мера охватит все пять районов. Без перетаскивания нажмите «Выбрать меру», укажите район и «Включить в пакет». Панель плана показывает число решений и расходы из бюджета 100.
- Рассчитайте последствия. Когда выбраны ровно пять разных допустимых мер, нажмите «Рассчитать результат». Отчёт покажет исходный и новый Score через 8 кварталов, потраченный и оставшийся бюджет, изменения районов, диаграммы, синергии и источник объяснения. Выберите район и переключайте на схеме «Было» / «Стало». При повторе меры, третьей мере одного направления, неверном районе, превышении бюджета или конфликте интерфейс покажет причину; невалидный план не получает Score.
- Сравните варианты. В отчёте кнопки «Проверить одну замену» и «Сравнить с оптимумом» покажут другой набор мер, его стоимость, Score и разницу по районам. Выберите «Оставить свой» или «Применить план». Применение возвращает в планировщик: предложенный пакет можно изменить и затем снова нажать «Рассчитать результат».
- Задайте приоритет советнику. В поле «Ваш приоритет» напишите, например, «Помочь Нуре, не ухудшив Сарыарку», и нажмите «Разобрать варианты». Вы увидите свой план, одну замену и оптимум заданной модели с их компромиссами. AI, если доступен, объясняет уже рассчитанные факты; без модели текст помечен
computed_facts. Советник не применяет план за вас.
Score считает только симулятор по формуле датасета: порядок мер не влияет на результат, а остаток бюджета не даёт бонуса. Полная формула и ограничения — в сводке ТЗ; формат API — в контрактах.
Проверяйте живую модель в интерфейсе, запущенном из того же клона, где лежит .env. На другом сервере или в worktree без этого файла советник покажет расчётные факты без вызова LLM. После изменения .env перезапустите сервер и обновите страницу. Метка «AI-разбор проверенных расчётов» означает ответ модели; «Расчётные факты · AI-модель не настроена/недоступна» означает резервный разбор. Три числовых варианта всегда считает симулятор.
Подключить живое AI-объяснение — необязательно
Основной сценарий работает без ключа. Если нужен ответ модели:
-
Если локального
.envещё нет, создайте его из образца:cp .env.example .env. -
Заполните одну пару настроек:
Провайдер Переменные в .envДополнительный шаг OpenAI API OPENAI_API_KEY,OPENAI_MODELНе нужен; пример ID модели — gpt-4o-miniNVIDIA API Catalog NVIDIA_API_KEY,NVIDIA_MODELpython3 -m pip install -r requirements-model.txt -
Перезапустите
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-прогон пока не подтверждён. Без доступной модели объяснение строится из вычисленных фактов и явно помечается.
Для деталей: контракты модулей, визуализация, порядок сдачи.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.