✈️ OpenTTD · Полигон ИИ-экосистемы

OTTD Plan

Переделка OpenTTD в симулятор замкнутой ИИ-экосистемы: тестируем замкнутость контура, жизнеспособность и КПД (R) на готовом движке — без написания своего движка с нуля.
Опорная страница проекта · Обновлено: 02.08.2026 · Рабочая область: Desktop\OTTD proj

📊 Статус проекта

Сводный прогресс по этапам. Отмечай задачи — состояние сохраняется в браузере (localStorage).
0%
выполнено задач
0
задач готово
0
всего задач
текущий этап
ЭтапНазваниеСтатусКритерий готовности
0Окружение: движок + графика✅ готовоOpenTTD 15.3 + OpenGFX 8.0 скачаны, headless-запуск
1Контур: NewGRF-индустрии (FIRS или свои)⬜ планЦепочки mine→factory→town и recycling в игре
2GameScript «Экосистема» (физика R)⬜ планGS считает R, M_loss, A(t), пишет метрики в лог
3AI «ИИ-ядро» (компания-экосистема)⬜ планПарк живёт ≥N лет без займов при R≥порога
4Батч-раннер сценариев⬜ планПрогон R∈{0.85,0.90,0.95,0.995}×λ×MTBF → results/*.csv
5Анализ: карта жизнеспособности⬜ планОтчёт: пороги выживания, N_min, T_cycle, точки коллапса
6RL-агент (опц.) через admin-порт⬜ планВнешний агент повторяет лучшие стратегии

🎯 Цель и рамки

Зачем: проверить на готовом движке (OpenTTD), замыкается ли контур ИИ-экосистемы (энергия → добыча → завод → роботы → продукция → рециклинг → обратно) при заданных параметрах, и измерить КПД системы. Результат — «карта жизнеспособности»: при каких R, T_cycle, MTBF система живёт 100+ игровых лет без внешних вливаний.

☀️ Энергия ⛏️ Добыча (seed) 🏭 Завод 🤖 Роботы (автопарк) 📦 Продукция → города ♻️ Рециклинг (R) 🏭 Завод
Условие победы сценария (из /plancontent §0.3): система работает 100 игровых лет без единого обращения к ИМПОРТУ (займы = внешние вливания) и без коллапса. Поражение: банкротство / энергия=0 / гибель всего парка / пустые склады.
Почему OpenTTD, а не свой движок: на сайте уже есть ТЗ самописной симуляции (/gameplan, /plancontent, /layerplan2). OpenTTD даёт из коробки: индустрии с входами/выходами, транспорт с износом и поломками, города-потребители, экономику компаний, headless-режим для батчей, AI/GS-скрипты (Squirrel) = ИИ-ядро, admin-порт для RL-агента.

🏗️ Маппинг: слои экосистемы → сущности OpenTTD

Каждый слой из plan1/plan2 отображается на готовую механику движка. Жирным — что делаем своими скриптами.
Слой экосистемыСущность OpenTTDРеализация
⚡ ЭнергетическийИндустрия (Solar/Wind/Coal Plant) + груз «energy»NewGRF-индустрия; баланс энергии ≈ деньги компании (доход от продажи vs running costs)
⛏️ Добыча (экстракция)Шахты: coal, iron ore, copper…Запас seed лимитируется GameScript (закрытие/снижение производства) — «только на старт и при падении R»
🏭 Производство (завод-репликатор)Steel Mill / Factory / Goods FactoryСтандартные цепочки: сырьё → товары; «роботы» покупаются за деньги, созданные экосистемой
🤖 Роботы (end effectors)Транспорт: грузовики/поездаИзнос = lifespan + поломки (breakdowns on); депо = обслуживание; замена = «репликация»
🧠 ИИ-ядроAI-скрипт компании (Squirrel)Строит, покупает, маршрутизирует, балансирует; позже — внешний RL-агент через admin-порт
♻️ Рециклинг (замыкание)Recycling plant (FIRS: scrap → recycled) + GS-учётR считает GameScript: возвращено/принято; потери (1−R) списываются как M_loss
📦 ПотребителиГородаПринимают товары (спрос); «waste» из городов → на рециклинг (цепочка замыкается)
💰 Бюджет / жизнеспособностьДеньги компанииКредиты = ИМПОРТ (внешние вливания); банкротство = коллапс системы
Ключевой принцип учёта: движок не сохраняет массу (деньги абстрактны), поэтому все массовые потоки и КПД считает GameScript (события производства/доставки грузов), и пишет метрики в файл. OpenTTD — «физика» движения и экономики, GS — «физика» экосистемы.

🪜 Уровни переделки

🟢L0 — Скрипты (сейчас)

GameScript + AI на Squirrel + готовые NewGRF (FIRS 4). Без компиляции C++. Покрывает главный вопрос: замыкается ли контур и какой КПД. Быстро, дни.

🟡L1 — C++ форк (позже)

Настоящая масса в движке, индустрия-производитель ТС, отказы Weibull, водный цикл. Нужен тулчейн: MinGW-w64 ~2 ГБ (влезает) или MSVC ~10 ГБ (впритык к 12.8 ГБ диска).

🟣L2 — RL-агент (опц.)

Python-агент через admin-порт (TCP): WorldSnapshot → решения → команды. Reward: α·A + β·R + γ·export − δ·import − ε·loans (из /plancontent §8.4).

🧪 Параметры эксперимента

Управляемые переменные сценариев и что они значат (из plan3 + plancontent).
ПараметрЗначенияРольКак задаём
R0.85 / 0.90 / 0.95 / 0.995КПД рециклинга — главный параметр выживанияМножитель возврата в GS-логике рециклинга
R(n)R₀·exp(−λ·n)Деградация КПД с числом цикловλ в конфиге сценария, GS деградирует множитель
F0.8–1.0Доля сложности, воспроизводимой внутриЧасть индустрий требует «seed»-груз (только стартовый запас)
T_cycleизмеряетсяВремя «сырьё → готовый робот»Время от старта до покупки N-го робота / до замены выбывшего
MTBFмножитель 0.5–2×Наработка на отказ паркаНастройки поломок + lifespan транспорта
N_minT_cycle/(MTBF·K)+1Минимальный парк для выживанияСравнение с фактическим парком при выживании
A(t)>1 растём, <0.8 хаосИзобилие = доставлено/спросGS по данным доставки в города
M_loss/циклтонныПотери массы за циклGS: принято − возвращено
Займы/импортсчётчикВнешние вливанияЧисло займов AI; цель: 0 после bootstrap
Автономия100 лет (цель)ЖизнеспособностьИгровые годы без внешних вливаний

Пример конфига сценария

{
  "scenario": { "name": "R095", "seed": 42, "years": 120 },
  "eco":      { "R": 0.95, "lambda": 0.0005, "F": 0.9, "seed_mass_t": 50000 },
  "robots":   { "mtbf_factor": 1.0, "breakdowns": true, "lifespan": 15 },
  "economy":  { "loans_allowed": true, "start_capital": 2000000 },
  "win":      { "autonomy_years": 100, "min_R": 0.85 }
}

Вердикт сценария

«Система жизнеспособна» / «Требует доработок» / «Провал» + причина останова (банкротство / коллапс энергии / гибель парка / нехватка сырья) — по образцу /gameplan §4.6.

⚙️ Ключевые механики

Два принципа честности симуляции: ремонт — реальный сток ресурсов; отказы — вероятностные, не линейные.
🔧Ремонт = сток ресурсов

Починка станции/сервера стоит: запчасти (груз от завода-репликатора: −5% wear = N ед. запчастей на станцию объекта; нет запчастей на складе → ремонт невозможен → wear растёт дальше — каскад из plancontent §8.1), энергия (из пула, приоритет P1), время (1–48 ч по типу объекта: датчик 2–4 ч, ветряк 24–48 ч, сервер 1–2 ч; робот занят ремонтом — не возит), износ ремонтника (чинит — приближает свою поломку по MTBF).

Следствие: формула A(t) = Capacity − Maintenance − Expansion (из /found) обретает смысл — обслуживание конкурирует с ростом.

🎲Отказы по Вейбуллу (рандом)

P(fail) = 1 − exp(−(age/MTBF)^2.5) — из plancontent §3.1c. MTBF остаётся параметром дизайна, фактическое время отказа каждого экземпляра — случайная величина.

Роботы (ТС): пер-экземплярная случайная кривая надёжности — нативно в движке OpenTTD (reliability + breakdowns). Индустрии/серверы (wear ведёт GS): коэффициент качества q~U[0.85, 1.15] при создании + месячный шум ε±5% + вероятностный отказ по hazard-функции от wear (не «в точке 100%»).

Следствия: 2 робота из одной партии выходят из строя в разное время; N_min = T_cycle/(MTBF·K)+1 корректен (разброс делает буферный парк необходимым); вердикты получают дисперсию → батч ≥10 seed на конфигурацию, вердикт = статистика, а не один прогон.

✅ Задачи по этапам

Чекбоксы сохраняются в localStorage браузера. Прогресс — в шапке страницы.

Этап 0 — Окружение

Этап 1 — Контур: NewGRF-индустрии

Этап 2 — GameScript «Экосистема» (физика R)

Этап 3 — AI «ИИ-ядро» (компания-экосистема)

Этап 4 — Батч-раннер

Этап 5 — Анализ: карта жизнеспособности

Этап 6 — RL-агент (опционально)

📁 Структура рабочей области

Локальная копия: C:\Users\Ziggy\Desktop\OTTD proj
ПутьЧто лежит
README.mdСводка всех 14 страниц сайта + структура проекта
DESIGN.mdМаппинг OpenTTD→экосистема, уровни L0–L2, дорожная карта
docs-site/Архив всех страниц ziggyserver.ru (HTML)
engine/OpenTTD 15.3 (win64) + OpenGFX 8.0 + zip-архивы
scripts/GameScript + AI (Squirrel), конфиги сценариев
scenarios/JSON-конфиги: R, λ, MTBF, seed
results/Логи прогонов, CSV-метрики, графики
tools/Раннеры headless-прогонов, парсеры логов

❓ Открытые вопросы

📜 Лог проекта

ДатаСобытие
02.08.2026Изучены все 14 страниц ziggyserver.ru; решение — OpenTTD как движок симуляции
02.08.2026Создана рабочая область OTTD proj; скачаны OpenTTD 15.3 + OpenGFX 8.0
02.08.2026Восстановлен SSH-доступ к серверу (host key сменился — сервер пересоздан ~25.07); создана страница /ottdplan/
02.08.2026Спецификация механик: ремонт = сток ресурсов (запчасти+энергия+время+износ ремонтника); отказы по Вейбуллу с пер-экземплярным рандомом; батч ≥10 seed на конфигурацию
02.08.2026Headless-сервер OpenTTD 15.3 проверен (карта генерируется, сервер держится); установлены Python 3.12.10 + nmlc 0.9.0 — тулчейн для своего NewGRF готов
02.08.2026NewGRF «EcoSim Industries» v0.1 собран (ecosim.grf, 5.9 КБ): 11 грузов (энергия, руды Fe/Cu/Si/Li, детали, чипы, роботы, товары, отходы, запчасти), 12 индустрий (солнце, 4 шахты, завод деталей, чиповая фабрика, завод-репликатор, ИИ-сервер, 3 рециклинга R=0.85/0.92/0.995). Установлен в Documents\OpenTTD\newgrf, сервер с ним работает. ВМ перезагружалась (много процессов) — пересборка без потерь
03.08.2026GS «EcoSim» запущен и работает: каркас по образцу FIRS (main loop + Sleep + GSEventController), исправлены GetAPIVersion="13", грузы через GSCargoList, GetLoanAmount(), GetEventType(), убраны несуществующие ET_INDUSTRY_PRODUCED/TRADED
03.08.2026Замкнут канал GS → admin-порт → Python: GS шлёт метрики JSON через GSAdmin.Send, сырой socket-клиент (tools/admin_raw.py) стабильно получает их (без глючной библиотеки pyOpenTTDAdmin). Пример: {"inds":0,"loans":-1,"month":"03","r":-1,"surv":1,"y":1950}
03.08.2026Открытая проблема: ecosim.grf (NewGRF) не матчится по GRFID/MD5 при загрузке в игру → GS не создаёт индустрии (inds=0). Начать разбор с формата `[newgrf] GRFID|MD5` в OpenTTD 15.3

🔗 Источники

Концепция: /plan1 · /plan2 · Критразбор: /plan3 · Содержание симуляции: /plancontent · ТЗ tycoon: /gameplan · Реалистичная симуляция: /layerplan2 · Хаб: /layerplan · Фонд: /found · Вопросы: /questions

© 2026 · ziggyserver.ru/ottdplan · Фонд Изобилия ✈️