Was sind einige effektive Heuristiken, um die Anzahl der Hamilton-Pfade in einem rechteckigen Gitter zu ermitteln?


8

Ein besonderes Programmierproblem, auf das ich kürzlich gestoßen bin, reduziert sich darauf, Hamilton-Pfade in einem rechteckigen Raster zu finden, das ungefähr so ​​aussehen würde:

A  0  0  0

0  0  0  0

0  0  C  D

Welche effektiven Heuristiken könnten angewendet werden, um sie zu finden - und insbesondere Techniken zum Trimmen / Verwerfen von Pfaden auf dem Weg?

Bearbeiten: Zur Verdeutlichung werden die Kanten gebildet, wenn Elemente horizontal und vertikal, aber nicht diagonal verbunden werden. Das Problem besagt auch, dass jedes Element, das mit 0 markiert ist, verwendet werden kann, um einen Pfad zu bilden, aber Nicht-0-Elemente sind "Hindernisse", die vermieden werden müssen.

A-0-0-0
      |
0-0-0-0
|
0-0-C D

könnte zum Beispiel ein Weg sein. Ein anderer kann sein,

A 0-0-0
| |   |
0 0 0-0
| | |
0-0 C D

2
Welches sind die Kanten in Ihrem Beispiel?
Alexandru

1
Kam dies per Chance von Quoras Job-Challenge-Seite? quora.com/challenges
Majelbstoat

Antworten:


3

Ich sehe keine einfache Art zu zählen, ohne aufzuzählen. Sie können problemlos alle Hamilton-Pfade mit einer exaustiven Tiefensuche mit Backtracking besuchen. Sie können tatsächlich ein bisschen schummeln und feststellen, dass, wenn N die Anzahl der Hamilton-Pfade ist, die nach rechts beginnen, die Gesamtzahl der Hamilton-Pfade 2N beträgt (aufgrund der Symmetrie des Gitters). Dies erstreckt sich nicht vollständig (bei einigen Scheitelpunkten führen nicht alle Pfade zu der gleichen Anzahl von Zyklen, aber Sie können die Anzahl der Hamilton-Pfade leicht mit einem ähnlichen Argument nach oben begrenzen (mit dem Bonus, dass Sie Teile davon genau lösen können Dies ist die Strategie, die ich wählen würde.

Aber wenn Sie dies nicht möchten, einige allgemeine Heuristiken:

  • Sie können die Anzahl der Hamilton-Pfade auch leicht als | E | festlegen Wählen Sie | V | -1 (wobei | E | die Anzahl der Kanten und | V | die Anzahl der Scheitelpunkte im Diagramm ist), was für ein Diagramm mit geringer Dichte viel besser sein kann als | V |! (Die naive Grenze, die davon ausgeht, dass der Graph vollständig ist).

  • Eine einfache Möglichkeit, diese Grenze zu verbessern, besteht darin, bekannte und schlechte Kombinationen zu kürzen, indem nicht zwei Kanten desselben Scheitelpunkts berücksichtigt werden. Sie würden also so etwas wie prod_v (deg_v-1) erhalten (das sollte immer noch die Anzahl der Hamilton-Pfade nach oben begrenzen, da Sie jetzt Zyklen mehr als einmal zählen, denke ich).


1
Kann dies nicht zu einer Art dynamischer Programmierung mit Memoisierung verbessert werden?
András Salamon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.