Package fmg.fmg8.umgebung2D

Source Code of fmg.fmg8.umgebung2D.Roboter

/*
* Datei:            Roboter.java
* Autor(en):        Lukas K�nig
* Java-Version:     6.0
* Erstellt:         13.03.2009
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/

package fmg.fmg8.umgebung2D;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.LinkedList;
import java.util.Random;

import fmg.fmg8.earleyErkenner.EarleyErkenner;
import fmg.fmg8.endlAutomat.AutomatenNummer;
import fmg.fmg8.endlAutomat.EndlicherAutomat;
import fmg.fmg8.endlAutomat.conditions.Condition;
import fmg.fmg8.endlAutomat.conditions.mutation.CondMutVerfahren;
import fmg.fmg8.endlAutomat.script.ScriptInterpreter;
import fmg.fmg8.endlAutomat.translator.Translator;
import fmg.fmg8.sonstiges.SonstMeth;
import fmg.fmg8.statistik.Parametersatz;

/**
* @author Lukas K�nig
*/
public class Roboter extends RobEinfach {
   
    /**
     * Die Codes der Verhaltensautomaten (i.A. nicht in der Standardkodierung).
     */
    private LinkedList<Integer>[] verhCodes;

    /**
     * Die aktuellen Translatoren.
     */
    private Translator[] translatoren;
   
    /**
     * Die Codes der Translatoren (i.A. nicht in der Standardkodierung).
     */
    private LinkedList<Integer>[] transCodes;

    /**
     * Die besten Translatoren.
     */
    private Translator[] besteTrans;
   
    /**
     * Die Codes der besten Translatoren (i.A. nicht in der Standardkodierung).
     */
    private LinkedList<Integer>[] besteTransCodes;
   
    /**
     * Ob der Translator bei der n�chsten Mutation mutiert werden soll.
     */
    private boolean mutT;

    /**
     * Das Mutationsverfahren f�r den Translator.
     */
    private CondMutVerfahren mutArtTrans;
   
    /**
     * Die Zyklen zwischen zwei Translator-Mutationen.
     */
    private long mutTransZyklen;

    /**
     * Die Zyklen seit der letzten Translatormutation.
     */
    private long mutTransAktZyk;
   
    /**
     * Initialisierung �ber vorhandene Automatensequenzen. Die Position wird
     * nicht gesetzt.
     *
     * @param seqs     Die Automatensequenzen, �ber die initialisiert werden
     *                 soll.
     * @param cond     Die zu den Automaten geh�renden Bedingungen.
     * @param elt      Das Elternfenster.
     * @param ident    Die Identifikationsnummer.
     * @param params   Der Parametersatz.
     * @param zufall   Der Zufallsgenerator.
     * @param sel      Ob der Roboter selektiert ist.
     * @param obs      Ein VisMantel-Observer.
     * @param scriInt  Ein Scriptinterpreter.
     * @param trans    Die Translatoren.
     */
    public Roboter(
            final String[] seqs,
            final Condition[] cond,
            final Umgebung elt,
            final int ident,
            final Parametersatz params,
            final Random zufall,
            final boolean sel,
            final VisMantel obs,
            final ScriptInterpreter scriInt,
            final Translator[] trans) {
        this(
                0,
                0,
                0,
                fmg.fmg8.umgebung2D.Konstanten.ROB_AUSDEHNUNG_X,
                fmg.fmg8.umgebung2D.Konstanten.ROB_AUSDEHNUNG_Y,
                elt,
                null,
                null,
                null,
                ident,
                params,
                zufall,
                sel,
                obs,
                scriInt,
                seqs.length,
                trans);
          
           this.erzeugeAusSequenzen(
                   seqs,
                   cond,
                   null,
                   false);
    }

