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.

InformationsquelleAutor | 2009-12-07
Schreibe einen Kommentar