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;
        }
예제 #2
0
 /// <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);
        }