/*
* Datei: PopSnapshot.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Erstellt (vor): 01.04.2008
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.statistik;
import java.awt.Point;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import fmg.fmg8.umgebung2D.Roboter;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
* Serialisierbare Klasse zur Beschreibung eines Populationsschnappschusses.
*
* @author Lukas K�nig
*/
public class PopSnapshot implements Serializable {
/**
* Die Versions-ID vom 01.04.2008.
*/
private static final long serialVersionUID = 7723890308243806530L;
/**
* Liste von Roboterschnappsch�ssen.
*/
private RobSnapshot[] robSchnapp;
/**
* Die Verschiebungen der Gegenst�nde.
*/
private Vektor2D[] verschiebungen;
/**
* Identifikationsnummer des Schnappschusses. F�r Schnappsch�sse A, B zu
* den Zeitpunkten tA, tB MUSS immer gelten:
*
* - tA < tB => A.id < B.id und
* - A != B => A.id != B.id.
*/
private long id;
/**
* Die dynamischen Pixellisten.
*/
private LinkedList<Point> aktDynPixel;
/**
* Der Konstruktor erzeugt Roboterschnappsch�sse f�r alle Roboter der
* Liste.
*
* @param roboter Liste von Robotern, von denen ein
* Schnappschuss gespeichert werden soll.
* @param ggstVerschbgn Die Verschiebungen der Gegenst�nde.
* @param ident Identifikationsnummer des
* Populationsschnappschusses.
* Bitte Kommentar zu Attribut beachten!
* @param autSp Ob die Automaten gespeichert werden sollen.
* @param dynPixel Die aktuellen Pixel aller vorhandenen dynamischen
* W�nde.
*/
public PopSnapshot(final List<Roboter> roboter,
final List<Vektor2D> ggstVerschbgn,
final long ident,
final boolean autSp,
final ArrayList<LinkedList<Point>> dynPixel) {
Roboter aktRob;
Vektor2D aktVersch;
Iterator<Roboter> it1 = roboter.iterator();
Iterator<Vektor2D> it2 = ggstVerschbgn.iterator();
this.id = ident;
this.aktDynPixel = this.kopiere(dynPixel);
this.verschiebungen = new Vektor2D[ggstVerschbgn.size()];
this.robSchnapp = new RobSnapshot[roboter.size()];
int i = 0;
while (it1.hasNext()) {
aktRob = it1.next();
this.robSchnapp[i] = new RobSnapshot(aktRob, autSp);
i++;
}
i = 0;
while (it2.hasNext()) {
aktVersch = it2.next();
this.verschiebungen[i] = new Vektor2D(aktVersch);
i++;
}
}
/**
* @param listen Pixellisten.
*
* @return Eine Kopie der Pixellisten.
*/
private LinkedList<Point> kopiere(
final ArrayList<LinkedList<Point>> listen) {
LinkedList<Point> kopie = new LinkedList<Point>();
for (LinkedList<Point> liste : listen) {
if (liste != null) {
for (Point p : liste) {
kopie.add(p);
}
}
}
return kopie;
}
// /**
// * Speichert die dynamischen Wand-Pixel.
// *
// * @param pixelListen Die Pixellisten.
// * @param params Die Parameter.
// */
// private void dynPixSpeichern(
// final ArrayList<LinkedList<Point>> pixelListen,
// final Parametersatz params) {
// LinkedList<String> s = new LinkedList<String>();
//
// for (LinkedList<Point> liste : pixelListen) {
// if (liste != null) {
// for (Point p : liste) {
// s.add("" + p.x + "/" + p.y + " ");
// }
// }
// }
//
// SonstMeth.speichereTextAusArray(
// params.getStdPfad(),
// Konstanten.DAT_NAM_DYN + this.id + Konstanten.DAT_END_DYN,
// s,
// params);
// }
/**
* @return Returns the robSchnapp.
*/
public RobSnapshot[] getRobSchnapp() {
return this.robSchnapp;
}
/**
* @return Returns the id.
*/
public long getId() {
return this.id;
}
/**
* Die toString-Methode.
*
* @return Ausgabe des Objekts.
*/
public String toString() {
String s = "";
s = s + "Populations-Snapshot Nummer: " + this.id + "\n";
s = s + "============================";
for (int i = 0; i < this.robSchnapp.length; i++) {
s = s + this.robSchnapp[i] + "\n";
}
s = s + "\nVerschiebungen:";
if (this.verschiebungen != null) {
for (int i = 0; i < this.verschiebungen.length; i++) {
s = s + " " + this.verschiebungen[i];
}
}
return s;
}
/**
* Gibt die Summe der Fitnesswerte aller Robotersnapshots dieses
* Populationssnapshots zur�ck.
*
* @return Die Summe der Fitnesswerte.
*/
public long getFitSum() {
long sum = 0;
for (int i = 0; i < this.robSchnapp.length; i++) {
for (int j = 0; j < this.robSchnapp[i].getFitness().length; j++) {
sum += this.robSchnapp[i].getFitness()[j];
}
}
return sum;
}
/**
* @return Returns the verschiebungen.
*/
public Vektor2D[] getVerschiebungen() {
return this.verschiebungen;
}
/**
* @return Returns the aktDynPixel.
*/
public LinkedList<Point> getAktDynPixel() {
return aktDynPixel;
}
}