Condition zCond;
int aktion;
int param;
int alt;
boolean istStart;
Roboter aktRob;
Condition[] condListe = new Condition[rob.length];
int j = -1;
/*
* 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 kein erw�nschter Fall), dann wird er
* im Array belassen.
*/
for (int i = 0; i < rob.length; i++) {
if (rob[i] == null) {
if (j < 0) {
j = i;
}
rob[i] = rob[i % j];
}
}
for (int i = 0; i < rob.length; i++) {
if (rob[i].getFitness()[0] > 0) {
vert.add(new Long(rob[i].getFitness()[0]));
} else {
vert.add(new Long(0));
}
}
aktRob = (Roboter) MathMeth.randVerteilung(rob, vert, this.rand);
zustaende = aktRob.vAuts()[0].getKnList();
fitness = aktRob.getFitness()[0];
vorhandenAll = true;
it = zustaende.iterator();
while (it.hasNext()) {
aktName = (Integer) it.next();
for (int i = 0; i < rob.length; i++) {
zwischKnoten = rob[i].vAuts()[0].holeKnoten(aktName);
if (zwischKnoten != null) {
knotenListe[i] = zwischKnoten;
} else {
vorhandenAll = false;
break;
}
}
if (vorhandenAll) {
zKnoten = (Knoten) MathMeth.randVerteilung(knotenListe,
vert,
this.rand);
} else {
zKnoten = aktRob.vAuts()[0].holeKnoten(aktName);
}
aktion = ((ZInfo) zKnoten.getInfo()).getAktion();
param = ((ZInfo) zKnoten.getInfo()).getParam();
alt = ((ZInfo) zKnoten.getInfo()).getAlter();
istStart = ((ZInfo) zKnoten.getInfo()).istStartZ();
kind.einfuegenKnoten(aktName, aktion, param, alt);
if (istStart) {
kind.setStart(kind.holeKnoten(aktName));
}
}
it1 = zustaende.iterator();
while (it1.hasNext()) {
kn1 = (Integer) it1.next();
it2 = zustaende.iterator();
while (it2.hasNext()) {
kn2 = (Integer) it2.next();
vorhandenAll = true;
if (aktRob.vAuts()[0].kanteExistiert(kn1, kn2)) {
for (int i = 0; i < rob.length; i++) {
if (rob[i].vAuts()[0].kanteExistiert(kn1, kn2)) {
condListe[i] = rob[i].vAuts()[0].getCondZuTrans(kn1,
kn2);
} else {
vorhandenAll = false;
break;
}
}
if (vorhandenAll) {
zCond = (Condition) MathMeth.randVerteilung(condListe,
vert,
this.rand);
} else {
zCond = aktRob.vAuts()[0].getCondZuTrans(kn1, kn2);
}
kind.einfuegKante(kn1, kn2, zCond, 1);
}
}
}
/*
* TODO: Alter der Knoten UND Kanten.
*/
int[] fits = new int[1];
String[] codes = new String[1];
fits[0] = (int) fitness;
codes[0] = kind.erzeugeStringSeq();
robC[0] = new RobCode(
id,
fits,
codes,
aktRob.getConds(),
aktRob.getTransStdCodes(),
SonstMeth.stringAusListSeqs(aktRob.getTransCodes()),
SonstMeth.stringAusListSeqs(aktRob.getVerhCodes()));
return robC;
}