    /**
     * Normaler Konstruktor.
     *
     * @param x          X-Koordinate der Startposition des Roboters.
     * @param y          Y-Koordinate der Startposition des Roboters.
     * @param wink       Winkel der Startposition des Roboters.
     * @param xAusd      X-Wert der Startausdehnung (sollte i.A. auch sp�ter
     *                   nicht ver�ndert werden).
     * @param yAusd      Y-Wert der Startausdehnung (s.o.).
     * @param elt        Das Eltern-Steuerfenster.
     * @param earl       Der Earley-Erkenner.
     * @param mutVerh    Die Mutation f�r Verhaltensautomaten.
     * @param mutTrans   Die Mutation f�r Translatoren.
     * @param ident      Die Identifizierungsnummer.
     * @param params     Der Parametersatz.
     * @param zufall     Der Zufallsgenerator.
     * @param sel        Ob der Roboter zu Beginn selektiert ist.
     * @param obs        Ein VisMantel-Observer.
     * @param scriInt    Der Scriptinterpreter.
     * @param autAnzahl  Die Anzahl der Automaten, die der Roboter besitzt.
     * @param trans      Die Translatoren.
     */
    @SuppressWarnings(value = { "unchecked" })
    public Roboter(
            final double x,
            final double y,
            final double wink,
            final double xAusd,
            final double yAusd,
            final Umgebung elt,
            final EarleyErkenner earl,
            final CondMutVerfahren mutVerh,
            final CondMutVerfahren mutTrans,
            final int ident,
            final Parametersatz params,
            final Random zufall,
            final boolean sel,
            final VisMantel obs,
            final ScriptInterpreter scriInt,
            final int autAnzahl,
            final Translator[] trans) {
        super(x, y, wink, xAusd, yAusd, elt, earl, mutVerh, ident, params,
                zufall, sel, obs, scriInt, autAnzahl);

        this.mutArtTrans = mutTrans;
        this.verhCodes = new LinkedList[autAnzahl];

        if (trans != null) {
            this.translatoren = trans;
        }
       
        this.transCodes = new LinkedList[this.translatoren.length];
        this.besteTrans = new Translator[this.translatoren.length];
        this.besteTransCodes = new LinkedList[this.translatoren.length];
        this.mutT = false;
        this.mutTransAktZyk = 0;
        this.mutTransZyklen = this.getPars().getMutTransZyk();
        this.initAuts(autAnzahl);
    }

    /**
     * Initialisiert alle Variablen, die zu jedem Automaten separat Daten
     * speichern (Arrays) oder von einer �nderung der Automatenanzahl
     * betroffen sein k�nnen.
     *
     * @param anzAuts  Die Anzahl der Automaten.
     */
    @Override
    @SuppressWarnings(value = { "unchecked" })
    protected void initAuts(final int anzAuts) {
        super.initAuts(anzAuts);
        if (this.translatoren == null) {
            this.translatoren = new Translator[anzAuts];
        }
        this.transCodes = new LinkedList[anzAuts];
        this.besteTrans = new Translator[anzAuts];
        this.besteTransCodes = new LinkedList[anzAuts];
        this.verhCodes = new LinkedList[anzAuts];
       
        for (int i = 0; i < anzAuts; i++) {
            this.besteTrans[i] = null;
            this.besteTransCodes[i] = null;
            if (this.translatoren[i] == null) {
                this.translatoren[i] = new Translator(
                      fmg.fmg8.endlAutomat.translator.Konstanten.STD_TRANS_STR,
                      new ScriptInterpreter(
                              this.getPars(),
                              ScriptInterpreter.MODUS_VERHALTEN),
                      this.getPars());
            }
            this.transCodes[i] = this.translatoren[i].erzeugeSequenz();
            this.verhCodes[i] = this.getVAut()[i].erzeugeSequenz();
        }
    }
   

    /**
     * @return Returns the active tAutomat.
     */
    public Translator getAktTAut() {
        return this.translatoren[this.getAktAutNum()];
    }


    /**
     * @return  Ein Array der Stringsequenzen der Translatoren des Roboters.
     */
    public String[] erzStdStrTrans() {
        String[] sequenzen = new String[this.getVAut().length];
       
        for (int i = 0; i < sequenzen.length; i++) {
            sequenzen[i] = this.translatoren[i].erzeugeStringSeq();
        }
       
        return sequenzen;
    }
   
   
    /**
     * @return  Die Translatoren in Standardkodierung.
     */
    public String[] getTransStdCodes() {
        String[] stdString = new String[this.translatoren.length];
       
        for (int i = 0; i < this.translatoren.length; i++) {
            stdString[i] = this.translatoren[i].erzeugeStringSeq();
        }
       
        return stdString;
    }

