Westfälische Wilhelms-Universität Münster Seminararbeit Kombinatorische Suche im Rahmen des Seminars Parallele Programmierung Lars Brinkmann Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Prof. Dr. Herbert Kuchen Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft Inhaltsverzeichnis 1 Einleitung................................................................................................................... 3 2 Grundlagen ................................................................................................................ 3 3 4 2.1 Suchbäume........................................................................................................ 3 2.2 Divide-and-Conquer ......................................................................................... 4 Branch-and-Bound..................................................................................................... 6 3.1 Traveling Salesperson Problem ........................................................................ 8 3.2 Parallele Branch-and-Bound-Algorithmen ..................................................... 11 3.3 Anomalien in parallelen Branch-and-Bound-Algorithmen ............................ 13 Spielbäume .............................................................................................................. 15 4.1 MiniMax-Algorithmus.................................................................................... 16 4.2 Alpha-Beta-Search.......................................................................................... 17 4.3 Parallele Alpha-Beta-Suche............................................................................ 19 5 Fazit ......................................................................................................................... 20 6 Literaturverzeichnis ................................................................................................. 21 II 1 Einleitung Kombinatorische Algorithmen führen Berechnungen mit diskreten, endlichen mathematischen Strukturen durch [ReiNieDeo 77]. Eine kombinatorische Suche ist der Prozess, „eine oder mehrere optimale oder fast optimale Lösungen in einem definierten Problemraum“ zu finden [WahLiYu 85]. Kombinatorische Algorithmen haben heute eine große Bedeutung bei der Problemlösung im Bereich der Künstlichen Intelligenz, sowie bei der Erzeugung effizienter Lösungen für NP-vollständige Probleme. Entscheidungsprobleme und Optimierungsprobleme bilden zwei Arten von kombinatorischen Suchproblemen. Ein Algorithmus, der ein Entscheidungsproblem löst, muss eine Lösung finden, die alle Einschränkungen erfüllt. Ein Algorithmus, der ein Optimierungsproblem löst, muss bei der Lösung gleichzeitig eine Zielfunktion minimieren oder maximieren. Die weiteren Beispiele in dieser Ausarbeitung werden sich mit den Optimierungsproblemen der kombinatorischen Suche befassen. In Kapitel zwei werden Grundlagen zu Suchbäumen und Divide-and-Conquer-Verfahren dargestellt. Im dritten Kapitel wird am Beispiel des Problem des Handlungsreisenden die Branch-and-Bound-Technik erklärt und Parallelisierungsmöglichkeiten vorgestellt. Im vierten Kapitel beschäftigt sich diese Ausarbeitung mit Algorithmen auf Spielbäumen und deren Parallelisierung. Im fünften Kapitel wird abschließend ein Fazit aus den Ergebnissen gezogen. 2 Grundlagen 2.1 Suchbäume Ein Optimierungsproblem kann durch einen Baum dargestellt werden. Das Grundprinzip der Problemlösungsmethode beruht auf der rekursiven Zerlegung des Ausgangsproblems in Teilprobleme. Man unterscheidet dabei Teilprobleme, die alle zur 3 Lösung des übergeordneten Problems gelöst werden müssen, und Teilproblemen, von denen die Lösung eines Einzigen zur Lösung des übergeordneten Problems ausreicht. Durch die fortgesetzte rekursive Zerlegung wird eine baumartige Verknüpfung von Teilproblemen gebildet. Die Wurzel des Baumes repräsentiert das zu lösende Ausgangsproblem, innere Knoten repräsentieren reduzierbare Teilprobleme und die Blätter stellen entweder direkt lösbare oder unlösbare Teilprobleme dar. Den beiden Zerlegungsmöglichkeiten entsprechen zwei verschiedene Knotentypen, die UNDKnoten und die ODER-Knoten. Aus diesen Knotentypen lassen sich drei unterschiedliche Baumarten darstellen, der UND-Baum, der ODER-Baum und der UND-ODER-Baum. Diese Baumtypen werden in der weiteren Ausarbeitung noch detailliert dargestellt. 2.2 Divide-and-Conquer Das Divide-and-Conquer-Verfahren beruht auf der Idee, ein Problem in Unterprobleme aufzuteilen und deren Lösungen zu einer Lösung des Gesamtproblems zu kombinieren. Die Methodik ist rekursiv, das bedeutet, dass die Teilprobleme ihrerseits wieder durch die Divide-and-Conquer-Strategie gelöst werden können [Aho 96]. Die Divide-and-Conquer-Lösung eines Problems kann durch einen UND-Baum dargestellt werden (vgl. Abbildung 1), da die Lösung jedes Problems, die Lösung aller Teilprobleme erfordert. Es existieren drei Möglichkeiten für die Ausführung von Divide-and-Conquer Algorithmen auf MIMD-Computern (Multiple Instruction Multiple Data) [Quinn 94]. Die erste Methode ist die Abbildung des Suchbaums auf einem Prozessorbaum, der dem Suchbaum im Aufbau entspricht. Diese Methode hat jedoch zwei Nachteile. Der Wurzelprozessor kann hierbei zu einem Flaschenhals werden, da er der Kanal für jeglichen In- und Output ist. Ein weiterer Nachteil ist die starre Verbindungsstruktur 4 dieses Prozessorbaums, so dass auf ihm nur ganz spezielle Divide-and-Conquer Algorithmen gelöst werden können. Problem UND Teilproblem Teilproblem UND Teilproblem UND Teilproblem Teilproblem Teilproblem Abbildung 1: UND-Baum Eine zweite Möglichkeit ist die Abbildung des Suchbaumes auf eine virtuelle BaumMaschine, die eine robuste Verbindungsstruktur hat, wie z.B. Multicomputer mit hyperkubischer Prozessoranordnung. Wichtig bei dieser Lösung ist ein Algorithmus, der das Suchproblem möglichst effizient auf die virtuelle Baum-Maschine abbildet, um die nötige Kommunikation zu minimieren. Ein Vorteil dieser Technik ist die Möglichkeit, unterschiedliche Divide-and-Conquer Algorithmen auf dem gleichen Prozessornetzwerk zu bearbeiten. Eine dritte Möglichkeit ist die Ausführung der Divide-and-ConquerAlgorithmen auf einem UMA-Multiprozessor-System (Uniform Memory Access). Die Architektur des gemeinsamen Speichers ermöglicht den Zugriff auf die Daten der Teilprobleme durch mehrere Prozessoren. Der Lösungsprozess einer parallelen Suche auf einem UND-Baum kann in drei Phasen unterteilt werden. In der ersten Phase wird das Problem in Unterprobleme aufgeteilt und auf die Prozessoren verteilt. In den meisten Fällen gibt es in diesem Schritt weniger Prozesse als Prozessoren, so dass die meisten Prozessoren solange untätig sind, bis Ihnen ein Problem zum Zerlegen und Verteilen zugeteilt wird. In der zweiten Phase sind 5 die Prozessoren mit der Berechnung der Probleme beschäftigt, bis in der dritten Phase die Ergebnisse der Unterprobleme von wenigen Prozessoren kombiniert werden. Infolgedessen ist die Optimierung dieses Verfahrens durch den Overhead des Verteilund Kombinieraufwandes begrenzt. 3 Branch-and-Bound Backtracking ist die Bezeichnung für ein Lösungsverfahren, bei dem eine Teillösung eines Problems systematisch zu einer Gesamtlösung ausgebaut wird. Falls in einem gewissen Stadium ein weiterer Ausbau einer vorliegenden Lösung nicht mehr möglich ist, werden einer oder mehrere der letzten Teilschritte rückgängig gemacht. Es wird versucht die erhaltene, reduzierte Teillösung auf einem anderen Weg wieder auszubauen. Das Zurücknehmen von Schritten und erneute Vorangehen wird solange wiederholt, bis eine Lösung des vorliegenden Problems gefunden ist oder bis erkannt wurde, dass das Problem keine Lösung besitzt. Die Möglichkeit in Sackgassen zu laufen und aus ihnen wieder herauszufinden, zeichnet das Backtracking-Verfahren aus. Das Branch-and-Bound-Verfahren ist eine Variante des Backtrackings, welches Nutzen aus Informationen über die Optimalität von Teillösungen ziehen kann, um die Untersuchung von Lösungen zu vermeiden, die nicht optimal sein können. Ein Branchand-Bound-Algorithmus versucht ein gegebenes Problem bei gleichzeitiger Minimierung oder Maximierung einer Zielfunktion f zu lösen. Das gegebene Problem wird in ein oder mehrere Teilprobleme zerlegt, falls es nicht direkt lösbar ist. Dieser Prozess wird Branching genannt und wird solange fortgeführt, bis eine zulässige Lösung gefunden wurde, oder festgestellt wird, dass dieses Teilproblem nicht zu einer optimalen Lösung führen kann. Für diese Überprüfung, wird für jedes Teilproblem eine untere Schrank g berechnet. Diese gibt die Kosten an, die für eine mögliche Lösung des Teilproblems mindestens benötigt werden. Ist eine Lösung gefunden, müssen nur noch 6 Teilprobleme untersucht werden, deren untere Schranke kleiner als der Wert f der gefundenen Lösung sind. Diese Begrenzung des Suchraumes wird Bounding genannt. Die wesentlichen Bestandteile eines Branch-and-Bound-Algorithmus sind: • Eine Regel zur Erzeugung von Teilproblemen (branching rule) • Eine Regel zur Auswahl von Teilproblemen (selection rule) • Eine Regel zum Ausschluss von nicht optimalen Teilproblemen (elimination rule) • Eine Abbruchbedingung (termination rule) Der Zerlegungsprozess kann durch einen ODER-Baum (vgl. Abbildung 2) dargestellt werden. Die Wurzel repräsentiert das Gesamtproblem, innere Knoten stellen Teilprobleme und Blätter nicht weiter zerlegbare oder unlösbare Teilprobleme dar. Problem ODER Teilproblem Teilproblem ODER ODER Teilproblem Teilproblem Teilproblem Teilproblem Abbildung 2: Oder-Baum Bei der Auswahl noch nicht untersuchter Teilprobleme gibt es mehrere Traversierungsarten: • Die Tiefensuche (depth-first) • Die Breitensuchen (breadth-first) • Die Bestensuche (best-first) 7 Das Branch-and-Bound Verfahren soll nun an einem Beispiel, dem Traveling Salesperson Problem, verdeutlicht werden. 3.1 Traveling Salesperson Problem Das Traveling-Salesperson-Problem (TSP) ist auch als Problem des Handelsreisenden bekannt. Der Handelsreisende (travelling salesperson) hat zur Abwicklung von Geschäften eine Rundreise durch n Städte zu unternehmen, wobei die Reihenfolge so gewählt werden soll, dass der Gesamtreiseweg möglichst kurz wird. Mathematisch lässt sich das Problem folgendermaßen beschreiben: Gegeben: Ein gerichteter vollständiger Graph G(V,E) mit N = |V| Knoten, die Orten entsprechen, sowie eine Distanzmatrix C mit cii = +∞ und cij >= 0 ∀i,j Gesucht: Eine Rundtour T ⊂ E durch alle N Orte, die jede Stadt genau einmal besucht und einen minimalen Distanzwert c aufweist. c(T) = ∑ ( i , j )∈T c ij Little et al. entwickelten 1963 einen berühmten Branch-and-Bound-Algorithmus zur Lösung des TSP [Quinn 94]. Das Verfahren beruht auf der Idee der Zeilen- und Spaltenreduktion der Distanzmatrix und der sukzessiven Erzeugung von Teilproblemen, die Touren darstellen. Noch nicht untersuchte Teilprobleme werden in einer Liste verwaltet, auf der eine Bestensuche durchgeführt wird. Der Algorithmus entnimmt jeweils das Teilproblem mit der kleinsten unteren Schranke. Ist dieses Teilproblem direkt lösbar, wurde eine Route gefunden, ansonsten wird das Teilproblem durch Hinzunahme einer weiteren Kante in zwei neue Teilprobleme zerlegt. Ein Kinderknoten repräsentiert die Menge aller Routen, die diese Kanten enthalten, der andere Knoten die Menge aller Routen, die 8 diese Kante nicht enthalten. Die Kosten für die Kanten der möglichen Routen lassen sich in einer Matrix [i][j] darstellen. Jede Stadt muss in einer Tour genau einmal verlassen werden. Zeile i der Matrix enthält jeweils die Kosten für das Verlassen von Stadt i. Die günstigste Möglichkeit stellt hier das Zeilenminimum cij dar. Alle Einträge in dieser Zeile der Matrix werden um den Wert dieser Kante reduziert und die untere Schranke wird um diesen Wert erhöht. Das gleiche gilt für das Spaltenminimum, denn jede Stadt muss genau einmal betreten werden, und die Kosten dafür sind in Spalte j gegeben. Die entstehende Matrix enthält somit nur noch die Zusatzkosten für die Kanten. Die Gesamtkosten einer Route berechnet sich somit aus der unteren Schranke und den zusätzlichen Kosten für die gewählten Kanten. Zeilenreduktion Spaltenreduktion A B C D E MIN A ∞ 9 6 7 ∞ 6 B 9 ∞ 3 ∞ 10 C 6 3 ∞ 5 D 7 ∞ 5 E ∞ 10 4 ∑ A B C D E A ∞ 3 0 1 ∞ 3 B 6 ∞ 0 ∞ 4 3 C 3 0 ∞ ∞ 8 5 D 2 ∞ 8 ∞ 4 E ∞ 21 MIN 2 Reduzierte Matrix ∑ A B C D E A ∞ 3 0 0 ∞ 7 B 4 ∞ 0 ∞ 6 2 1 C 1 0 ∞ 1 0 0 ∞ 3 D 0 ∞ 0 ∞ 2 6 0 4 ∞ E ∞ 6 0 3 ∞ 0 0 1 1 4 g: 21 + 4 = 24 Abbildung 3: Beispiel Matrixreduktion Der Algorithmus soll nun an einem Beispiel mit fünf Orten (A-E) verdeutlicht werden. In Abbildung 4 ist der Zyklus der Route von A nach E in einem bewerteten Graph dargestellt. 9 9 A B 3 6 C 7 5 10 4 D E 8 Abbildung 4: Graph Ausgehend von einem Knoten wird der Zustandsbaum gebildet und mittels Matrixreduktion untere Schranken für jeden relevanten Knoten berechnet. In Abbildung 5 ist der korrespondierende Zustandsbaum dargestellt. Die Wurzel repräsentiert die Menge aller möglichen Routen. Rechte Kinderknoten stellen die Routen ohne Hinzunahme einer bestimmten Kante da, während linke Kinderknoten alle Routen unter Hinzunahme dieser Kante repräsentieren. Die untere Schranke von 25 erhöht sich auf 31 bei der Hinzunahme der Kante (B,C). Wird die Kante (B,C) ausgeschlossen, erhöht sich die Schranke nur auf den Wert 29, so dass die Suche im rechten Teilbaum fortgesetzt wird. Bei der Fortsetzung dieses Verfahrens ergibt sich eine Rundreise über die Kanten (A,D), (D,E), (E,C), (C,B) und (B,A) mit Gesamtkosten von 31. 10 Mit (B,C) 25 Ohne (B,C) 31 29 Ohne (E,C) Mit (E,C) Mit (A,D) 31 Ohne (A,D) 31 Ohne (C,B) Mit (C,B) 31 31 Ohne (D,E) Ohne (B,A) 32 8 Mit (D,E) 31 35 8 Mit (B,A) 32 Abbildung 5: Branch-and-Bound-Baum des TSP-Beispiels 3.2 Parallele Branch-and-Bound-Algorithmen Mohan entwickelte 1983 zwei Parallelisierungen dieses Algorithmus. Der erste Algorithmus setzt bei der Zerlegung eines Problems in Teilprobleme an. Ursprünglich hat dieser Prozess einen natürlichen Parallelismus von zwei, da die Probleme in zwei Teilprobleme, Einschluss oder Ausschluss einer Kante, zerlegt werden. Der modifizierte Algorithmus erhöht den Verzweigungsfaktor des Zustandsbaumes, so dass k Kanten berücksichtigt werden und ein Knoten 2k Kinder besitzt. Dieser Algorithmus folgt dem Verfahren von Little und eignet sich für den Einsatz von 2k Prozessoren. Der zweite Algorithmus verwaltet die noch nicht untersuchten Teilprobleme in einer Liste, auf die von mehreren Prozessen zugegriffen werden kann. Ein Prozess wählt jeweils ein noch nicht untersuchtes Teilproblem mit der kleinsten unteren Schranke aus der Liste aus und berechnet die unteren Schranken für die untergeordneten 11 Teilprobleme, wenn diese nicht sofort gelöst werden können. Da die exklusive Verwaltung der Liste durch einen eigenen Prozess nur einen geringen Teil der Zeit in Anspruch nimmt, der für die Zerlegung benötigt wird, stellt dies kein signifikantes Hindernis für die Beschleunigung da. Abbildung 6: Vergleich der zwei Algorithmen Wie in Abbildung 6 zu sehen, erzielt der erste Algorithmus nur eine geringe Beschleunigung, da laut Quinn die zusätzlichen Prozessoren den größten Teil ihrer Zeit mit der Erzeugung von Knoten verbringen, die nie untersucht werden, da ihre unteren Schranken zu hoch sind. Mohans zweiter Algorithmus erzielt eine achtfache Beschleunigung mit 16 Prozessoren bei einem TSP mit 30 Knoten. Quinn entwickelte vier parallele Branch-and-Bound-Algorithmen für einen HypercubeMulticomputer, die für jeden Prozessor eine eigene Prioritätswarteschlange verwalten. Befindet sich ein Teilproblem in dieser Warteschlange, wird dieses entnommen, und falls es nicht direkt gelöst werden kann, wird es nach dem Verfahren von Little zerteilt. Die entstandenen Teilprobleme werden wieder in die Warteschlange eingefügt. Die Algorithmen von Quinn können anhand der Heuristik, welches Teilproblem an einen anderen Prozessor weitergegeben wird, unterschieden werden. Quinn benutzte die folgenden vier Heuristiken: 12 1. Füge das Teilproblem in die eigene Warteschlange des Prozessors ein, bei dem die Kante eingeschlossen wird und sende das Teilproblem, bei dem die Kante ausgeschlossen wird, an einen benachbarten Prozessor weiter. 2. Füge ein neues Teilproblem mit einer niedrigeren unteren Schranke in die Warteschlange ein und sende das Teilproblem mit der höheren, unteren Schranke weiter. 3. Füge beide Teilprobleme in die Warteschlange ein und sende und entferne das zweitbeste Problem der Warteschlange. 4. Füge beide Teilprobleme in die Warteschlange ein und sende und entferne das beste Problem aus der Warteschlange. Bei der Auswahl des benachbarten Prozessors, an den ein Teilproblem gesendet wird, benutzen alle vier Algorithmen die gleiche Technik. Ein Prozessor i sendet bei der Iteration j ein Teilproblem an den Prozessor, dessen Nummer sich durch die Invertierung des Bits an der Stelle j mod d der Zahl i ergibt (p=2d). Nach log2(p) Iterationen wurde an jeden Prozessor ein Teilproblem gesendet. Bei einem Vergleich dieser vier Algorithmen sind die Heuristiken drei und vier den beiden übrigen deutlich überlegen. Ziel dieser parallelen Algorithmen ist es, möglichst viele Prozessoren mit für die Lösung relevanten Teilproblemen zu versorgen. 3.3 Anomalien in parallelen Branch-and-Bound-Algorithmen Lai und Sahni [LaSa 84] zeigten in einer Analyse, dass die Parallelisierung des Branchand-Bound-Algorithmus sowohl zu superlinearen als auch sublinearen Beschleunigungen führen kann. Die Analyse stützt sich auf folgende Annahmen: • Die Zeit für die Untersuchung und Zerlegung eines Knotens, ist für alle Knoten gleich. 13 • Die Ausführung des Algorithmus besteht aus einer Reihe von Iterationen, in denen die Prozessoren Teilprobleme untersuchen und zerlegen. Bei einem gegebenen Branch-and-Bound-Problem und einer gegebenen unteren Schranke g stellt I(p) die Anzahl Iterationen bei p Prozessoren da. Lai und Sahni konnten folgende Anomalien nachweisen: • acceleration anomaly: Es tritt eine superlineare Beschleunigung mit einem Faktor größer als die eingesetzte Prozessoranzahl auf. • deceleration anomaly: Die Beschleunigung ist kleiner als die eingesetzte Prozessorenanzahl, jedoch größer als eins. • detrimental anomaly: Der Faktor der Beschleunigung ist kleiner als eins. Eine Erhöhung der Zahl der benötigten Iterationen bei einer Erhöhung der verwendeten Prozessoren entspricht dem ersten Theorem von Lai und Sahni, dass hier beispielhaft für die möglichen Anomalien in branch-and-bound Algorithmen dargestellt werden soll: Theorem 1 [LaSa 84]: Sind n1 < n2 und k > 0 gegeben, dann existiert ein Zustandsbaum mit k*I(n1) < I(n2). Beweis: Das Theorem kann an dem in Abbildung 7 dargestellten Zustandsbaum bewiesen werden. Alle Knoten mit der Markierung „=“ haben die gleiche untere Grenze wie der optimale Knoten A. Alle Knoten mit der Bezeichnung „>“ haben eine größere untere Schranke als dieser Knoten. Führen n1 Prozessoren die Suche durch, so wird während der ersten Iteration der Wurzelknoten in n1 + 1 Teilprobleme expandiert. Die zweite Iteration besteht aus der Expansion der n1 am weitesten links stehenden Knoten der Ebene zwei in n1 Knoten der Ebene drei. Bei der dritten Iteration werden die übrigen Knoten der Ebene 3 und Knoten B expandiert. Da der Knoten auf Ebene drei zum Lösungsknoten führt, terminiert der Algorithmus mit I(n1) = 3. 14 Werden n2 Prozessoren für die Suche eingesetzt ist die erste Iteration gleich. In der zweiten Iteration werden alle n1 + 1 Knoten der Ebene zwei expandiert, was zu n1 + n2 Knoten in der Ebene 3 führt. Werden jetzt die n2 am weitesten rechts stehenden Knoten ausgewählt, würden n2 Knoten der Ebene vier erzeugt und der Lösungsknoten A würde erst während der 3k + 1 Iteration expandiert. Daher ist es möglich, dass der Einsatz von n2 Prozessoren zu I(n2) = 3k+1 Iterationen führt. Abbildung 7: Zustandsbaum Theorem 1 Lai und Sahni konnten vereinzelt bei einem 0-1 Rucksackproblem anormales Verhalten feststellen, schlussfolgerten jedoch, dass anomales Verhalten in der Praxis nur sehr selten auftritt und die Erhöhung der Prozessorzahl nicht zu einer Erhöhung der Ausführungszeit führt [Quinn 94]. 4 Spielbäume Ein Zwei-Personen-Spiel kann formal als ein Suchproblem über der Menge aller möglichen Züge definiert werden. Die geläufigste Art der Implementierung eines ZweiPersonen-Spiels ist die Darstellung als UND-ODER-Spielbaum (vgl. Abbildung 8). In einem Spielbaum repräsentieren Knoten Spielfeldkonfigurationen und Kanten Spielzüge. Da eine vollständige Enumeration des Spielbaumes gerade bei komplexen Spielen aufgrund der exponentiell steigenden Rechenzeit nicht möglich ist, werden auch 15 hier Heuristiken eingesetzt, die mittels einer geeigneten Bewertungsfunktion den optimalen Zug innerhalb einer vorgegebenen Suchtiefe finden sollen. Bei einem trivialen Spiel kann der MiniMax-Algorithmus verwendet werden, um eine Strategie zu finden. Problem ODER Teilproblem Teilproblem UND Teilproblem ODER Teilproblem Teilproblem Teilproblem Abbildung 8: UND-ODER-Baum 4.1 MiniMax-Algorithmus Der MiniMax Algorithmus baut einen Spielbaum bis zu einer bestimmten Ebene auf und ordnet jedem Blatt mit Hilfe der Bewertungsfunktion einen Zahlenwert zu [Kaindl 89]. Der Minimax-Algorithmus besteht aus fünf Schritten: 1. Generiere den Spielbaum bis zu den Endzuständen in einer festgelegten Tiefe 2. Wende die Nutzenfunktion auf alle Endzustände an 3. Die Elternkoten der Endzustände erhalten den aus ihrer Sicht jeweils ungünstigsten Wert ihrer Kindknoten 4. Führe dies bis zu den Kindknoten der Wurzel fort 5. Wähle den Kindknoten ( Zug ) mit dem höchsten Wert aus 16 4.2 Alpha-Beta-Search Der Alpha-Beta-Algorithmus ist eine Erweiterung des MiniMax-Algorithmus. Ziel ist es, die Performance durch das Abschneiden von Teilbäumen zu steigern. Hierzu werden zwei Schranken α und β übergeben, die zu einem vorzeitigen Abschneiden von Teilbäumen führen können. Die untere α -Schranke entspricht dem Mindestgewinn, den der maximierende Spieler (MAX) bei beliebigem Gegenspiel garantiert erzielen kann. Analog bezeichnet β den Mindestgewinn des minimierenden Spielers (MIN) unter Berücksichtigung aller MAX-Reaktionen. Zusammen begrenzen die beiden Schrankenwerte ein Intervall, das (α, β)-Suchfenster, in dem der MiniMax-Wert des Spielbaums gesucht wird. Knoten mit einem Wert von kleiner α oder größer β werden ohne Informationsverlust abgeschnitten. Die Wurzel des Baumes wird mit a = -∞ und β = +∞ aufgerufen. In Abbildung 9 ist die Alpha-Beta-Suche an einem Spielbaum zu sehen. An den Knoten sind die sich ändernden Suchfenster angegeben. Abgeschnittene Teilbäume sind durch gestrichelte Linien gekennzeichnet. Die Komplexität der Alpha-Beta-Suche entspricht der Anzahl der untersuchten Blätter im Spielbaum. Im Worst-Case müssen alle Blätter des Spielbaumes untersucht werden, das entspricht einem Aufwand von O(vt), wobei v dem Verzweigungsfaktor und t der Tiefe des Suchbaumes entspricht. Im Best-Case wird von jedem Knoten aus nur der beste Zug untersucht. Slagle und Dixon [SD69] zeigten, dass der Aufwand im BestCase v[t/2] + v[t/2] +1, also O(2*v[d/2]), entspricht. Quinn gibt den effektiven Verzweigungsfaktor eines Algorithmus mit d Anzahl der untersuchten Blätter an, wobei d der Suchtiefe des Algorithmus entspricht. Im Best-Case entspricht der Verzweigungsfaktor also d d /2 2 *b ⇔ d 2 * b . Bei großem d strebt der erste Faktor 17 gegen Null, so dass sich ein Verzweigungsfaktor von b ergibt. Im besten Fall kann also die Suchtiefe bei gleichem Aufwand verdoppelt werden. Abbildung 9: Alpha-Beta-Suche in einem Spielbaum Der Standard Alpha-Beta-Algorithmus kann in vielerlei Hinsichten verbessert werden. Eine der Verbesserungstechniken ist die Aspirationssuche. Die Aspirationssuche versucht durch engere Suchfenster schnellere Ergebnisse zu erzeugen. Sie arbeitet mit der Schätzung eines Wertes v der Brettposition an der Wurzel und dem wahrscheinlichen Fehler e dieser Schätzung. Der Aufruf erfolgt in dem Suchfenster (ve,v+e). Wenn der Wert des Spielbaums tatsächlich in dieses Suchfenster fällt, ist die Suche viel schneller abgeschlossen als mit einem Suchfenster von (-∞, +∞). Wenn der Wert der Position kleiner als v-e ist, gibt die Suche den Wert v-e zurück und die Suche muss mit einem neuen Suchfenster von (-∞, v-e) durchgeführt werden, analog dazu wird eine neue Suche mit dem Fenster (v+e, +∞) durchgeführt, wenn der Wert größer als v+e ist. In vielen Zweipersonen-Spielen treten identische Positionen an verschiedenen Stellen im Suchbaum auf. Eine Alternative zur wiederholten Bewertung gleicher Positionen ist es, die zuvor ausgewerteten Positionen in einer Hashtabelle, der 18 sogennanten Transpositionstabelle, zu speichern. Bevor eine Position bewertet wird, wird in der Transpositionstabelle geprüft, ob bereits ein Wert für diese Position berechnet worden ist. 4.3 Parallele Alpha-Beta-Suche Die Alpha-Beta-Suche bietet mehrere Möglichkeiten der Parallelisierung. Die Auswertung der Spielfeldkonfiguration nimmt bei den meisten Spielen die größte Zeit in Anspruch. Bei einigen Schachprogrammen wird z.B. mehr als 40% der Zeit für die Bewertung der Spielfeldkonfiguration eingesetzt. Durch die Verteilung einzelner Terme der Bewertungsfunktion auf mehrere Prozessoren kann eine gute Beschleunigung des Algorithmus erzeugt werden. Marsland und Campbell beschreiben drei Vorteile dieser Technik [Quinn 94]. Zum einen kann die Suche tiefer durchgeführt werden, da die Auswertungszeit reduziert wird, zum anderen könnte eine komplizierte Bewertungsposition gefunden werden, die nur durch die Anzahl der eingesetzten Prozessoren limitiert wird. Eine weitere Parallelisierungsmöglichkeit ist die direkte Durchführung einer parallelen Aspirationssuche. Wenn z.B. drei Prozessoren zur Verfügung stehen, könnte jedem dieser Prozessoren ein Suchfenster der Aspirationssuche zugeteilt werden. Einem wird das Intervall (-∞, v-e) zugeteilt, einem weiteren das Intervall (v-e, v+e) und dem dritten Prozessor wird das Intervall (v+e, ∞) zugeteilt. Im Idealfall wird der Prozessor mit dem kleinsten Intervall (v-e, v+e) erfolgreich sein, es werden jedoch alle Prozessoren Ihre Suche schneller beenden, als wenn ein einzelner Prozessor das Fenster (-∞,∞) untersucht. Baudet erforschte die parallele Aspirationssuche auf dem Cm* [Baudet 78]. Daraus folgte, dass die parallele Aspirationssuche eine maximale Beschleunigung von fünf bis sechs zeigte. 19 Eine weitere Methode ist die sequentielle Durchführung des Alpha-Beta-Algorithmus durch zwei Prozessoren. Der zweite Prozessor verwaltet ausschließlich die Transpositionstabelle. Während dieser Prozessor die Transpositionstabelle überprüft, kann der andere Prozessor bereits mit der Berechnung dieser Position beginnen. Steht der Wert nicht in der Tabelle, wurde keine Zeit mit der Suche vergeudet. Steht die Position bereits in der Tabelle, besteht die Zeit, die für die Berechnung des Wertes benötigt wird, aus dem Minimum der Berechnungszeit und der Zeit, die für das Auslesen des Wertes aus der Tabelle benötigt wird. 5 Fazit Heuristische Suchalgorithmen sind ein fester Bestandteil vieler Softwareprodukte, wie z.B. Routenplaner oder Computerspiele. Aufgrund der hohen Komplexität solcher Anwendungen reichen auch effiziente Algorithmen oft nicht aus, Ergebnisse in einer angemessenen Zeit zu liefern. Die Parallelisierung solcher Algorithmen bietet hier einen Ansatz zur Steigerung der Performance. Baumsuchalgorithmen eignen sich aufgrund ihrer Struktur sehr gut zur Parallelisierung selbst auf massiv parallelen Systemen. Die Schwierigkeit dabei liegt jedoch in der Lastverteilung. Der Baum kann beliebig in Teilbäume zerlegt werden, welche unabhängig voneinander durchsucht werden können. Bei der Aufteilung des Suchbaumes unter den Prozessoren ist die Größe der sich dabei ergebenden Teilbäume jedoch nicht a priori bekannt. Aus diesem Grund ist eine effiziente dynamische Lastverteilungsstrategie notwendig, um die Prozessoren während der Suche möglichst gleichmäßig auszulasten. Alle in dieser Ausarbeitung vorgestellten Algorithmen zeigten eine Effizienzsteigerung durch ihre Parallelisierung, wovon einige jedoch nur sehr gering ausfielen. Es bleibt also bei einzelnen Problemen zu prüfen, ob eine Parallelisierung in Abhängigkeit von der Beschleunigung und der zusätzlich entstehenden Kosten gerechtfertigt scheint. 20 6 Literaturverzeichnis [Aho 96] Aho, A.V., Ullmann J. D., Informatik, Datenstrukturen und Konzepte der Abstraktion, Thomson Publishing Gmbh, Bonn 1996 [Baudet 78] Gérard M. Baudet, The Design and Analysis of Algorithms for Asynchronous Multiprocessors. PhDthesis, Carnegie Mellon University, Pittsburgh, PA, 1978. [Kaindl 89] Kaindl, H., Problemlösen durch heuristische Suche in der Artificial Intelligence, Springer 1989 [LaSa 84] Ten-Hwang Lai, Sartaj Sahni, Anomalies in Parallel Branch-andBound Algorithms, CACM 27(6): 594-602 (1984) [Quinn 94] Quinn, M.J., Parallel Computing Theory and Practise. MacGrawHill 1994 [ReiNieDeo 77] Reingold, E., M. Nievergelt, J., Deo, N., Combinatorial Algortithmus: Theory and Practice. Prentice-Hall, Englewood Cliffs, NJ. 1977 [RE 89] Reinefeld, A., Spielbaum-Suchverfahren, Springer 1989 [SD69] J. Slagle, J. Dixon, Experiments with some Programs that Search Game Trees, Journal of the ACM 2, (1969), 189-207. [WahLiYu 85] Benjamin W. Wah, Guo-Jie Li, Chee-Fen Yu, Multiprocessing of combinatorial search problems. Computer 18, 6 (Juni), S. 93-108. 1985 [WahLiYu 90] Benjamin W. Wah, Guo-Jie Li, Chee-Fen Yu, Multiprocessing of combinatorial search problems, Parallel Algorithms for Machine Intelligence and Vision, Springer 1990