public float ComputeFitness(ArrayList genes) { float fitness = 0.0f; Raumfahrer pilot = new Raumfahrer(genes); Raumschiff raumschiff = new Raumschiff(pilot, startHoehe, startTreibstoff, raumschiffGewicht, nutzeRaumfahrerGewicht); int schub = 0; while (raumschiff.Hoehe > 0) { schub = pilot.SteuereRaumschiff(raumschiff); raumschiff.SimuliereRunde(); if (SimulationTurn != null) SimulationTurn(this, new MondlandungsSimulationEventArgs(raumschiff, schub)); } /*if (SimulationTurn != null) SimulationTurn(this, new MondlandungsSimulationEventArgs(raumschiff, schub));*/ // Convert.ToInt32(Math.Sqrt((raumschiff.Hoehe * raumschiff.Hoehe))) + /*int toleranz = Convert.ToInt32(Math.Sqrt((raumschiff.Geschwindigkeit * raumschiff.Geschwindigkeit))) - 5; if (toleranz < 0) toleranz = 0;*/ //fitness = ((1000 + raumschiff.Geschwindigkeit) / 1000.0f * 0.9f) + (raumschiff.Treibstoff / (float) startTreibstoff * 0.1f); //fitness = 0.7f / (1.0f + toleranz/10) + (raumschiff.Treibstoff / (float)startTreibstoff * 0.3f); //fitness = 0.6f * Convert.ToInt32(Math.Pow(1.01, -toleranz)) + (raumschiff.Treibstoff / (float)startTreibstoff * 0.4f); fitness = 0.7f * Convert.ToSingle(Math.Pow(1.02f, raumschiff.Geschwindigkeit)) + (raumschiff.Treibstoff / (float)startTreibstoff * 0.3f); //fitness = 1 / (1.0f - raumschiff.Geschwindigkeit/10.0f); return fitness; }
/// <summary> /// Konstruktor des Raumschiffs /// </summary> /// <param name="pilot">Pilot, der das Raumschiff steuern soll</param> /// <param name="startHoehe">Die Starthöhe des Raumschiffs</param> /// <param name="startTreibstoff">Der Starttreibstoff des Raumschiffs</param> /// <param name="startGewicht">Das Startgewicht des Raumschiffs</param> /// <param name="nutzeRaumfahrerGewicht">Gibt an, ob das Gewicht des Raumfahrers mit einberechnet werden soll</param> public Raumschiff(Raumfahrer pilot, int startHoehe, int startTreibstoff, int startGewicht, bool nutzeRaumfahrerGewicht) { this.pilot = pilot; this.hoehe = startHoehe; this.treibstoff = startTreibstoff; this.gewicht = startGewicht; this.geschwindigkeit = 0; this.nutzeRaumfahrerGewicht = nutzeRaumfahrerGewicht; }
// Methode nur für Unit Tests public float TestComputeFitness(ArrayList genes) { float fitness = 0.0f; Raumfahrer pilot = new Raumfahrer(genes); foreach (IntGene gene in genes) { fitness += gene; } return fitness; }
public void TestRaumschiff() { ArrayList kommandos = new ArrayList(0); Raumfahrer pilot = new Raumfahrer(kommandos); Raumschiff schiff = new Raumschiff(pilot, 100, 100, 100, true); Assert.AreEqual(100, schiff.Treibstoff); Assert.AreEqual(100, schiff.Hoehe); Assert.AreEqual(100, schiff.Gewicht); }
public void TestRaumfahrer() { ArrayList kommandos = new ArrayList(10); for (int i = 0; i < 10; i++) kommandos.Add(new IntGene(1)); Raumfahrer pilot = new Raumfahrer(kommandos); Assert.AreEqual(10, pilot.Gewicht); Raumschiff schiff = new Raumschiff(pilot, 100, 100, 1, true); pilot.SteuereRaumschiff(schiff); Assert.AreEqual(100-1, schiff.Treibstoff); Assert.AreEqual(1, schiff.Geschwindigkeit); pilot.SteuereRaumschiff(schiff); Assert.AreEqual(100 - 2, schiff.Treibstoff); Assert.AreEqual(2, schiff.Geschwindigkeit); }