Baumsuche Speichern des Ausführungsstatus

8

Ich habe einen Baum,

%Vor%

wird als Liste dargestellt,

%Vor%

Es ist eigentlich ein sehr großer Baum, also würde ich gerne die Suche starten, wenn ich nicht finde, wonach ich suche, etwa 100 ms, Zustand speichern, zurückkehren, Hausarbeit machen und dann die Suche erneut starten und dort weitermachen, wo ich aufgehört habe. Die Simulation, mit der ich arbeite, gibt mir eine gewisse Zeit, die nicht ausreicht, um die Suche zu vervollständigen. Ich suche nach Ideen / Techniken, um dies zu erreichen? (in Clojure, Java)

    
Hamza Yerlikaya 20.08.2011, 21:15
quelle

3 Antworten

7

Threading ist wahrscheinlich die einfachste Lösung, aber es ist nicht sehr schwierig, es selbst in einem einzigen Thread zu verwalten. "Simulations" -Umgebungen, die nur 100ms ergeben, lassen oft keine neuen Threads zu, also ist dies eine Alternative.

Die Grundidee besteht darin, eine Closure zu erstellen, die die Arbeit darstellt, die zur Beendigung der Aufgabe ausgeführt werden muss, und diese anstelle eines Ergebnisses zurückzugeben, wenn Sie keine Zeit zum Beenden haben. Hier ist eine Skizze: Sie fügt eine Folge von Zahlen hinzu und wird alle zehn statt alle 100 ms unterbrochen.

%Vor%

Edit: Da Clojure keine Tail-Call-Optimierung hat, wird ein Thunk erstellt und dann aufgerufen, wenn der Stapel verwendet wird. Wenn Sie, wie es wahrscheinlich ist, mehr als ein paar tausend Schritte ausführen können, bevor Sie unterbrochen werden müssen, erhalten Sie einen Stapelüberlauf. Die einzige realistische Lösung besteht darin, den Körper des Thunk sowohl in recur als auch in der Fortsetzung zu duplizieren, wie

%Vor%

Sie könnten dies wahrscheinlich mit einem Makro abstrahieren, wenn Sie mehrere solche "suspendable" -Funktionen schreiben müssten.

    
amalloy 20.08.2011, 21:40
quelle
2

Wenn dir der Overhead eines Threads egal ist, lege die Suche auf einen Thread, der ein bisschen Arbeit macht und dann von Zeit zu Zeit nachgibt.

Der Vorteil von Threads ist, dass Sie den Status nicht programmgesteuert speichern müssen. Das System wird es für Sie tun.

Sie müssen dies in der Komplexität bezahlen, da das Ergebnis der Suche asynchron kommen wird und Sie es irgendwie arrangieren müssen. Außerdem müssen Sie möglicherweise 100-ms-Timer einrichten. Viel Code. :)

    
Ray Toal 20.08.2011 21:18
quelle
0

Am besten machen Sie Punkte, an denen Sie den Status einfach speichern und später fortsetzen können (Sie können versuchen, die Funktion rekursiv zu machen, um die besten Punkte einfach zu finden)

Dann können Sie an diesen Punkten den Status speichern oder fortfahren

    
ratchet freak 20.08.2011 21:51
quelle

Tags und Links