/*
* Datei: FitnessCollAvoid.java
* Autor(en): Lukas K�nig
* Java-Version: 1.4
* Erstellt (vor): 24.09.2008
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.endlAutomat.fitness;
import fmg.fmg8.umgebung2D.GlobaleVariablen;
import fmg.fmg8.umgebung2D.Roboter;
import fmg.fmg8.umgebung2D.Umgebung;
import fmg.fmg8.umgebung2D.Vektor2D;
/**
* Fitnessberechnung anhand von der Anzahl an Wechseln zwischen den H�lften
* des Spielfeldes.
*
* @author Lukas K�nig
*/
public class FitnessOnlyGate implements FitnessVerfahren {
/**
* �berschreibung des Default-Konstruktors.
*/
public FitnessOnlyGate() {
throw new RuntimeException("Fitness nicht ausgew�hlt.");
}
/**
* Berechnet, in welcher H�lfte des Feldes (links / rechts) sich ein
* Punkt befindet.
*
* @param feld Das Feld.
* @param pkt Die Position des Punktes.
* @return Ob sich der Punkt in der linken H�lfte befindet.
*/
private boolean haelfte(final Umgebung feld,
final Vektor2D pkt) {
return pkt.x < ((double) feld.getFeld().length) / 2.0;
}
/**
* Berechnet den Fitnesssnapshot.
*
* @param rob Der Roboter, dessen Fitness berechnet werden soll.
*
* @return die Fitness.
*/
public int fitness(final Roboter rob) {
// Swap:
int fitSwap;
long aktivSeitLetzt = rob.getAktivZyklen(rob.getAktAutNum());
int faktor = (int) aktivSeitLetzt / 10;
rob.resetAktivZyk(rob.getAktAutNum());
if (rob.getLetztKoord() == null) {
rob.setLetztKoord(new Vektor2D(rob.getPosition()));
}
if (this.haelfte(rob.getUmg(), rob.getLetztKoord())
!= this.haelfte(rob.getUmg(), rob.getPosition())) {
fitSwap = 10;
GlobaleVariablen.setGateCount(GlobaleVariablen.getGateCount() + 1);
} else {
fitSwap = -1;
}
rob.setLetztKoord(new Vektor2D(rob.getPosition()));
return fitSwap * faktor;
}
/**
* Die toString-Methode.
*
* @return Die Ausgabe.
*/
public String toString() {
return "FitnessSwapHalfs";
}
}