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); }