Package fmg.fmg8.umgebung2D

Source Code of fmg.fmg8.umgebung2D.SimulationsZeit

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();
    }
}
TOP

Related Classes of fmg.fmg8.umgebung2D.SimulationsZeit

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.