public static void Main(string[] args) { GeneticSimulation environment = new GeneticSimulation(); environment.RunEvolution(); Console.ReadKey(); }
public void TestGeneticSimulation() { simulation = new GeneticSimulation <BoolGene>(100, 5, new BoolGrowthLimitedFitness(), new AsymmetricCrossoverRecombinator(), new AlphaSelector(), new PieCakeSelector()); //simulation.GeneDuplicationRate = 0.00001; simulation.SimulationTurn += new OnSimulationTurn(TestDelegate); simulation.RunSimulation(); Assert.IsTrue(delegateRun); delegateRunCount = 0; simulation.RunSimulation(1000); Assert.AreEqual(1000, delegateRunCount, "Did not run 1000 times!"); /* Assert.AreEqual(5.0, simulation.AverageFitness, 0.5, "This may occur, rerun Test and see if it keeps happening!"); * Assert.AreEqual(5.0, simulation.MostSuccessfullIndividual.Fitness, "This may occur, rerun Test and see if it keeps happening!");*/ simulation.ResetSimulation(); delegateRunCount = 0; delegateRun = false; simulation.GeneDuplicationRate = 0.01; simulation.RunSimulation(); Assert.IsTrue(delegateRun); delegateRunCount = 0; simulation.RunSimulation(10); /* Assert.AreEqual(10, delegateRunCount, "Did not run 10 times!"); * Assert.IsTrue(simulation.AverageChromosomeLength > 5, "Average Chromosome Lengtrh not > 5"); */ }
public void Simple() { var sim = new GeneticSimulation <double[]>( org => 1 / (Math.Abs(10 - org.Genome.Sum()) + .01d), CommonGeneticFunctions.CreateSpawningCycleArray(new SampleOrg[] { new SampleOrg(new double[] { 1, 2, 3, 0 }), new SampleOrg(new double[] { 0, 1, 2 }), new SampleOrg(new double[] { 1, 0, 1 }), }), 100); //var evolved = new List<SampleOrg>(); //for (int simCount = 0; simCount < 1000; simCount ++) //{ // evolved = sim.Evolve().Cast<SampleOrg>().ToList(); //} var evolved = sim.Evolve(15); var finalSums = evolved.Select(o => o.Genome.Sum()).ToArray(); }
/// <summary> /// Reset the simulation results /// </summary> /// <param name="sender">Sender Object</param> /// <param name="e">Event Object</param> private void btn_Zuruecksetzten_Click(object sender, EventArgs e) { avgLengthList.Clear(); avgVariationList.Clear(); avgFitnessList.Clear(); maxFitnessList.Clear(); minFitnessList.Clear(); GenSim = null; MoonSim = null; turn = 0; cmb_Selector.Enabled = true; cmb_Recombinator.Enabled = true; txt_ChromosomeLength.Enabled = true; txt_Weight.Enabled = true; txt_Height.Enabled = true; txt_Engine.Enabled = true; txt_MutationsRate.Enabled = true; txt_LossRate.Enabled = true; txt_DuplicationsRate.Enabled = true; dgv_Population.Rows.Clear(); btn_Play.Enabled = false; lbl_SpeedValue.Text = "0"; lbl_HeightValue.Text = "0"; lbl_ThrustValue.Text = "0"; lbl_TankValue.Text = "0"; chk_AVGFitness.Checked = true; chk_maxFitness.Checked = false; chk_minFitness.Checked = false; chk_Length.Checked = false; chk_Live.Checked = false; zgc_Simulationsgraph.GraphPane.GraphObjList.Clear(); zgc_Simulationsgraph.AxisChange(); zgc_Simulationsgraph.Invalidate(); drawClearBackground(); GraphPane p = zgc_Simulationsgraph.GraphPane; zgc_Simulationsgraph.ZoomOutAll(p); p.YAxisList[1].Scale.Max = 10; p.YAxisList[1].Scale.MaxAuto = true; }
/// <summary> /// Simulationsergebnisse zurücksetzen /// </summary> /// <param name="sender">aufrufendes Objekt</param> /// <param name="e">EreignisObjekt</param> private void btn_Zuruecksetzten_Click(object sender, EventArgs e) { avgLengthList.Clear(); avgVariationList.Clear(); avgFitnessList.Clear(); maxFitnessList.Clear(); minFitnessList.Clear(); GenSim = null; MondSim = null; turn = 0; cmb_Selektor.Enabled = true; cmb_Rekombinator.Enabled = true; txt_Chromosomlaenge.Enabled = true; txt_Gewicht.Enabled = true; txt_Hoehe.Enabled = true; txt_Treibstoff.Enabled = true; txt_Mutationsrate.Enabled = true; txt_Verlustrate.Enabled = true; txt_Duplikationsrate.Enabled = true; dgv_Population.Rows.Clear(); btn_Abspielen.Enabled = false; lbl_AktGeschwindigkeit.Text = "0"; lbl_AktHoehe.Text = "0"; lbl_AktSchub.Text = "0"; lbl_AktTank.Text = "0"; chk_AVGFitness.Checked = true; chk_maxFitness.Checked = false; chk_minFitness.Checked = false; chk_Laenge.Checked = false; chk_Live.Checked = false; zgc_Simulationsgraph.GraphPane.GraphObjList.Clear(); zgc_Simulationsgraph.AxisChange(); zgc_Simulationsgraph.Invalidate(); drawClearBackground(); GraphPane p = zgc_Simulationsgraph.GraphPane; zgc_Simulationsgraph.ZoomOutAll(p); p.YAxisList[1].Scale.Max = 10; p.YAxisList[1].Scale.MaxAuto = true; }
/// <summary> /// Simulation starten /// </summary> /// <param name="sender">aufrufendes Objekt</param> /// <param name="e">EreignisObjekt</param> private void btn_Simuliere_Click(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; btn_Simuliere.Enabled = false; btn_Zuruecksetzen.Enabled = false; btn_AutoSim.Enabled = false; btn_SimAbbrechen.Focus(); //erster Durchlauf der Simulation if (GenSim == null) { btn_Abspielen.Enabled = true; txt_Chromosomlaenge.Enabled = false; cmb_Rekombinator.Enabled = false; cmb_Selektor.Enabled = false; txt_Gewicht.Enabled = false; txt_Hoehe.Enabled = false; txt_Treibstoff.Enabled = false; txt_Mutationsrate.Enabled = false; txt_Verlustrate.Enabled = false; txt_Duplikationsrate.Enabled = false; IntGene.MaxValue = Convert.ToInt32(txt_Treibstoff.Text); MondSim = new MondlandungsSimulation(Convert.ToInt32(txt_Hoehe.Text), Convert.ToInt32(txt_Treibstoff.Text), Convert.ToInt32(txt_Gewicht.Text), tsmi_RaumfahrerGewicht.Checked); GenSim = new GeneticSimulation<IntGene>(100, Convert.ToInt32(txt_Chromosomlaenge.Text), MondSim, recombinationProvider, selectionProvider); GenSim.SimulationTurn += OnSimulationTurn; GenSim.GeneMutationRate = Convert.ToDouble(txt_Mutationsrate.Text); GenSim.GeneDuplicationRate = Convert.ToDouble(txt_Duplikationsrate.Text); GenSim.GeneDropRate = Convert.ToDouble(txt_Verlustrate.Text); } //automatisierte Simulation bis Erreichen der Delta-Fitness if (sender == btn_AutoSim) { btn_SimAbbrechen.Focus(); float fitnessGrenze = Convert.ToSingle(txt_Fitness.Text); float startFitness = GenSim.AverageFitness; while (fitnessGrenze + startFitness > GenSim.AverageFitness && !simulationAbbrechen) { Application.DoEvents(); GenSim.RunSimulation(); } simulationAbbrechen = false; btn_Simuliere.Enabled = true; btn_Zuruecksetzen.Enabled = true; btn_AutoSim.Enabled = true; } //einfache Simulation mit angegebener Rundenzahl else GenSim.RunSimulation(Convert.ToInt32(txt_Rundenazahl.Text)); if (!closingApplication) { dgv_Population.Rows.Clear(); dgv_Population.Rows.Add(GenSim.PoppulationSize); for (int i = 0; i < GenSim.PoppulationSize; i++) { dgv_Population.Rows[i].Cells[0].Value = GenSim[i].GeneCount.ToString(); dgv_Population.Rows[i].Cells[1].Value = GenSim[i].ToString(); dgv_Population.Rows[i].Cells[2].Value = GenSim[i].Fitness.ToString(); dgv_Population.Rows[i].Tag = GenSim[i]; } zgc_Simulationsgraph.AxisChange(); zgc_Simulationsgraph.Invalidate(); Cursor = Cursors.Default; btn_Simuliere.Enabled = true; btn_Zuruecksetzen.Enabled = true; btn_AutoSim.Enabled = true; } }
public void TestGeneticSimulation() { simulation = new GeneticSimulation<BoolGene>(100, 5, new BoolGrowthLimitedFitness(), new AsymmetricCrossoverRecombinator(), new AlphaSelector() ,new PieCakeSelector()); //simulation.GeneDuplicationRate = 0.00001; simulation.SimulationTurn += new OnSimulationTurn(TestDelegate); simulation.RunSimulation(); Assert.IsTrue(delegateRun); delegateRunCount = 0; simulation.RunSimulation(1000); Assert.AreEqual(1000, delegateRunCount, "Did not run 1000 times!"); /* Assert.AreEqual(5.0, simulation.AverageFitness, 0.5, "This may occur, rerun Test and see if it keeps happening!"); Assert.AreEqual(5.0, simulation.MostSuccessfullIndividual.Fitness, "This may occur, rerun Test and see if it keeps happening!");*/ simulation.ResetSimulation(); delegateRunCount = 0; delegateRun = false; simulation.GeneDuplicationRate = 0.01; simulation.RunSimulation(); Assert.IsTrue(delegateRun); delegateRunCount = 0; simulation.RunSimulation(10); /* Assert.AreEqual(10, delegateRunCount, "Did not run 10 times!"); Assert.IsTrue(simulation.AverageChromosomeLength > 5, "Average Chromosome Lengtrh not > 5"); */ }
public void Sin() { var rand = new Random(); var net = NeuralNetBuilder.From(new NeuralNetConfig() { InputLabels = new string[] { "x" }, OutputLabels = new string[] { "y" }, HiddenLayerCount = 3, HiddenLayerNeuronCount = 3, //PreActivationFunction = (i, d) => ActivationFunction = d => d > .5 ? 1 : 0 //ActivationFunction = d => 1 / (1 + Math.Pow(Math.E, -d)) }); var trainingData = new List <Tuple <double, double> >(); for (double i = 0; i < Math.PI * 2; i += .1) { var input = i; var output = Math.Sin(i); //var normalizedOutput = output / Math.PI * 2; var normalizedOutput = .5 * (output + 1); var normalizedInput = input / (Math.PI * 2); trainingData.Add(new Tuple <double, double>(normalizedInput, normalizedOutput)); } var weightCount = net.WeightCount; var biasCount = net.BiasCount; var weightOrgSpawner = new SpawnFunction <double[]>(index => { var data = new double[weightCount + biasCount]; for (int i = 0; i < weightCount + biasCount; i++) { var scale = i >= weightCount ? 1 : 1; data[i] = (rand.NextDouble()) * scale; } return(new Org(data)); }); var fitnessFunction = new FitnessFunction <double[]>(org => { net.InitializeWeights(org.Genome.Take(weightCount).ToArray()); net.InitializeBiases(org.Genome.Skip(weightCount).ToArray()); var errorSum = trainingData.Select(trainingElement => { var input = trainingElement.Item1; var expectedOutput = trainingElement.Item2; var actualOutput = net.Compute(new NamedValue[] { new NamedValue() { Name = "x", Value = input } }); var error = expectedOutput - actualOutput[0].Value; var convertedError = Math.Pow((Math.Abs(error) + 1), 2); return(convertedError); }).Sum(); //Trace.WriteLine(errorSum); return(1 / errorSum); }); var geneticSim = new GeneticSimulation <double[]>(fitnessFunction, weightOrgSpawner, 50); var bestSet = geneticSim.Evolve(20000, false); var theBest = geneticSim.GetBest(); net.InitializeWeights(theBest.Genome.Take(weightCount).ToArray()); net.InitializeBiases(theBest.Genome.Skip(weightCount).ToArray()); Trace.WriteLine("OUTPUT"); trainingData.ForEach(t => { var input = t.Item1; var expectedOutput = t.Item2; var actualOutput = net.Compute(new NamedValue[] { new NamedValue() { Name = "x", Value = input } }); var error = expectedOutput - actualOutput[0].Value; //Trace.WriteLine($"INPUT:{input} EXPECT:{expectedOutput} REAL:{actualOutput[0].Value} ERR:{error}"); //Trace.WriteLine($"{input},{expectedOutput},{actualOutput[0].Value}"); Trace.WriteLine($"{actualOutput[0].Value}"); }); }
/// <summary> /// Simulation start /// </summary> /// <param name="sender">Sender Object</param> /// <param name="e">Event Object</param> private void btn_Simuliere_Click(object sender, EventArgs e) { Cursor = Cursors.WaitCursor; btn_Simulate.Enabled = false; btn_Reset.Enabled = false; btn_AutoSim.Enabled = false; btn_SimAbort.Focus(); //erster Durchlauf der Simulation if (GenSim == null) { btn_Play.Enabled = true; txt_ChromosomeLength.Enabled = false; cmb_Recombinator.Enabled = false; cmb_Selector.Enabled = false; txt_Weight.Enabled = false; txt_Height.Enabled = false; txt_Engine.Enabled = false; txt_MutationsRate.Enabled = false; txt_LossRate.Enabled = false; txt_DuplicationsRate.Enabled = false; IntGene.MaxValue = Convert.ToInt32(txt_Engine.Text); MoonSim = new MondlandungsSimulation(Convert.ToInt32(txt_Height.Text), Convert.ToInt32(txt_Engine.Text), Convert.ToInt32(txt_Weight.Text), tsmi_SpacemanHeight.Checked); GenSim = new GeneticSimulation <IntGene>(100, Convert.ToInt32(txt_ChromosomeLength.Text), MoonSim, recombinationProvider, selectionProvider); GenSim.SimulationTurn += OnSimulationTurn; GenSim.GeneMutationRate = Convert.ToDouble(txt_MutationsRate.Text); GenSim.GeneDuplicationRate = Convert.ToDouble(txt_DuplicationsRate.Text); GenSim.GeneDropRate = Convert.ToDouble(txt_LossRate.Text); } //automatisierte Simulation bis Erreichen der Delta-Fitness if (sender == btn_AutoSim) { btn_SimAbort.Focus(); float fitnessGrenze = Convert.ToSingle(txt_Fitness.Text); float startFitness = GenSim.AverageFitness; while (fitnessGrenze + startFitness > GenSim.AverageFitness && !simulationAbort) { Application.DoEvents(); GenSim.RunSimulation(); } simulationAbort = false; btn_Simulate.Enabled = true; btn_Reset.Enabled = true; btn_AutoSim.Enabled = true; } //einfache Simulation mit angegebener Rundenzahl else { GenSim.RunSimulation(Convert.ToInt32(txt_RoundNumber.Text)); } if (!closingApplication) { dgv_Population.Rows.Clear(); dgv_Population.Rows.Add(GenSim.PoppulationSize); for (int i = 0; i < GenSim.PoppulationSize; i++) { dgv_Population.Rows[i].Cells[0].Value = GenSim[i].GeneCount.ToString(); dgv_Population.Rows[i].Cells[1].Value = GenSim[i].ToString(); dgv_Population.Rows[i].Cells[2].Value = GenSim[i].Fitness.ToString(); dgv_Population.Rows[i].Tag = GenSim[i]; } zgc_Simulationsgraph.AxisChange(); zgc_Simulationsgraph.Invalidate(); Cursor = Cursors.Default; btn_Simulate.Enabled = true; btn_Reset.Enabled = true; btn_AutoSim.Enabled = true; } }