| Этап | Название | Статус | Критерий готовности |
|---|---|---|---|
| 0 | Окружение: движок + графика | ✅ готово | OpenTTD 15.3 + OpenGFX 8.0 скачаны, headless-запуск |
| 1 | Контур: NewGRF-индустрии (FIRS или свои) | ⬜ план | Цепочки mine→factory→town и recycling в игре |
| 2 | GameScript «Экосистема» (физика R) | ⬜ план | GS считает R, M_loss, A(t), пишет метрики в лог |
| 3 | AI «ИИ-ядро» (компания-экосистема) | ⬜ план | Парк живёт ≥N лет без займов при R≥порога |
| 4 | Батч-раннер сценариев | ⬜ план | Прогон R∈{0.85,0.90,0.95,0.995}×λ×MTBF → results/*.csv |
| 5 | Анализ: карта жизнеспособности | ⬜ план | Отчёт: пороги выживания, N_min, T_cycle, точки коллапса |
| 6 | RL-агент (опц.) через admin-порт | ⬜ план | Внешний агент повторяет лучшие стратегии |
Зачем: проверить на готовом движке (OpenTTD), замыкается ли контур ИИ-экосистемы
(энергия → добыча → завод → роботы → продукция → рециклинг → обратно) при заданных
параметрах, и измерить КПД системы. Результат — «карта жизнеспособности»: при каких
R, T_cycle, MTBF система живёт 100+ игровых лет без внешних вливаний.
| Слой экосистемы | Сущность 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 + AI на Squirrel + готовые NewGRF (FIRS 4). Без компиляции C++. Покрывает главный вопрос: замыкается ли контур и какой КПД. Быстро, дни.
Настоящая масса в движке, индустрия-производитель ТС, отказы Weibull, водный цикл. Нужен тулчейн: MinGW-w64 ~2 ГБ (влезает) или MSVC ~10 ГБ (впритык к 12.8 ГБ диска).
Python-агент через admin-порт (TCP): WorldSnapshot → решения → команды. Reward: α·A + β·R + γ·export − δ·import − ε·loans (из /plancontent §8.4).
| Параметр | Значения | Роль | Как задаём |
|---|---|---|---|
| R | 0.85 / 0.90 / 0.95 / 0.995 | КПД рециклинга — главный параметр выживания | Множитель возврата в GS-логике рециклинга |
| R(n) | R₀·exp(−λ·n) | Деградация КПД с числом циклов | λ в конфиге сценария, GS деградирует множитель |
| F | 0.8–1.0 | Доля сложности, воспроизводимой внутри | Часть индустрий требует «seed»-груз (только стартовый запас) |
| T_cycle | измеряется | Время «сырьё → готовый робот» | Время от старта до покупки N-го робота / до замены выбывшего |
| MTBF | множитель 0.5–2× | Наработка на отказ парка | Настройки поломок + lifespan транспорта |
| N_min | T_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 на конфигурацию, вердикт = статистика, а не один прогон.
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.2026 | Headless-сервер OpenTTD 15.3 проверен (карта генерируется, сервер держится); установлены Python 3.12.10 + nmlc 0.9.0 — тулчейн для своего NewGRF готов |
| 02.08.2026 | NewGRF «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.2026 | GS «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 · Фонд Изобилия ✈️