Loesungs-Dedup: getGruppenId/getPersonenId, keine doppelten Sitzordnungen

- getGruppenId (Gruppen-Ebene, personen-unabhaengig: welche Gruppen mit
  welcher Anzahl je Tisch) und getPersonenId (Personen-Ebene: alphabetische
  Namen je Tisch) an Sitzplatzverteilung; Basis-Methoden an Loesung. Gleiche
  Gruppen-Verteilung -> gleiche getGruppenId und damit gleiche Wertigkeit,
  egal welche Personen die geteilten Plaetze einnehmen.
- Farm verwirft nach jeder Erzeugung/Mutation Loesungen mit schon gesehener
  getGruppenId, so dass dieselbe Sitzordnung nicht mehrfach gehalten und
  bewertet wird (defensiv: Klassen ohne getGruppenId bleiben unberuehrt,
  Tests unveraendert).
- Web: Varianten-Vergleich ueber getGruppenId statt der person-basierten
  _Signatur; gruppenId und personenId zusaetzlich im Ergebnis-JSON.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-07-15 18:10:23 +02:00
parent b29b3b22d4
commit d4844ded67
3 changed files with 80 additions and 16 deletions
+9 -15
View File
@@ -153,16 +153,6 @@ def _TischeBauen(S):
return TE
def _Signatur(SV):
"""Sitzordnungs-Signatur einer Loesung: welche Personen an welchem Tisch.
Zwei Loesungen mit gleicher Signatur sind fuer den Nutzer dieselbe
Sitzordnung (der GA-Pool enthaelt viele Mutations-Verwandte) — die
Varianten-Auswahl dedupliziert damit (Roadmap M2: 'unterschiedliche
gute Loesungen')."""
return frozenset(
( T.Id, frozenset( P.Id for P in T ) ) for T in SV.Tische )
def _VarianteJSON(SV, GruppenNamen, Nr):
"""baut die JSON-Darstellung EINER Loesung (eine Variante)"""
def GruppeVonPerson(P):
@@ -217,6 +207,8 @@ def _VarianteJSON(SV, GruppenNamen, Nr):
return {
'nr': Nr,
'wertigkeit': SV.value,
'gruppenId': SV.getGruppenId(),
'personenId': SV.getPersonenId(),
'kennzahlen': Kennzahlen,
'tische': TischListe,
'gruppen': GruppenListe,
@@ -471,13 +463,15 @@ def Berechnen(SitzungsId: str,
# Roadmap M2: nicht nur den Besten, sondern bis zu 'varianten'
# UNTERSCHIEDLICHE gute Loesungen aus dem Endpool — Farm.TopN liefert
# absteigend sortiert, die Signatur-Deduplizierung wirft Loesungen mit
# identischer Sitzordnung raus (Mutations-Verwandte). Liefert der Pool
# weniger unterschiedliche Sitzordnungen, kommen eben weniger zurueck
# (ein weiterer Klick auf Berechnen erzeugt einen frischen Lauf).
# absteigend sortiert. Der Vergleich der Loesungen laeuft ueber die
# getGruppenId (Gruppen-Ebene): dieselbe Sitzordnung zaehlt nicht mehrfach
# als eigene Variante. Der GA-Pool ist ohnehin schon per getGruppenId
# dedupliziert; das hier ist die zusaetzliche Absicherung fuer die Ausgabe.
# Liefert der Pool weniger unterschiedliche Sitzordnungen, kommen eben
# weniger zurueck (ein weiterer Klick auf Berechnen erzeugt einen frischen Lauf).
Ergebnisse, Gesehen = [], set()
for SV in GAFarm.TopN( len( GAFarm.Pool ) ):
Sig = _Signatur( SV )
Sig = SV.getGruppenId()
if Sig in Gesehen:
continue
Gesehen.add( Sig )