    /**
     * Erzeugt die Translatoren aus Sequenzen, wobei die �bergebenen
     * Translatoren zugrunde gelegt werden.
     *
     * @param seqs     Die Translatorcodes.
     * @param trans    Die Translatoren (wenn null, wird null weitergegeben).
     * @param pruefen  Ob die �bersetzer gepr�ft werden sollen.
     */
    @SuppressWarnings(value = { "unchecked" })
    public void erzTransAusSeqs(
            final String[] seqs,
            final Translator[] trans,
            final boolean pruefen) {
        this.translatoren = new Translator[seqs.length];
        this.transCodes = new LinkedList[seqs.length];
        Translator[] trans2 = trans;
        String bereinigt;
       
        if (trans2 == null) {
            trans2 = new Translator[seqs.length];
        }
       
        for (int i = 0; i < translatoren.length; i++) {
            if (trans2[i] != null) {
                trans2[i].setModus(SonstMeth.MODUS_TRANSLATOR);
            }
            this.translatoren[i] = new Translator(
                    "",
                    new ScriptInterpreter(
                            this.getPars(),
                            ScriptInterpreter.MODUS_VERHALTEN),
                    this.getPars());
            this.translatoren[i].erzeugeAusSequenz(seqs[i], trans2[i], pruefen);
           
            bereinigt = (new EndlicherAutomat()).bereinige(seqs[i]);
            this.transCodes[i] = SonstMeth.listSeqAusString(bereinigt);
        }
    }
   
    /**
     * L�dt die Automaten mit Translatoren und Bedingungen.
     *
     * @param graphName  Der Name der Datei (mit Pfad nach stdPfad) ohne
     *                   Endung.
     */
    @Override
    public void ladeAuts(final String graphName) {
        String pfad = this.getPars().getStdPfad() + File.separator;
        FileInputStream fs;
        ObjectInputStream is;
        String datRawName = pfad + graphName + ".";
        String[] transSequenzen = null;
        Translator[] trans;

        super.ladeAuts(graphName);
       
        try {
            fs = new FileInputStream(
                    datRawName + fmg.fmg8.graphVis.Konstanten.TRANS_ENDUNG);
            is = new ObjectInputStream(fs);
            transSequenzen = (String[]) is.readObject();
            is.close();
        } catch (final Exception e) {
            SonstMeth.log(SonstMeth.LOG_WARNING,
                    "Translator(en) nicht gefunden: "
                       + datRawName
                       + fmg.fmg8.graphVis.Konstanten.TRANS_ENDUNG,
                    this.getPars());
        }

        if (transSequenzen == null) {
            return;
        }
       
        trans = new Translator[transSequenzen.length];
        for (int i = 0; i < trans.length; i++) {
            trans[i] = fmg.fmg8.endlAutomat.translator.Konstanten.STD_TRANSL_BE;
        }

        // Erzeuge Translatoren.
        for (int i = 0; i < trans.length; i++) {
            trans[i] = fmg.fmg8.endlAutomat.translator.Konstanten.STD_TRANSL_TR;
        }
       
        this.erzTransAusSeqs(transSequenzen, trans, false);
    }

