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
140 lines
5.8 KiB
Markdown
140 lines
5.8 KiB
Markdown
# 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` | Решает систему, считает машины, потоки ресурсов |
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
# Сборка
|
||
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
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Расчёт производства
|
||
|
||
```bash
|
||
# Простой расчёт
|
||
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) |
|
||
|
||
### Список ресурсов
|
||
|
||
```bash
|
||
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, никаких раскрытий дерева
|
||
|
||
## Тесты
|
||
|
||
```bash
|
||
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj
|
||
```
|
||
|
||
30 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а + тесты ResourceClassifier и RecipeMatrixBuilder.
|