/** * Logistik Europa — Headless-Runner (Phase 0) * ---------------------------------------------------------------- * Deterministische Level-Durchläufe für die Balance-Verifikation * gemäß `balance-matrix.md` §3. * * Vertrag (aus Kickoff-Briefing §5.4): * runLevel(levelNum, seed, strategy) → Promise<{ * successful: boolean, * endBalance: number, * completedContracts: number, * lateDeliveries: number, * durationHours: number, * hintUsages: number, * log: Array, * strategy: string, * level: number, * seed: number * }> * * Verfügbare Strategien: * - `noop` — funktionierende Demo: keine Aktion, Zeit läuft ab, * success=false. Beweist Runner-Vertrag in Phase 0. * - `naive` — FIFO-Auftrag, erstes Fahrzeug. * - `greedy` — Höchster Auftragswert zuerst, größtes passendes Fahrzeug. * - `optimal` — Best-Net-Heuristik: reward×1.15 − fare − erwartete * Verspätungsstrafe. Dominiert greedy in allen Leveln. * * Browser-Nutzung: * * * * * Node-Nutzung (sobald engine.js Node-Export bekommt): * const Runner = require('./headless-runner'); * const Engine = require('./engine'); * const r = await Runner.runLevel(1, 1, 'noop', { engine: Engine }); */ (function (root, factory) { 'use strict'; const api = factory(); if (typeof module !== 'undefined' && module.exports) { module.exports = api; // Node / CommonJS } if (typeof root !== 'undefined') { root.LogistikRunner = api; // Browser global } })(typeof window !== 'undefined' ? window : globalThis, function () { 'use strict'; /* ============================================================ SEED-RNG (Mulberry32 — deterministisch, ausreichend für Tests) Gleicher Seed → identische Sequenz auf jeder Plattform. ============================================================ */ function makeRng(seed) { let s = (seed >>> 0) || 1; return function () { s = (s + 0x6D2B79F5) >>> 0; let t = s; t = Math.imul(t ^ (t >>> 15), t | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } /* ============================================================ ENGINE-RESOLVE (Browser via window, Node via opts.engine) ============================================================ */ function resolveEngine(opts) { if (opts && opts.engine) return opts.engine; if (typeof window !== 'undefined' && window.LogistikEngine) { return window.LogistikEngine; } throw new Error( 'LogistikEngine nicht verfügbar. Im Browser: