Generierung von Monte-Carlo-Enumerations-Reihenfolgen bei kombinatorischen Problemen
Betrachtet wird ein System, das n! verschiedene Zustände annehmen kann. Zudem sei eine Zielfunktion gegeben,die jedem
System-Zustand einen Wert zuordnet. Gesucht sei der System-Zustand, bei dem der Zielfunktionswert minimal (bzw. maximal) wird.
Es soll angenommen werden, daß benachbarte Systemzustände auch ähnliche Zielfunktionswerte besitzen.
Weiterhin soll das System hinreichend kompliziert sein, so daß sich der Zustand mit minimalem (bzw. maximalem) Zielfunktionswert
auf analytischem Weg nicht oder nur mit großem Aufwand ermitteln läßt.
Eine Möglichkeit zur Ermittlung des optimalen Zustandes besteht in der Enumeration, d. h. die Systemzustände werden in einer
bestimmten Reihenfolge erzeugt und die entsprechenden Zielfunktionswerte dazu berechnet. Nach genau n! Schritten ist die
optimale Lösung mit Sicherheit gefunden. Diese Methode ist jedoch nur sinnvoll, wenn wirklich alle n! Zustände geprüft
werden können. Falls n! sehr groß ist und die Enumeration wegen begrenzter Rechenzeit vorzeitig abgebrochen werden muß,
kann die gefundene beste Lösung jedoch weit vom Optimum entfernt sein (siehe Abbildung weiter unten).
Eine andere häufig angewandte Methode bei Systemen mit großem n! besteht darin, eine Stichproben-Anzahl von Systemzuständen
zufällig zu erzeugen und unter diesen den Zustand mit dem minimalen (bzw. maximalen) Zielfunktionswert als Lösung zu verwenden
(Monte-Carlo-Methode). Bei dieser Methode wird jeder Systemzustand mit gleicher Wahrscheinlichkeit untersucht, d.h. selbst
wenn die Stichprobenanzahl wesentlich kleiner als n! ist, wird eine Lösung ermittelt, die in der Regel nahe am Optimum liegt.
Es kann aber bei dieser Methode nie mit absoluter Sicherheit gesagt werden, daß das Optimum gefunden wurde, selbst
wenn die Stichprobenanzahl gleich n! oder größer als n! ist. Durch nachfolgende Herleitung und Tabelle wird dies verdeutlicht.
Es sei:
N - Anzahl der möglichen Systemzustände (N>>1)
m - Stichprobenanzahl
u - Anzahl der ungeprüften Zustände
Es gilt:
u ( 0 ) = N
u ( m + 1 ) = u ( m ) - u ( m ) / N
u ( m ) / N ist dabei die Wahrscheinlichkeit, daß ein zufällig ausgewählter Zustand noch nicht geprüft worden ist.
Bei differentieller Betrachtung ( gültig für N>>1 ) erhält man:
du/dm = - u/N =>
du/u = - dm/N
Mit dem Ansatz u ( m ) = a · exp ( -b · m ) erhält man:
du/dm = -b · a · exp ( -b · m) = -b · u ( m ) =
- u/N
=> b = 1/N
u ( m ) = a · exp ( - m/N )
Durch Einsetzen des Anfangswertes erhält man:
u ( 0 ) = a · exp ( 0 ) = N
=> a = N
Bei einer Stichprobenanzahl m beträgt die Anzahl der ungeprüften Zustände u demnach
u ( m ) = N · exp ( - m/N )
Stichprobenanzahl | Anzahl der geprüften Zustände |
0,1 · N | 0,095 · N |
0,2 · N | 0,181 · N |
0,5 · N | 0,393 · N |
1 · N | 0,632 · N |
2 · N | 0,865 · N |
Bei N Zuständen und N zufälligen Stichproben werden also mittels Monte-Carlo Methode nur 63,2% aller Zustände wirklich
geprüft, da einige Zustände zufällig mehrfach geprüft werden.
Ein weiterer Nachteil dieser Methode besteht darin, daß es zu Cluster-Bildung bei den untersuchten Zuständen
kommen kann. Das ist dann bedeutsam, wenn mit einem Verbesserungsverfahren in der Nachbarschaft des bisher besten gefundenen
Zustandes nach noch besseren Zuständen gesucht werden soll. Wenn der bisher beste gefundene Zustand Teil eines Clusters ist,
dann sind einige oder alle benachbarte Zustände bereits untersucht worden und das Verbesserungsverfahren wird dort keine bessere
Lösung finden. In der folgenden Abbildung wird dies veranschaulicht, die Menge aller Zustände wird dabei vereinfacht als ein
zweidimensionales Gebiet aufgefaßt.
O O O O O O O O O O O O o o o O O O X X X X X X X X X
O X O X O X O X O O X O O O O O X O X X X X X X X O O
O O O O O O O O O O O O X O O X O O O O O O O O O O o
O X O X O X O X O o O x O O O O O o o o o o o o o o o
O O O O O O O O O O O O O O X O O o o o o o o o o o o
O X O X O X O X O O X O O X X x O o o o o o o o o o o
O O O O O O O O O O O O O O X X O o o o o o o o o o o
O X O X O X O X O o O X O O O O O o o o o o o o o o o
O O O O O O O O O o O O O O X O o o o o o o o o o o o
Von 81 möglichen Zuständen wurden 16 Stichproben geprüft (Symbol X). Links (Auswahl vorgegeben) wurde jeder Zustand
höchstens einmal geprüft, jeder ungeprüfte Zustand (Symbol O) befindet sich in unmittelbarer Nachbarschaft eines
geprüften Zustandes. In der Mitte (Auswahl mittels Monte-Carlo-Methode) wurden 2 Zustände zufällig zweimal geprüft
(Symbol x), 6 Zustände bilden einen Cluster (fett) und 13 ungeprüfte Zustände (Symbol o) befinden sich nicht in unmittelbarer
Nachbarschaft eines geprüften Zustandes. Rechts (Auswahl durch herkömmliche Enumeration) gehören alle geprüften
Zustände zu einem Cluster, dabei wurde kein Zustand zweimal geprüft, 55 ungeprüfte Zustände (Symbol o) liegen dabei
nicht in unmittelbarer Nachbarschaft eines geprüften Zustandes.
Im folgenden wird eine Methode vorgestellt, die die Vorteile von Enumeration und Monte-Carlo-Methode verbindet und
die Nachteile vermeidet. Es handelt sich dabei um eine Enumerations-Reihenfolge für Systeme mit n! Zuständen, so daß
bei einer kleinen Stichprobenanzahl die geprüften Zustände zufällig verteilt erscheinen. Es wird jedoch kein Zustand
zweimal geprüft. Nach genau n! Schritten sind wie bei der herkömmlichen Enumeration alle Zustände geprüft.
Systeme mit genau n! Zuständen sind z. B. Systeme, die durch die Reihenfolge von n Elementen gekennzeichnet sind. Ein System
mit n = 3 (1, 2, 3) kann dabei 3! = 1 · 2 · 3 = 6 Zustände (1-2-3, 1-3-2, 2-1-3, 2-3-1, 3-1-2, 3-2-1) annehmen. Ein anderes
(aber äquivalentes) Beispiel sind Zuordnungen. Bei der paarweisen Zuordnung der Elemente der Mengen {1, 2, 3} und {a, b, c}
gibt es 3! = 6 Zustände (1-a, 2-b, 3-c), (1-a, 3-b, 2-c), (2-a, 1-b, 3-c), (2-a, 3-b, 1-c), (3-a, 1-b, 2-c) und (3-a, 2-b, 1-c).
Allgemein kann jeder Zustand eines Systems, das n! Zustände besitzt, durch eine n×n-Zuordnungsmatrix
repräsentiert werden. Das Problem des Findens einer Enumerations-Reihenfolge mit den gewünschten Eigenschaften
entspricht damit dem Problem des Findens einer Folge von entsprechenden n×n-Zuordnungsmatrizen.
Zu einer dem Problemtyp angemessenen Beschreibungsform gelangt man durch die Verwendung kombinatorischer Zahlen.
Jede Zuordnungsmatrix läßt sich genau durch eine kombinatorische Zahl darstellen und umgekehrt.
Das kombinatorische Zahlensystem
Das im alltäglichen Gebrauch verwendete Zahlensystem ist das Dezimalsystem. Eine nichtnegative
ganze Zahl besteht dabei aus einer Folge von n Ziffern cn-1cn-2... c1c0 , die jeweils
10 Werte (0 bis 9) annehmen können. Der Wert der Zahl beträgt dabei
cn-1 · 10n-1 + cn-2 · 10n-2 + ... + c1 ·
101 + c0 · 100. In analoger Weise verwendet wird (z. B. bei digitaler Rechentechnik)
das duale Zahlensystem mit Ziffern, die 2 Werte (0 und 1) annehmen können und das hexadezimale Zahlensystem mit Ziffern, die 16
Werte (0 bis 9 und A bis F) annehmen können. Zur Unterscheidung vom Dezimalsystem ist es sinnvoll, Zahlen anderer Zahlensysteme
durch ein vorangestelltes Symbol zu kennzeichnen, z. B. die Dualzahl 10011 als d10011 und die Hexadezimalzahl A72 durch hA72.
Für die Werte dieser Zahlen erhält man im Dezimalsystem:
d10011 = 1 · 24 + 0 · 23 + 0 · 22 + 1 · 21 +
1 · 20 = 16 + 0 + 0 + 2 + 1 = 19
hA72 = 10 · 162 + 7 · 161 + 2 · 160 = 2560 + 112 + 2 = 2674
Das kombinatorische Zahlensystem habe die folgenden Eigenschaften: Eine kombinatorische Zahl bestehe aus einer
Folge von n Ziffern cn-1cn-2... c1c0. Dabei kann eine Ziffer ci
jeweils die i+1 Werte 0 bis i annehmen ( i = 0...n-1 ). Der Wert einer kombinatorischen Zahl beträgt
cn-1 · (n-1)! + cn-2 · (n-2)! + ... + c1 · 1! + c0 · 0!.
Zur Kennzeichnung wird einer kombinatorischen Zahl stets das Symbol k vorangestellt, z. B. wird die kombinatorische Zahl 31210 als k31210
gekennzeichnet. Der Wert dieser Zahl beträgt im Dezimalsystem:
k31210 = 3 · 4! + 1 · 3! + 2 · 2! + 1 · 1! + 0 · 0! = 72 + 6 + 4 + 1 + 0 = 83
Jede kombinatorische Zahl mit n Ziffern entspricht einer n×n-Zuordnungsmatrix. Der Wert der i-ten Ziffer dieser kombinatorischen Zahl
ist dabei gleich der Anzahl der ausgelassenen Zeilen vor Belegung der i-ten Spalte der Zuordnungsmatrix, es wird dabei von links begonnen.
Die folgenden drei Beispiele sollen dies verdeutlichen:
o o o o x x o o o o o o o x o
o x o o o o x o o o o x o o o
o o o x o o o x o o x o o o o
x o o o o o o o x o o o x o o
o o x o o o o o o x o o o o x
k31210 k00000 k21100
Generierung einer Monte-Carlo-Enumerations-Reihenfolge
Zur Ermittlung eines Nachfolgers einer kombinatorischen Zahl in einer Enumerations-Reihenfolge sei die Operation N( k ) = k(1)
folgendermaßen definiert: k sei eine kombinatorische Zahl mit den n Ziffern cn-1cn-2...
c1c0.
Die Ziffern der Zahl k' = k(1) = N ( k ) sind dann zu berechnen durch:
d := 1;
for i := n-1 downto 0 do begin
c'i := ci + d;
if ( c'i > i ) then c'i := 0 else d := 0;
end;
Wird die Operation N ( k ) mehrfach hintereinander ausgeführt, dann kann die folgende Schreibweise verwendet werden:
k( 0 ) = k und k(m) = N ( k(m-1) ) = Nm ( k ).
Die sich damit ergebende Reihenfolge wiederholt sich bei einem k mit n Ziffern nach genau m = n! Operationen. Die Reihenfolge besitzt jedoch
noch nicht die Eigenschaft, daß die Zahlen wie Zufallszahlen verteilt sind. Das ist durch eine Transformation k => k(o) zu
erreichen. Die Transformation muß eineindeutig sein, so daß die k(o) - Folge ebenfalls wie die k - Folge eine
Periodenlänge von n! hat. Eine weitere notwendige Bedingung ist, daß die Transformation nichtlinear sein muß, da sich
andernfalls nichts an der Verteilung ändern würde. Eine mögliche Transformation ist die Abwärtsmodulation A(k).
k sei eine kombinatorische Zahl mit den n Ziffern cn-1cn-2...
c1c0. Die Ziffern der Zahl k' = k(1) = A ( k ) sind dann zu berechnen durch:
c'n-1 := cn-1;
for i := n-1 downto 1 do c'i-1 := ( ci-1 + c'i ) modulo ( i );
Um eine gute zufallsähnliche Verteilung zu erhalten, ist es ausreichend, die Operation A( k ) mehrfach hintereinander auszuführen
(mindestens zweimal, öfter als n/2 mal ist nicht sinnvoll). Für mehrfache Abwärtsmodulationen
kann dabei die folgende Schreibweise verwendet werden:
k( 0 ) = k und k(o) = A ( k(o-1) ) = Ao ( k ).
Eine Folge mit den m = n! Gliedern Ao( k( 1 ) ) , Ao( k( 2 ) ) ...
Ao( k( m ) ) (bei 1 < o < n/2) entspricht einer Enumerations-Reihenfolge mit den
gewünschten Eigenschaften. Als Startwert kann dabei für k eine beliebige kombinatorische Zahl mit n Ziffern gewählt werden.
Eine kombinatorische Zahl Ao( k( i ) ) ist dann jeweils einem Systemzustand zuzuordnen und dieser entsprechend
auszuwerten.
Es ist noch zu bemerken, daß die mit diesem Verfahren ermittelte Reihenfolge der Zustände an sich nicht einer Zufallsverteilung
ähnelt (das ist hier auch nicht notwendig), sondern die Verteilung der m ausgewählten Zustände (bei m < n!) ähnelt
einer Zufallsverteilung.
(c) Lutz Tautenhahn 1998, 1999