Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ build-messung.txt
optimierung-log.txt
abdeckung-log.txt
messen-log.txt
inselvergleich-*.txt
bildschirmfotos-log.txt

# Private Originaldaten (Klarnamen) – öffentlich nur die anonymisierte Kopie unter testdaten/
Expand Down
124 changes: 90 additions & 34 deletions Doku/ANLEITUNG.md

Large diffs are not rendered by default.

Binary file modified Doku/Anleitung.pdf
Binary file not shown.
Binary file modified Doku/Anleitung/Bilder/02-einrichtung.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/03-hauptfenster.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/04-kostenansicht.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/05-qualitaet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/06-terminplan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/07-diagramm-spieltage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/08-terminwuensche.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/10-einstellungen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/12-spielplandaten.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/13-wunschtermin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/14-terminwuensche-karten.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/16-meldungen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/17-diagramm-spielverteilung.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Doku/Anleitung/Bilder/18-automodus.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/19-leitstand.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/20-leitstand-kosten.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/21-verlauf.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/22-sicherung.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/23-spielfreie-tage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/24-setzliste.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Doku/Anleitung/Bilder/25-wunschtermine.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 66 additions & 2 deletions Doku/MIGRATIONSPLAN.md

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions inselvergleich.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@echo off
rem Vergleich der Zahl der Inseln (2, 4, 8, 16): je 5 Minuten Kostenoptimierung der Verbandsoberliga aus einem leeren
rem Plan, zusammen gut 20 Minuten. Der Verlauf steht im Fenster; je Variante zusaetzlich in inselvergleich-N.txt
rem (wird von Claude gelesen). Vorher bauen.cmd ausfuehren und den Rechner in der Zeit moeglichst nicht belasten.
chcp 65001 >nul
cd /d "%~dp0"
set "EXE=%LOCALAPPDATA%\AndiGenerator.NET\artifacts\bin\AndiGenerator.Cli\release\andigen.exe"
set "STAFFEL=%~dp0testdaten\referenz\perf\Verbandsoberliga (1).xml"
if not exist "%EXE%" (
echo andigen.exe nicht gefunden - bitte zuerst bauen.cmd ausfuehren.
pause
exit /b 1
)
for %%n in (2 4 8 16) do (
echo.
echo ================================ %%n Inseln ================================
"%EXE%" optimieren "%STAFFEL%" --leer --sekunden 300 --intervall 15 --inseln %%n --ausgabe "%~dp0inselvergleich-%%n.txt"
)
echo.
echo Fertig. Ergebnisse in inselvergleich-2.txt ... inselvergleich-16.txt - Claude kann sie jetzt lesen.
pause
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ public sealed partial class Datenbearbeitung
/// <returns>Die Tage, sortiert.</returns>
public IReadOnlyList<DateOnly> SpielfreieTage() => SpielfreieTageAus(Arbeitsstand);

/// <summary>
/// Liest alle eingetragenen spielfreien Tage, auch die, an denen keine Mannschaft einen Heimspielwunsch hat (sie
/// bleiben beim Speichern erhalten, sind aber nicht wählbar).
/// </summary>
/// <returns>Die Tage, sortiert.</returns>
public IReadOnlyList<DateOnly> EingetrageneSpielfreieTage() =>
Arbeitsstand.KinderMitNamen("nogameday").Select(k => Datum(k.Lesen("date"))).Distinct().Order().ToList();

/// <summary>Liest die spielfreien Tage des click-TT-Stands.</summary>
/// <returns>Die Tage oder <c>null</c> ohne Standard.</returns>
public IReadOnlyList<DateOnly>? SpielfreieTageStandard() => standard is null ? null : SpielfreieTageAus(standard);
Expand Down
10 changes: 6 additions & 4 deletions src/AndiGenerator.Application/Optimierungsdienst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ private Optimierungsstand StandIntern()
return Optimierungsstand.Leer;
}

Optimierungsergebnis bester = optimierer.BesterStand();
(Optimierungsergebnis bester, Lenkungsstand? lenkung, Maschinenraum raum) = optimierer.Momentaufnahme();
return new Optimierungsstand(
true,
pausiert,
Expand All @@ -238,7 +238,8 @@ private Optimierungsstand StandIntern()
seitVerbesserung.Elapsed,
optimierer.SpezialKostenart,
bester.Spiele,
optimierer.Lenkung);
lenkung,
raum);
}

private void NeuStarten(Staffel staffel, Berechnungsoptionen optionen, bool ausgangsplanMelden, bool ohneGrundlauf = false)
Expand Down Expand Up @@ -274,10 +275,11 @@ private void Beobachten(CancellationToken token)
continue;
}

