Lösung des N-Damen-Problem... Wie weit können wir gehen?
Des N-Damen-Problem:
Dieses problem besagt, dass, gegeben ein Schachbrett der Größe N durch N ist, finden die verschiedenen Permutationen, in der N Damen auf dem Brett platziert werden, ohne dass ein bedrohen sich gegenseitig.
Meine Frage ist:
Was ist der maximale Wert von N, für die ein Programm berechnen kann, die Antwort in angemessener Zeit? Oder was ist das größte N, die wir bisher gesehen haben?
Hier ist mein Programm in CLPFD(Prolog):
generate([],_).
generate([H|T],N) :-
H in 1..N ,
generate(T,N).
lenlist(L,N) :-
lenlist(L,0,N).
lenlist([],N,N).
lenlist([_|T],P,N) :-
P1 is P+1,
lenlist(T,P1,N).
queens(N,L) :-
generate(L,N),lenlist(L,N),
safe(L),
!,
labeling([ffc],L).
notattack(X,Xs) :-
notattack(X,Xs,1).
notattack(X,[],N).
notattack(X,[Y|Ys],N) :-
X #\= Y,
X #\= Y - N,
X #\= Y + N,
N1 is N + 1,
notattack(X,Ys,N1).
safe([]).
safe([F|T]) :-
notattack(F,T),
safe(T).
Dieses Programm funktioniert genauso gut, aber die Zeit, die es dauert, nimmt mit N.
Hier ist eine Beispiel-Ausführung:
?- queens(4,L).
L = [2, 4, 1, 3] ;
L = [3, 1, 4, 2] ;
No
Bedeutet dies, dass Sie statt der 4 Königinnen, die in Zeile 2 in Spalte 1, Zeile 4 in Spalte 2, Zeile 1 in 3 und Zeile 3 in 4.(In 4 Von 4 Schachbrett)
Nun werden wir sehen, wie dieses Programm führt(Zeit genommen bei der Berechnung der ersten permutation):
Für N=4,5.....10 Berechnet, innerhalb von einer Sekunde
Für N=11-30 Dauert zwischen 1-3 Sekunden
Für N=40..50 Noch berechnet innerhalb einer minute
Bei N=60 Es geht aus dem Globalen stack(Suche Raum enorm).
War dies eines der letzten Hausaufgaben problem. (Das ursprüngliche problem war, nur um code-N-Queens)
Ich bin auch daran interessiert, dass Alternative Implementierungen in anderen Sprachen(die besser als meine Umsetzung) oder Wenn es gibt Raum für Verbesserungen in meinem Algorithmus/Programm
- Wikipedia hat eine Reihe von algorithmen, und zeigt an, dass mindestens einer von Ihnen lösen können 1.000.000-Damen-problem in ~50 Schritte. en.wikipedia.org/wiki/...
- Ich habe sehr wenig getan, mit Prolog, und vor langer Zeit. Aber ich erinnere mich daran, dass, obwohl der Prolog ist eine präskriptive (?) eher als imperative Sprache, es ist möglich, zu bestellen und auch sonst die Regeln so zu schubsen Verarbeitung in einer bevorzugten und hoffentlich bessere Richtung durchführen. Ich bin nicht bis zu ihm, aber ich denke, würde Ihre Lösung gestrafft werden könnten, auf diese Weise zu erreichen, viel bessere Leistung.
- Ich denke, mein Programm funktioniert ähnlich wie die animation zeigte in der wikipedia. Es legt eine Königin und schlägt dann von den Positionen, die Königin zu töten und so weiter. Aber die 1-Millionen-Damen-problem in weniger als 50 Schritte, das ist der Wahnsinn. Ich denke, dieser wikipedia-Artikel ist nicht ganz korrekt. Auch mit der Verwendung von Constraints, ich glaube nicht, dass es gelöst werden kann in 50 Stufen
- Auch kann es trivial sein..Aber ich könnte die Länge/2 eingebaute Funktion zum verringern der code-Größe.Aber immer noch die Leistung wäre die gleiche
- Gut, die 50-Schritt-Implementierung muss nicht die komplette Tiefe-zuerst-Suche, wie Sie Ihren Algorithmus tut. Wenn Sie den Artikel Lesen, bekommst du einige Informationen. In allem, es erfordert eine anfängliche setup 'einigermaßen gut'.
- Smotricz Mein Programm verwendet die Constraints effektiv. Es ist nicht blind Berechnung aller Permutationen und zu testen. Es Einschränkungen verwendet, um mögliche zukünftige Permutationen auf intelligente Weise. Was du sagst stimmt..Es kann fein abgestimmt werden, indem Schnitte..Es woont verbessert die performance signifikant.
- Norum.. Na ja, du hast Recht. Aber dieser algorithmen wird davon ausgegangen, dass Sie einen guten ersten Konfiguration, plus es ist keine Garantie für eine Lösung, wie es sein könnte, stecken in einem lokalen minimum. Anyways, es ist eine gute alternative.
- math.utah.edu/~alfeld/queens/queens.html zeigt die tatsächliche Komplexität, die wir zu tun haben. Überprüfen Sie heraus die Anzahl der Schritte als N erhöht
- Sie können auch mit
length/2
. Ich kann nicht kommentieren, CLPFD, aber ich glaube es ist üblich zu implementieren built-ins in stark optimiert lower-level-code, anstatt im prolog selbst. So können Sie auch verringern code-Größe und profitieren Sie von möglichen Optimierungen, die möglicherweise bereits für Sie getan. - Der Schnitt ist fehl am Platz, auch die Tatsache, dass in
generate/2
ist falsch. - Dies ist zwar ein Alter thread, es ist sehr interessant. Es wird gut sein, wenn man beschreibt, wie dieser code arbeitet, vorzugsweise durch hinzufügen von Kommentaren, um den code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
kurze Lösung vorgelegt von raymond hettinger auf pycon: einfach die ki in python
computing alle Permutationen ist nicht skalierbar, obwohl (
O(n!)
)Dieser Diskussion verbindet drei verschiedene rechnerische Probleme: (1) die Suche nach einer Lösung des N-Damen-problem, (2) Auflistung aller Lösungen für einige Feste N, und (3) zählen alle Lösungen, die für einige Feste N. das erste problem, Das schwierig aussieht zuerst für eine Größe von board, wie z.B. N=8. Aber wie Wikipedia schon sagt, in einigen Schlüssel Weise ist es einfach, wenn N groß ist. Die Damen auf ein großes Brett kommunizieren nicht so viel. Außer für den Speicher Einschränkungen, Heuristik Reparatur-Algorithmus ist ein einfacher job, als N erhöht.
Auflistung jede Lösung ist eine andere Frage. Das kann wohl sein, mit einem guten dynamischen Programmierung code bis zu einer Größe, die groß genug ist, dass es keinen Punkt gibt, in dem Lesen der Ausgabe.
Die interessanteste version der Frage ist, zählen die Lösungen. Der Stand der Technik zusammengefasst in eine fabelhafte Referenz bekannt als Die Encyclopedia of Integer Sequences. Es wurde berechnet, bis N=26. Ich würde vermuten, dass, die verwendet auch die dynamische Programmierung, aber im Gegensatz zu den Fall der Aufnahme in die Liste jede Lösung, die Algorithmische problem ist viel tiefer und offen für weitere Entwicklungen.
Diese faszinierende Unberechenbarkeit in backtrack-Komplexität für unterschiedliche board Größen war der Teil in diesem puzzle, dass die meisten interessiert mich auch. Ich habe jahrelang die Gebäude eine Liste der 'zählt' der Algorithmus Schritte zu finden, die erste Lösung für jede board-Größe - mit der einfachen und gut bekannten depth-first-Algorithmus in eine rekursive C++ - Funktion.
Hier ist eine Liste all jener 'zählt' für boards bis zu N=49 ... minus N=46 N=48, das sind noch work-in-progress:
http://queens.cspea.co.uk/csp-q-allplaced.html
(Habe ich aufgelistet in der Encyclopedia of Integer Sequences (OEIS) als A140450)
Diese Seite enthält einen link zu einer Liste mit den passenden erste-Lösungen.
(Meine Liste Erste Lösungen ist OEIS-Folge Nummer A141843)
Ich nicht in Erster Linie zu erfassen, wie viel Verarbeitungszeit jede Lösung verlangt, sondern ich aufzeichnen, wie viele gescheiterte Königin-Platzierungen nötig waren, vor der Entdeckung jedes board ist algorithmisch-erste Lösung. Natürlich ist die rate der Königin Praktika hängt von der CPU-Leistung, aber bei einem kurzen test-run auf eine bestimmte CPU und einer bestimmten board-Größe, ist es leicht zu berechnen, wie lange es dauerte, um zu lösen, eine dieser "gefundenen" Lösungen.
Beispielsweise auf einem Intel Pentium D 3,4 GHz CPU, mit einem einzigen CPU-thread -
Meinem jetzigen 2,8 GHz i7-860 ist Prügel durch über 28,6 Millionen Königinnen pro Sekunde, versuchen, die erste Lösung für N=48. So weit hat es gedauert, über 550 Tagen (theoretisch, wenn es noch nie ununterbrochen), um Erfolglos Ort 1,369,331,731,000,000 (und schnell klettern) Königinnen.
Meine web-site nicht (noch nicht) zeigen eine C++ - code, aber ich gebe einen link auf die web-Seite zu meine einfache Darstellung von jedem der 15 Algorithmus-Schritte zum lösen der N=5 board.
Es ist ein köstliches puzzle-in der Tat!
Dem Prolog-system verwenden Sie? Zum Beispiel, mit den letzten Versionen von SWI-Prolog, können Sie leicht finden, Lösungen für N=80 und N=100 innerhalb von Bruchteilen einer Sekunde, verwenden Sie Ihre original-code. Vielen anderen Prolog-Systemen werden viel schneller als die.
Des N-Damen-problem wird auch als Feature in einem der online-Beispiele von SWI-Prolog, als CLP(FD) - queens in SWISH.
Beispiel mit 100 queens:
SWISH zeigt Ihnen auch schönsten U Bild der Lösungen.
Hier ist eine animierte GIF-Datei zeigt die vollständige Lösung Prozess für N=40 queens mit SWI-Prolog:
Was ist das größte N mit Computern lösen gibt es Hinweise in der Literatur, in der eine Lösung für N etwa 3*10^6 ist gefunden worden, mit einem Konflikt Reparatur-Algorithmus (z.B. lokale Suche). Siehe zum Beispiel die klassischen Papier von [Sosic und Gu].
Als exakte Lösung mit backtracking,gibt es einige clevere branching-Heuristiken, die das erreichen richtigen Konfigurationen mit fast kein backtracking. Diese Heuristiken können auch verwendet werden, um zu finden, die ersten-k Lösungen für das problem: nach der Suche nach einem ersten richtigen Konfiguration der Suche backtracks, um andere gültige Konfigurationen in der Nähe.
Referenzen für diese fast perfekt Heuristiken sind [Grünkohl 90] und [San Segundo 2011]
Gibt es kein limit. Das heißt, die Prüfung für die Gültigkeit der Lösung ist teurer als der Aufbau eines solution plus sieben symmetrische lieben.
Siehe Wikipedia:
"Explizite Lösungen existieren für die überführung von n Damen auf einem n × n Brett für alle n ≥ 4, dass keine kombinatorische Suche zu löschen.".
Schleppte ich aus einem alten Delphi-Programm, dass zählt die Anzahl der Lösungen für jede board-Größe, habe eine schnelle änderung zu machen, es zu stoppen, nachdem ein Treffer, und ich bin zu sehen eine ungerade Muster in den Daten:
Ersten Brett dauerte über 1 Sekunde zu lösen, wurde n = 20. 21, gelöst in 62 Millisekunden, obwohl. (Hinweis: Dies basiert off Nun, nicht jeder high precision system.) 22 dauerte 10 Sekunden, nicht wiederholt zu werden, bis 28.
Ich weiß nicht, wie gut die Optimierung ist als diese war ursprünglich eine hoch optimierte routine aus zurück, wenn die Regeln der Optimierung waren sehr unterschiedlich. Ich habe eine Sache, die sehr anders als die meisten Implementierungen, obwohl-es hat keinen Vorstand. Vielmehr bin ich-tracking, welche Spalten und diagonalen werden angegriffen und das hinzufügen einer Königin pro Zeile. Dies bedeutet, dass 3 array-lookups pro Zelle getestet und keine Vermehrung überhaupt. (Wie gesagt, aus, wenn die Regeln sehr unterschiedlich waren.)
Nun für einige echte Wahnsinn: 29 dauerte 9 Sekunden. 30 dauerte fast 6 Minuten!
Eigentlich constrained-random-walk (erstellen und testen) wie das, was bakore beschrieben ist der Weg zu gehen, wenn Sie nur eine Handvoll Lösungen, denn diese können schnell generiert. Ich Tat dies für eine Klasse, wenn ich war 20 oder 21 und veröffentlichte die Lösung, die im Journal of Pascal, Ada & Modula-2, März 1987, "Die Damen-Problem Revisited". Ich habe gerade abgestaubt, den code aus diesem Artikel heute (und das ist sehr ineffizient-code) und nach der Reparatur ein paar Probleme erzeugen, für N=26 ... N=60 Lösungen.
Wenn Sie möchten, dass nur 1 Lösung, dann kann es gefunden werden gierig in linearer Zeit O(N). Mein code in python:
Hier, aber das drucken dauert O(N^2) Zeit und auch python wird ein langsamer Sprache, die jeder kann versuchen, es umzusetzen in anderen Sprachen wie C/C++ oder Java. Aber auch mit python wird es die erste Lösung für n=1000 in 1 oder 2 Sekunden.