/// <summary>
 /// Weist dem Raumfahrer ein Raumschiff zu und lässt es ihn steuern.
 /// </summary>
 /// <param name="raumschiff">Das zuzuweisende Raumschiff</param>
 /// <returns>Ausgeführtes Kommando, also Schubkraft</returns>
 public int SteuereRaumschiff(Raumschiff raumschiff)
 {
     int schub = raumschiff.Beschleunigen(kommandoListe[naechstesKommando] as IntGene);
     if (++naechstesKommando == kommandoListe.Count)
         naechstesKommando = 0;
     return schub;
 }
        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;
        }
        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);
        }
 public MondlandungsSimulationEventArgs(Raumschiff raumschiff, int schub)
 {
     this.raumschiff = raumschiff;
     this.schub = schub;
 }