Topologisch gleichwertige Stellungen zu erkennen ist ein wichtiger
Bestandteil der Computerspielers, und wird auch in der Benutzer -
Zugauswahl eingesetzt.
Ohne das Erkennen topologsich äquivalenter Spielstellungen
wäre die Anzahl der möglichen verschiedenen Stellung
sehr viel grösser als mit Erkennen.
Vielleicht etwa das Quadrat der Anzahl mit Erkennen.Daher
ist dieser Teil für den Computerspieler unbedingt
erforderlich.
Ausserdem soll eine Stellung immer schnell mit vielen anderen
Stellungen (die bereits berechnet wurden) auf topologische Gleichheit
getestet werden.
Daher brauchen wir einen normalisierungs Algorithmus: Er soll eine
Stellung ein eine normalisierte Darstellung
überführen, so dass alle topologisch gleichen
Stellugen auf die selbe Normaldarstellung abgebildet werden, und
topologisch verschiedene Stellung werden auf unterschiedliche
Normaldarstellungen abgebildet.
Dann brauchen wir jede Stellung nur einmal zu normalisieren und suchen
diese in der Transpositionstabelle,
die die normalisierten
Darstellungen der bereits berechneten Stellungen enthält.
Wann
sind zwei Stellungen topologisch äquivalent?
 |
Die Stellungen in Bild 2 und 3 sind ebene-verschieden , aber
kugel-äquivalent. |
In der Grafikdarstellung sind zwei Graphen äquivalent, wenn sie
sich durch
Begwegen der Punkten und Linien, ohne Überschneidung,
ineinander überführen lassen; wie aber erkennen wir die
Äquivalenz in der internen Darstellung?.
Die Stellung im linken Bild kann
intern auf verschieden Weise dargestellt sein:
Es ergibt sich ein zyklischer Pfad, A usw. sin die Namen der Punkte.
ACBC,
Weitere topologisch äquivalente Darstellugen ergeben sich
durch Verändern der Wahl der Startkante oder durch Vertauschen
von Punktnamen:
CBCA; BCAB; CABC;
EFGF;
Alle diese so beschriebenen Stellungen sind äquvalent.
Übertragen wir die Äquivalenzdefinition aus der Anschauung in
die interne Darstellung kommt etwa so etwas heraus:
Zwei Graphen äquivalent, wenn sie sich durch Permutation der
Punkt/Flächennamen und der aufzählreihenfolge der Pfade
ineinander überführen lassen.
Alle diese Pemutationen durchzuprobieren dauert natürlich zu
lange.. Bei 10 Punkten sind allein
10! = 3628800 Permutationen für die Punkte
möglich
Hier
der Algrithmus, schematisch (für die einfache
interne
Darstellung, kugel-äquivalenz)
Der Algorithmus arbeitet sich von der Aussenfläche nach innen
durch. Für die Kugeläquivalenz werden alle Flächen als
Aussenfläche ausprobiert die der kleinste Ergebnisswert
zurückgeliefert. Dort wo verschiedene Varianten durchprobiert
werden
müssen, lässt sich die Verabeitungsgeschwindig keit
erhöhen, wenn bei offensichtlich verschiedenen Varianten nach
einem willkürlichen Verfahren eine ausgewählt wird.
Z.B beim durchtesten aller potentiellen "Aussenflächen"
brauchen nur diejenigen berücklsichtigt zu werden, die die
meisten und längsten Pfade enthalten.
Der Computerspieler verbringt etwa (nur) 50% seiner Rechenzeit im
Normalisierungsalgorithmus
Das Ergebinss der Normalisierung ist ein string.
normalisiere_graph(g):
fuer alle flaechen a in g:
normalisiere_flaeche_ohne_pfad(a,kein pfad)
ergebinss = kleinster wert.
normalisiere_flaeche_ohne_pfad(a,oph):
fuer alle pfade ph an a, ausser oph:
normalisiere_netz_von_pfad_aus(ph)
ergebniss = sortierte folge der ergebnisse, getrennt durch ';'.
normalisiere_netz_von_pfad_aus(ph)
fuer alle kanten c in ph:
normalisiere_netz_von_kante_aus(c)
ergebniss = kleinster wert.
normalisiere_netz_von_kante_aus(stc)
merke kante stc vor.
fuer alle (jetzt oder spaeter) vorgemerkten kanten c
ph ist der pfad von c.
wenn ph noch nicht bearbeitet:
laufe den pfad entlang, beginnend mit c;
liste alle punktnamen auf, merke am punkt die vom pfad
links abzweigende kante vor.
wenn c nicht stc ist, und an der flaeche von c noch weitere pfade liegen:
fuege in '[' ']' eingeschlossen hizu:
normalisiere_flaeche_ohne_pfad(ph).
ergebnisse getrennt durch ','.
im ergebniss nummeriere die punktnamen ausserhalb [] so um,
dass der zuerst genannte punkt A heisst, der als zweites genannte B , usw.
Für ebene-äquivalenz wird in normalisiere_graph nur die
aussenfläche verwendent.
In der reduzierten
Darstellung können noch
die einzelnen
Teilsysteme getrennt normalisiert werden, das Ergebniss ist dann die
sortierte Folge davon, getrennt durch '|'.
normalisiere_flaeche_ohne_pfad wird innerhalb von normalisier_graph
(indirekt) möglicherweise mehrmals mit den selben parametern
aufgerufen. Einmal berechnete Werte können dann
zwischengespeichert und beim nächsten aufruf direkt
zurückgegeben werden.
Der Algorithmus funktioniert auch mit Graphen, wo ein Punkt mehr als 3
Kanten haben darf.
Die Zeitkompexität habe ich nicht genau ermittelt, nur am Test mit
3Graph, wo die Graphen eher klein sind.
Bie vielen Zufallsspielen mit 8 Startpunkten: Kanten:8,16,24, ...
_us:4,8,12,18,27,36,44. Könnte etwa propotional K^1,25 sein,
K=anzahl der Kanten.
Beispiele für Stellungen und Normal-strings sind hier