int anzRobs;
int aktName;
int[] fitness;
Condition zCond;
Integer kn1, kn2;
Knoten zwischKnoten;
boolean vorhandenAll;
Iterator<Integer> it;
Iterator<Integer> it1;
Iterator<Integer> it2;
Roboter aktRob = null;
EndlicherAutomat[] kind;
ArrayList<Integer> zustaende;
RobCode[] robC = new RobCode[1];
Knoten[] knotList = new Knoten[rob.length];
Condition[] condListe = new Condition[rob.length];
ArrayList<Long> vert = new ArrayList<Long>(rob.length);
if (rob.length <= 0 || rob[0] == null) {
SonstMeth.log(SonstMeth.LOG_ERROR,
"Kein Roboter zum Rekombinieren �bergeben ("
+ this + ")",
this.pars);
}
id = rob[0].getId();
kind = new EndlicherAutomat[rob[0].vAuts().length];
/*
* Ersetzt alle Vorkommnisse von <code>null</code> im Array rob durch
* g�ltige im Array weiter vorne stehende Roboter. Dabei wird die
* Liste der Roboter VOR dem ersten Vorkommnis von <code>null</code>
* immer wieder �ber das Array gelegt und die null-Werte werden
* �berschrieben:
*
* [1 3 null null null null] => [1 3 1 3 1 3].
*
* Wenn nach dem ersten Vorkommnis von <code>null</code> ein g�ltiger
* Roboter vorkommt (dies ist allerdings kein erw�nschter Fall), dann
* wird er im Array belassen.
*/
anzRobs = -1;
for (int i = 0; i < rob.length; i++) {
if (rob[i] == null) {
if (anzRobs < 0) {
anzRobs = i;
}
rob[i] = rob[i % anzRobs];
}
}
fitness = new int[rob[0].vAuts().length];
for (int i = 0; i < rob[0].vAuts().length; i++) {
vert.clear();
// Erzeuge Wahrscheinlichkeitsverteilung fitnessproportional.
for (int j = 0; j < rob.length; j++) {
if (rob[j].getFitness()[i] > 0) {
vert.add(new Long(rob[j].getFitness()[i]));
} else {
vert.add(new Long(0));
}
}
aktRob = (Roboter) MathMeth.randVerteilung(rob, vert, this.rand);
zustaende = aktRob.vAuts()[i].getKnList();
fitness[i] = aktRob.getFitness()[i];
kind[i] = new EndlicherAutomat();
vorhandenAll = true;
// Zust�nde einf�gen.
it = zustaende.iterator();
while (it.hasNext()) {
aktName = it.next();
for (int j = 0; j < rob.length; j++) {
zwischKnoten = rob[j].vAuts()[i].holeKnoten(aktName);
if (zwischKnoten != null) {
knotList[j] = zwischKnoten;
} else {
vorhandenAll = false;
break;
}
}
if (vorhandenAll) {
zwischKnoten = (Knoten) MathMeth.randVerteilung(knotList,
vert,
this.rand);
} else {
zwischKnoten = aktRob.vAuts()[i].holeKnoten(aktName);
}
aktion = ((ZInfo) zwischKnoten.getInfo()).getAktion();
param = ((ZInfo) zwischKnoten.getInfo()).getParam();
alt = ((ZInfo) zwischKnoten.getInfo()).getAlter();
kind[i].einfuegenKnoten(aktName, aktion, param, alt);
}
kind[i].setStartBeliebig(); // Setze auf ersten vorh. Knoten.