    /**
     * Speichert die Automaten mit Translatoren und Bedingungen.
     *
     * @param graphName  Der Name der Datei (mit Pfad nach stdPfad) ohne
     * Endung.
     */
    @Override
    public void speichereAuts(final String graphName) {
        String pfad = this.getPars().getStdPfad() + File.separator;
        FileOutputStream fs;
        ObjectOutputStream os;

        super.speichereAuts(graphName);
       
        try {
            // Speichere Translatoren
            fs = new FileOutputStream(
                    pfad
                        + graphName
                        + "."
                        + fmg.fmg8.graphVis.Konstanten.TRANS_ENDUNG);
            os = new ObjectOutputStream(fs);
            os.writeObject(this.erzStdStrTrans());
            os.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * @return  Ob der Translator mutiert werden soll.
     */
    public boolean isMutT() {
        return this.mutT;
    }
   
    /**
     * Mutiert den zu <code>this</code> geh�renden aktiven Verhaltens- und /
     * oder Translator-Automaten. Wenn zu einem Automaten kein Translator
     * definiert ist, wird dieser mit dem Standardtranslator f�r Translatoren
     * belegt.
     */
    public void mutiere() {
        int i = this.getAktAutNum();

        if (this.isMutV()) {
            this.getMutVerh().mutiere(this);
            translatoren[i].setModus(SonstMeth.MODUS_VERHALTEN);
            this.getVAut()[i].erzeugeAusSequenz(
                    SonstMeth.stringAusListSeq(this.verhCodes[i]),
                    this.translatoren[i],
                    false);
        }
       
        if (this.isMutT()) {
            this.getMutTrans().mutiere(this);
            translatoren[i].setModus(SonstMeth.MODUS_TRANSLATOR);
            this.translatoren[i].erzeugeAusSequenz(
                    SonstMeth.stringAusListSeq(this.transCodes[i]),
                    this.translatoren[i],
                    false);
        }

        if (this.isSelektiert()) {
            this.getAktVAut().setzeChanged();
            this.getAktVAut().notifyObservers(
                    new AutomatenNummer(
                            this.getAktVAut().erzeugeStringSeq(),
                            this.getAktAutNum()));
           
        }
    }

    /**
     * Geht in den n�chsten Zustand �ber.
     */
    @Override
    public void naechsterZustand() {
        super.naechsterZustand();
        this.mutTransAktZyk++;

        // Mutiere Translator, falls Evolution UND erreichte Zyklenzahl.
        if (this.getPars().getEvol()) {
            if (this.mutTransAktZyk > this.mutTransZyklen) {
                this.mutT = true;
                this.mutiere();
                this.mutTransAktZyk = 0;
                this.mutT = false;
            }
        }
    }

    /**
     * @return  Die Translatoren.
     */
    public Translator[] getTranslatoren() {
        return this.translatoren;
    }

    /**
     * Gibt die Codes der Verhaltensautomaten zur�ck.
     *
     * @return  Die Codes der Verhaltensautomaten.
     */
    public LinkedList<Integer>[] getVerhCodes() {
        return this.verhCodes;
    }

    /**
     * Gibt die Codes der Translatorautomaten zur�ck.
     *
     * @return  Die Codes der Translatorautomaten.
     */
    public LinkedList<Integer>[] getTransCodes() {
        return this.transCodes;
    }

    /**
     * @param vC  Setzt die Verhaltenscodes.
     */
    public void setVerhCodes(final LinkedList<Integer>[] vC) {
        this.verhCodes = vC;
    }

    /**
     * @param tC  Setzt die Translatorcodes.
     */
    public void setTransCodes(final LinkedList<Integer>[] tC) {
        this.transCodes = tC;
    }
   
    /**
     * @param vc  Setzt den aktiven Verhaltenscode.
     */
    public void setAktVCode(final LinkedList<Integer> vc) {
        this.verhCodes[this.getAktAutNum()] = vc;
    }

    /**
     * @param tc  Setzt den aktiven Translatorcode.
     */
    public void setAktTCode(final LinkedList<Integer> tc) {
        this.transCodes[this.getAktAutNum()] = tc;
    }
   
    /**
     * @return Das Mutationsverfahren f�r Verhalten.
     */
    @Deprecated
    public CondMutVerfahren getMut() {
        return super.getMut();
    }
   
    /**
     * @return Das Mutationsverfahren f�r das Roboterverhalten.
     */
    public CondMutVerfahren getMutVerh() {
        return super.getMut();
    }
   
    /**
     * @return Das Mutationsverfahren f�r den Verhaltens�bersetzer.
     */
    public CondMutVerfahren getMutTrans() {
        return this.mutArtTrans;
    }
}
TOP

Related Classes of fmg.fmg8.umgebung2D.Roboter

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.