/*
* Datei: FitnessCollAvoid.java
* Autor(en): Lukas K�nig
* Java-Version: 1.4
* Erstellt (vor): 09.04.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 sowie Kollision Avoidance.
*
* @author Lukas K�nig
*/
public class FitnessSwapHalfs implements FitnessVerfahren {
/**
* �berschreibung des Default-Konstruktors.
*/
public FitnessSwapHalfs() {
}
/**
* 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) {
// Kollisionen
int fitKoll = (int) ((double) rob.getAnzUnfaelle()
* rob.getPars().getAbzugUnfall().doubleValue());
rob.resetAnzUnf();
// Aus Collision avoidance (nur MOVE-Teil):
int bef0 = ((Integer) rob.getBefehle().get(0)).intValue();
String befehl0 = fmg.fmg8.umgebung2D.Konstanten.BEF[bef0].toUpperCase();
int fitCollAvoid = 1;
if (!befehl0.equals("MOV")) {
fitCollAvoid--;
}
// Swap:
int fitSwap;
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 = 0;
}
rob.setLetztKoord(new Vektor2D(rob.getPosition()));
return fitSwap + fitCollAvoid - fitKoll;
}
/**
* Die toString-Methode.
*
* @return Die Ausgabe.
*/
public String toString() {
return "FitnessSwapHalfsWithCollisionAvoidance";
}
}