/*
* 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;
}
}