// Im Automodus zählt die Bewertung nach Verstößen; dort kann der beste Plan auch teurer werden.
// Gemeldet wird jede Verbesserung des geltenden besten Plans (im Automodus nach Verstößen, dort kann er auch teurer
// werden) – dieselbe Zahl, die Kachel, Verlauf und Maschinenraum zeigen.
Optimierungsergebnis bester = optimierer.BesterStand();
double kosten = bester.Kosten;
bool besser = kosten < letzteKosten || letzteKosten < 0 || (optimierer.Lenkung is not null && bester.Verbesserungen != letzteVerbesserungen);
bool besser = letzteKosten < 0 || bester.Verbesserungen != letzteVerbesserungen;
if (kosten >= 0 && besser)
{
letzteKosten = kosten;
Expand Down
4 changes: 3 additions & 1 deletion src/AndiGenerator.Application/Optimierungsstand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ namespace AndiGenerator.Application;
/// <param name="SpezialKostenart">Kostenart der Spezial-Insel, wenn sie läuft.</param>
/// <param name="Spiele">Der beste Plan (alle Spiele; <see cref="Spiel.Zeitpunkt"/> = <c>null</c> für nicht terminierte).</param>
/// <param name="Lenkung">Stand des Automodus; <c>null</c>, wenn er nicht läuft.</param>
/// <param name="Maschinenraum">Was Rechenkerne und Inseln gerade tun; <c>null</c> ohne laufende Generierung.</param>
public sealed record Optimierungsstand(
bool Laeuft,
bool Pausiert,
Expand All @@ -29,7 +30,8 @@ public sealed record Optimierungsstand(
TimeSpan SeitLetzterVerbesserung,
MannschaftsKostenart? SpezialKostenart,
IReadOnlyList<Spiel> Spiele,
Lenkungsstand? Lenkung = null)
Lenkungsstand? Lenkung = null,
Maschinenraum? Maschinenraum = null)
{
/// <summary>Stand ohne laufende Generierung.</summary>
public static Optimierungsstand Leer { get; } = new(false, false, 0, 0, -1, 0, TimeSpan.Zero, null, []);
Expand Down
23 changes: 23 additions & 0 deletions src/AndiGenerator.Application/Plansitzung.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ public sealed class Plansitzung
/// <summary>Früherer Name des eigenen Ordners (bis zur Umbenennung in AndiGenerator.NET am 29.09.2026).</summary>
public const string FruehererOrdnername = "AndiGeneratorNeu";

/// <summary>Anzeigename des gesicherten Plans.</summary>
public const string GesicherterPlanName = "Gesicherter Plan";

/// <summary>Kosten je hartem Fehler im Original (10 × cMaxKostenNoHardError).</summary>
private const double KostenJeHartemFehler = 10.0 * 1_000_000_000.0;
private const string Uebernahmevermerk = "uebernommen-aus-AndiGeneratorNeu.txt";
Expand Down Expand Up @@ -296,6 +299,26 @@ public GemerkterPlanEintrag PlanMerken(string name, IEnumerable<Spiel> spiele)
return new GemerkterPlanEintrag(name.Trim(), pfad, File.GetLastWriteTime(pfad));
}

/// <summary>Der gesicherte Plan der Staffel, sofern es ihn gibt.</summary>
/// <returns>Der Eintrag (Name „Gesicherter Plan“) oder <c>null</c>.</returns>
public GemerkterPlanEintrag? GesicherterPlan()
{
string pfad = Persistence.Gemeinsam.Staffelordner.GesicherterPlanPfad(Staffelordner);
return File.Exists(pfad) ? new GemerkterPlanEintrag(GesicherterPlanName, pfad, File.GetLastWriteTime(pfad)) : null;
}

/// <summary>Sichert einen Plan als gesicherten Plan der Staffel (ein bisher gesicherter wird ersetzt).</summary>
/// <param name="spiele">Spiele des Plans.</param>
/// <returns>Der Eintrag.</returns>
public GemerkterPlanEintrag PlanSichern(IEnumerable<Spiel> spiele)
{
ArgumentNullException.ThrowIfNull(spiele);
Directory.CreateDirectory(Staffelordner);
string pfad = Persistence.Gemeinsam.Staffelordner.GesicherterPlanPfad(Staffelordner);
GespeicherterPlanDatei.Speichern(pfad, spiele.Select(s => new GespeichertesSpiel(s.Zeitpunkt, s.Heim, s.Gast)));
return new GemerkterPlanEintrag(GesicherterPlanName, pfad, File.GetLastWriteTime(pfad));
}

/// <summary>Lädt die Spiele eines gemerkten Plans.</summary>
/// <param name="eintrag">Eintrag aus <see cref="GemerktePlaene"/>.</param>
/// <returns>Die Spiele (ohne Spiellokal).</returns>
Expand Down
Loading
Loading