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:
+9
-15
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user