Aktualisierung 2011-12-28: Hier ist ein Blog-Beitrag mit einer weniger vagen Beschreibung des Problems, das ich lösen wollte, meiner Arbeit daran und meiner aktuellen Lösung: Beobachten, wie jedes MLB-Team ein Spiel spielt
Ich versuche, eine Art eigenartige Pfadfindungs-Herausforderung zu lösen. Ich habe einen azyklischen gerichteten Graphen, und jede Kante hat einen Distanzwert. Und ich möchte den kürzesten Weg finden. Einfach, oder? Nun, es gibt ein paar Gründe, warum ich nicht einfach Dijkstras oder A* verwenden kann.
- Es ist mir überhaupt nicht wichtig, was der Startknoten meines Pfades ist, noch der Endknoten. Ich benötige einen Pfad, der genau 10 Knoten enthält. Aber:
- Jeder Knoten hat ein Attribut, sagen wir mal, es ist die Farbe. Jeder Knoten hat eine von 20 verschiedenen möglichen Farben.
- Der Pfad, den ich zu finden versuche, ist der kürzeste Pfad mit genau 10 Knoten, wobei jeder Knoten eine andere Farbe hat. Ich möchte nicht, dass irgendein Knoten in meinem Pfad die gleiche Farbe wie ein anderer Knoten hat.
- Es wäre schön, meinen Pfad dazu zwingen zu können, einen Wert für eines der Attribute zu haben ("mindestens ein Knoten muss blau sein", zum Beispiel), aber das ist nicht wirklich notwendig.
Das hier ist ein vereinfachtes Beispiel. Mein vollständiger Datensatz hat tatsächlich drei verschiedene Attribute für jeden Knoten, die alle einzigartig sein müssen, und ich habe 2k+ Knoten, von denen jeder durchschnittlich 35 ausgehende Kanten hat. Da ein perfekter "kürzester Pfad" exponential oder faktoriell sein kann, ist eine erschöpfende Suche wirklich keine Option. Wonach ich wirklich suche, ist eine Approximation eines "guten Pfades", der das Kriterium unter #3 erfüllt.
Kann mir jemand einen Algorithmus nennen, den ich verwenden könnte (auch modifiziert)?
Einige Statistiken zu meinem vollständigen Datensatz:
- Gesamte Knoten: 2430
- Gesamte Kanten: 86524
- Knoten ohne eingehende Kanten: 19
- Knoten ohne ausgehende Kanten: 32
- Die meisten ausgehenden Kanten: 42
- Durchschnittliche Kanten pro Knoten: 35,6 (in beide Richtungen)
- Aufgrund der Natur der Daten weiß ich, dass der Graph azyklisch ist
- Und im vollständigen Datensatz suche ich nach einem Pfad der Länge 15, nicht 10