package fmg.fmg8.umgebung2D;
import fmg.fmg8.endlAutomat.conditions.Condition;
import fmg.fmg8.graphVis.GuiSimulation;
import fmg.fmg8.graphVis.Vis;
import fmg.fmg8.sonstiges.SonstMeth;
import fmg.fmg8.statistik.Parametersatz;
import java.util.ArrayList;
import java.util.Observable;
/**
* @author Lukas K�nig
*/
public class SimulationsZeit extends Observable
implements Runnable {
/**
* Die observierende Simulation.
*/
private Simulation sim;
/**
* Die Parameter.
*/
private Parametersatz pars;
/**
* Anzahl der bisher erfolgten Simulationsschritte.
*/
private long simZyklen;
/**
* Ob die Simulation zum n�chstm�glichen Zeitpunkt gestoppt werden soll.
*/
private boolean stoppen;
/**
* Ein Observer f�r die Umgebung im Zeitablauf.
*/
private GuiSimulation guiSim;
/**
* Die Visobserver.
*/
private Vis[] visObserver;
/**
* Ob die Betrachtung oder die Simulation aktiviert ist.
*/
private boolean betrachtung;
/**
* Die Automaten.
*/
private String[][] automata;
/**
* Die Bedingungen, die zu den Automaten geh�ren.
*/
private Condition[][] condCollection;
/**
* Die IDs.
*/
private int[] identities;
/**
* Startet eine Simulation mit �bergebenen Automaten, anstatt die
* Roboter von der Festplatte zu laden.
*
* @param params Die Parameter.
* @param obs Ein Observer f�r die Umgebung.
* @param visObs Die Vis-Observer.
* @param automaten Die zugeh�rigen Automaten.
* @param condColl Die Bedingungen.
* @param ids Die zugeh�rigen ids.
*/
public SimulationsZeit(final Parametersatz params,
final GuiSimulation obs,
final Vis[] visObs,
final String[][] automaten,
final Condition[][] condColl,
final int[] ids) {
this.pars = params;
this.guiSim = obs;
this.visObserver = visObs;
this.betrachtung = true;
this.automata = automaten;
this.condCollection = condColl;
this.identities = ids;
this.reset();
this.addObserver(this.sim);
}
/**
* Konstruktor.
*
* @param params Die Parameter f�r den Lauf.
* @param obs Ein Observer f�r die Umgebung im Zeitablauf.
* @param visObs Die Visobserver.
*/
public SimulationsZeit(final Parametersatz params,
final GuiSimulation obs,
final Vis[] visObs) {
this.pars = params;
this.guiSim = obs;
this.visObserver = visObs;
this.betrachtung = false;
this.reset();
this.addObserver(this.sim);
}
/**
* Setzt den Zeitablauf auf den Anfang.
*/
public void reset() {
if (this.betrachtung) {
this.sim = new Simulation(this.pars,
this.guiSim,
this.visObserver,
this.automata,
this.condCollection,
this.identities);
} else {
this.sim = new Simulation(this.pars,
this.guiSim,
this.visObserver);
}
this.stoppen = false;
this.simZyklen = 0;
SonstMeth.log(2, "Simulationszeit zurueckgesetzt.", this.pars);
}
/**
* F�hrt den gesamten Zeitablauf aus.
*/
public void run() {
SonstMeth.log(2,
"Automatischer Zeitablauf gestartet. ",
this.pars);
boolean fortsetzen = this.step();
while (fortsetzen) {
fortsetzen = this.step();
}
SonstMeth.log(2, "Automatischer Zeitablauf beendet.", this.pars);
}
/**
* F�hrt einen Zeitschritt aus.
*
* @return Ob ein Zeitschritt ausgef�hrt werden konnte oder der Zeitablauf
* beendet wurde.
*/
public boolean step() {
if (!stoppen && (this.simZyklen < this.pars.getExpLen().longValue()
|| this.pars.getEndlos().booleanValue())) {
if (this.simZyklen % 100 == 0) {
ArrayList<Long> counters = new ArrayList<Long>(2);
counters.add(GlobaleVariablen.collCount);
counters.add(GlobaleVariablen.gateCount);
SonstMeth.log(1,
"Zeitzyklus: "
+ this.simZyklen
+ " / "
+ this.pars.getExpLen()
+ " (#Fitness: "
+ this.sim.getUm().getDurchFit()
+ ", Koll.: "
+ GlobaleVariablen.collCount
+ ", Gate: "
+ GlobaleVariablen.gateCount
+ ")",
this.pars,
"",
counters);
GlobaleVariablen.collCount = 0;
GlobaleVariablen.gateCount = 0;
}
if (this.simZyklen != 0
&& this.simZyklen % this.pars.getZwischSp() == 0) {
this.sim.aufnahmeSpeichern();
}
this.simZyklen++;
this.setChanged();
this.notifyObservers();
return true;
} else {
//this.sim.simulationEnde();
this.zeitBeenden();
return false;
}
}
/**
* Startet den Zeitablauf mit automatischem Weiterlaufen.
*/
public void zeitStarten() {
Thread simThread = new Thread(this);
simThread.start();
}
/**
* Beendet den Zeitablauf.
*/
public void zeitBeenden() {
this.sim.simulationEnde();
if (guiSim != null) {
this.guiSim.setWeiterlaufen(false);
}
this.reset();
}
/**
* Startet einen Zeitablauf mit Simulation ohne GUI.
*
* @param args Die Parameter.
*/
public static void main(final String[] args) {
Parametersatz params = new Parametersatz(args);
params.ergaenze();
params.setGraphisch(false);
if (params.getGraphisch().booleanValue()) {
throw new RuntimeException("Nur Kommandozeilenmodus erlaubt.");
}
SonstMeth.log(1, params.toString(), params, "plain", null);
SimulationsZeit simT = new SimulationsZeit(params, null, null);
simT.zeitStarten();
}
}