1c735b124a
- Rewrite ProductionSolver: system of linear equations A×x=b via LU/QR decomposition - Add ResourceClassifier: classify resources as target/intermediate/raw - Add RecipeMatrixBuilder: build coefficient matrix and RHS vector - Add DI container (Microsoft.Extensions.DependencyInjection) in CLI - Fix resource flow calculation (RecipeRate is total, not per-machine) - Fix recipes.json: moduleCategory → machineCategory (recipe #19) - Update tests: 30 tests covering solver, classifier, matrix builder - Update README: document matrix model, architecture, principles
5.8 KiB
5.8 KiB
Factorio Space Age Production Calculator
Stack: C# .NET 10, MathNet.Numerics, Spectre.Console, ClosedXML, xUnit, Microsoft.Extensions.DependencyInjection
Калькулятор производственных цепочек для Factorio: Space Age. Рассчитывает количество машин, потоки ресурсов и сырьевые входы для заданных целей производства.
Математическая модель
Решение строится через систему линейных уравнений (не DFS):
A × x = b
Где:
- A — матрица коэффициентов (строки = ресурсы, столбцы = рецепты)
- x — скорости выполнения рецептов (cycles/sec) — неизвестные
- b — целевые скорости производства (targets) / 0 (intermediates)
Решение: LU-разложение (квадратная матрица), QR (переопределённая), псевдообратная (недоопределённая).
Архитектура
FactorioCalc/
├── src/
│ ├── FactorioCalc.Domain/ # Сущности, интерфейсы (DDD)
│ ├── FactorioCalc.Data/ # JSON-хранилище рецептов
│ ├── FactorioCalc.Solver/ # Матричный решатель (MathNet.Numerics)
│ ├── FactorioCalc.Reporting/ # Console/JSON/Excel экспорт
│ └── FactorioCalc.CLI/ # Точка входа, DI, парсинг аргументов
├── tests/
│ └── FactorioCalc.Tests/ # xUnit unit-тесты (30 тестов)
├── data/
│ └── recipes.json # База рецептов Space Age
└── README.md
Слои
| Слой | Описание |
|---|---|
| Domain | Immutable-сущности: Resource, Recipe, Machine, Module, RecipeExecution, ProductionTarget, ProductionResult |
| Data | JsonRecipeRepository — загрузка рецептов из JSON |
| Solver | ResourceClassifier — классификация ресурсов, RecipeMatrixBuilder — построение матрицы, ProductionSolver — решение через MathNet.Numerics |
| Reporting | ConsoleReporter, JsonReporter, ExcelReporter |
| CLI | Парсинг аргументов, DI (Microsoft.Extensions.DependencyInjection), Spectre.Console |
Классы Solver
| Класс | Ответственность |
|---|---|
ResourceClassifier |
Определяет target / intermediate / raw ресурсы |
RecipeMatrixBuilder |
Строит матрицу коэффициентов A и вектор b |
ProductionSolver |
Решает систему, считает машины, потоки ресурсов |
Быстрый старт
# Сборка
dotnet build src/FactorioCalc.CLI/FactorioCalc.CLI.csproj
# Тесты
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj
# Запуск
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj
Использование
Расчёт производства
# Простой расчёт
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Steel Plate:5"
# Множественные цели
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Red Science Pack:10" "Processing Unit:30"
# С модулями
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Blue Science Pack:60" -m "Productivity Module 3"
# С экспортом
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Yellow Science Pack:15" -j result.json -e result.xlsx
Формат целей
"ResourceName:amount"
Например: "Steel Plate:5" → 5 стальных пластин в секунду.
Опции
| Опция | Описание |
|---|---|
-r, --recipe-file <path> |
Путь к JSON с рецептами |
-m, --modules <name> |
Модуль для применения (можно повторять) |
-j, --json <path> |
Экспорт в JSON |
-e, --excel <path> |
Экспорт в Excel (.xlsx) |
Список ресурсов
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --resources
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --recipes
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --machines
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --modules
Формула расчёта
Матрица A: A[resource, recipe] = Σ(products) - Σ(ingredients) (с учётом productivity)
Система: A × x = b
Решение: x = A⁻¹ × b (LU decomposition)
Machine Count = recipe_rate / (effective_speed / craft_time)
Effective Speed = base_speed × (1 + speed_bonus)
Принципы
- SOLID — разделение ответственности по слоям
- Immutable entities — все сущности Domain-слоя неизменяемы
- IReadOnlyCollection / IReadOnlyDictionary — публичные API
- Matrix-based solver — система линейных уравнений через MathNet.Numerics
- DI — Microsoft.Extensions.DependencyInjection
- No recursion — никаких DFS, никаких раскрытий дерева
Тесты
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj
30 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а + тесты ResourceClassifier и RecipeMatrixBuilder.