Sitzplatzverteilung.alsSVG() (libs/Strukturdaten.py) draws tables as white circles and people as colored circles inside their table's circle, colored by group membership. Table radius is derived from the number of seats so all person-circles fit without touching; the table-to-table grid spacing is derived from the largest table radius so tables never overlap regardless of their Koordinaten values. libs/platz.py gains a --tosvg switch that writes <indir>/Sitzplatzverteilung.svg alongside the existing text/CSV output. The three unittest scenarios now each write their rendering to doc/images/, and doc/docu_tests.md explains the three configurations and what each test actually verifies (including why the "split groups land on true neighbor tables" property only holds for a specifically chosen seed in the circle scenario, not in general). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.1 KiB
Dokumentation der Unittest-Szenarien
Die drei Testfaelle in tests/test_sitzplatzverteilung.py pruefen die Platzierungs- und
Trennungslogik von Sitzplatzverteilung (in libs/Strukturdaten.py) anhand konkreter,
handgebauter Tisch-/Gruppenkonfigurationen. Jeder Test schreibt zusaetzlich eine
SVG-Visualisierung nach doc/images/ (erzeugt mit Sitzplatzverteilung.alsSVG(), das auch
ueber den --tosvg-Schalter von bin/platz.bat/bin/platz.sh erreichbar ist). Tische
werden darin als weisse Kreise dargestellt, Personen als farbige Kreise innerhalb ihres
Tischkreises; alle Personen derselben Gruppe haben dieselbe Farbe.
Szenario 1: Drei Tische in einer Kette, drei Paare
TestDreiTischeKettePaare in tests/test_sitzplatzverteilung.py
- Drei Tische
T1-T2-T3(Kette: T1 nur mit T2 benachbart, T3 nur mit T2 benachbart), je 2 Plaetze. - Drei Gruppen zu je 2 Personen (Paare).
Da jeder Tisch exakt so viele Plaetze hat wie eine Gruppe Personen, passt jedes Paar
komplett an einen Tisch. Der Test prueft, dass keine Gruppe getrennt wird
(GruppenTeilungGet(G) == 0 fuer alle drei Gruppen) und dass die optimale Wertigkeit
(SV.value == 0, keine Strafpunkte) erreicht wird.
Szenario 2: Vier Tische in einer Linie, zwei Vierergruppen
TestVierTischeLinieViergruppen in tests/test_sitzplatzverteilung.py
- Vier Tische
T1-T2-T3-T4in einer Linie (T1↔T2↔T3↔T4), je 2 Plaetze. - Zwei Gruppen zu je 4 Personen.
Da kein Tisch 4 Plaetze hat, muss jede Vierergruppe auf zwei Tische aufgeteilt werden. Der
Test prueft, dass jede Gruppe genau einmal geteilt wird (GruppenTeilungGet(G) == 1) und
dass die beiden Teiltische pro Gruppe ein zusammenhaengendes Nachbarpaar bilden — entweder
{T1,T2} oder {T3,T4}}, nie ueber die mittlere Naht zwischen T2 und T3 hinweg vermischt.
Ausserdem sind am Ende alle vier Tische voll besetzt.
Szenario 3: Sechs Tische im Kreis, vier Dreiergruppen
TestSechsTischeKreisDreiergruppen in tests/test_sitzplatzverteilung.py
- Sechs Tische
T1..T6, im Kreis angeordnet (jeder Tisch hat genau zwei Nachbarn: z.B. T1 ist mit T2 und T6 benachbart), je 2 Plaetze. - Vier Gruppen zu je 3 Personen (12 Personen auf 6×2 = 12 Plaetzen — exakt ausgelastet).
Da kein Tisch 3 Plaetze hat, muss jede Dreiergruppe auf zwei Tische aufgeteilt werden (2+1). Der Test prueft zwei Arten von Eigenschaften:
- Immer gueltig, unabhaengig vom Zufalls-Seed: Bei exakt ausgelasteten 12 Plaetzen fuer
12 Personen bleibt keine andere Aufteilung uebrig — jede Gruppe wird also garantiert
genau einmal geteilt (
GruppenTeilungGet(G) == 1), und am Ende sind alle sechs Tische voll besetzt. - Nur mit dem hier fest gewaehlten Seed zusaetzlich beobachtet: Die beiden Teiltische
jeder Gruppe sind tatsaechlich echte Nachbarn im Kreis. Das ist keine Garantie des
Algorithmus fuer jeden beliebigen Seed — bei sehr knapper Auslastung kann der
GA-Platzierungsfallback (
Sitzplatzverteilung.GruppeSetzen, wennNachbarTischekeine passenden Nachbarn mehr findet) auch nicht benachbarte Tische fuer die beiden Teile einer Gruppe waehlen. Mit einem grossen Stichprobentest ueber viele Seeds trat das in gut zwei Dritteln der Faelle auf; der im Test verwendete Seed wurde bewusst so gewaehlt, dass zusaetzlich die Nachbarschaftseigenschaft zutrifft, um sie hier sichtbar zu machen.
Die Koordinaten der sechs Tische in diesem Test sind bewusst auf einem Kreis im
mathematischen Sinn angeordnet (Winkel gleichmaessig verteilt), damit auch die
SVG-Visualisierung die Kreisform erkennen laesst — die tatsaechliche Nachbarschaft, die der
Algorithmus fuer die Platzierung nutzt, kommt aber ausschliesslich aus der
Nachbarliste/Nachbarn-Angabe jedes Tisches, nicht aus den Koordinaten.
Bilder neu erzeugen
Die drei SVGs in doc/images/ werden beim Ausfuehren der Testsuite automatisch neu
geschrieben:
bin/run_tests.sh
bin\run_tests.bat