2010-12-01 12 views
1

Ich entwickle ein künstliches intelligentes Programm, um einen gegebenen Raum für Betriebsmittel zu erforschen.Repast Neustart-Problem

Ich möchte mehrere Szenarien ausführen, um Daten zu sammeln und in eine Datei auszugeben.

Ich habe die Option "mehrere Läufe" in der GUI verwendet und ich mache stop(), wenn ein Modullauf beendet ist (alle Ressourcen wurden untersucht). Das Problem ist, wenn es das Modell eine zweite Umdrehung ausführt, funktioniert es nicht richtig.

Was ich meine ist, dass nach dem Ausführen einmal ich immer die Anwendung durch Beenden beenden muss, weil die Neustart-Option nicht ordnungsgemäß funktioniert.

Gibt es etwas, das "Neustart" vergisst zu tun? Denn wenn ich die Anwendung beenden und führen Sie es wieder funktioniert es perfekt

Herausgegeben so ist es klar:

Ich benutze die Repast Plattform, um eine Exploration auf dem Mars zu simulieren. Ich habe 3 Arten von Agenten, Scouting, Graben und Transportieren. Sie kommunizieren untereinander, um Aufgaben und andere Dinge zu planen.

Das erste Mal, wenn ich die Simulation starte, läuft alles reibungslos. Und wenn alle Mineralressourcen des Planeten erkundet sind, starte ich das Modell neu und versuche es erneut, damit ich Daten sammeln kann.

Das Problem ist, wenn ich die "Neustart" -Option verwenden, läuft die Simulation nicht gut. Aber wenn ich es verlasse (nicht neustarten) und es erneut laufe, funktioniert es gut.

Was ich möchte, ist wissen, ob der Neustart-Option von Repast GUI alle Schritte verpasst ..

Vielen Dank im Voraus

PS: Wenn Sie Jungs denken, dass es absolut notwendig ist, kann ich einige Code schreiben ... aber das Projekt ist ziemlich groß

+0

Können Sie die Dinge ein wenig klären? –

+0

Ohne irgendeinen Code bezweifle ich, dass Sie gute Antworten bekommen werden. – Enrique

+0

Ich habe keine Ahnung was Repast ist, also blase ich wahrscheinlich nur Rauch ... aber ... muss dein Code an die GUI gebunden sein?Wenn Sie mehrere verschiedene Simulationen mit den gleichen Anfangsbedingungen ausführen und anschließend Daten zu den Ergebnissen erfassen möchten, ist es möglicherweise sinnvoll, dies im Hintergrund eines Worker-Threads zu tun. Aber, wie ich schon sagte, ich weiß wahrscheinlich nicht, wovon ich rede. – Bugmaster

Antwort

0
  1. Verwenden Sie nicht Thread.stop() -Methode. Es ist veraltet. Thread.stop wird nicht weiter unterstützt, da es von Natur aus nicht sicher ist. Durch das Stoppen eines Threads werden alle von ihm gesperrten Monitore entsperrt. (Die Monitore sind entsperrt, wenn die ThreadDeath-Ausnahme den Stapel hochfährt.) Wenn eines der zuvor von diesen Monitoren geschützten Objekte in einem inkonsistenten Zustand war, können andere Threads diese Objekte in einem inkonsistenten Zustand anzeigen. Solche Gegenstände sollen beschädigt sein. Threads, die mit beschädigten Objekten arbeiten, können sich willkürlich oder offensichtlich verhalten. Im Gegensatz zu anderen ungeprüften Ausnahmen werden Threads von ThreadDeath automatisch gelöscht. Daher hat der Benutzer keine Warnung, dass das Programm möglicherweise beschädigt ist. Die Korruption kann sich zu einer unvorhersehbaren Zeit nach dem Schaden manifestieren. Ersetzen Sie jede Verwendung von Thread.stop mit Code, der für eine sanftere Beendigung sorgt.

http://docs.sun.com/app/docs/doc/805-4031/6j3qv1of1?a=view

  1. Betrachten Gewinde entweder über Thread.interrupt Anhalten() oder via Flag ABBRUCH Einstellen. Sehen Sie sich Java Concurrency in Practice, Abschnitt 7.1 an. Löschen der Aufgabe
+0

Danke für den Rat, aber wenn ich Thread.CurrentThread.interrupt() repast einfach ignoriere es ... zumindest passiert es nichts. Ich werde versuchen, einen Haufen im Batch-Modus zu laufen. Dank –

+0

Interrupt() unterbricht Thread tatsächlich nicht, es fordert nur Unterbrechung an. Daher sollten Sie die Unterbrechungsrichtlinie für den Thread in Betracht ziehen, wenn Sie Zugriff auf die Methode run() haben. – Alexandr