private void BrainNEAT_Click(object sender, RoutedEventArgs e) { try { if (_experiment == null || _ea == null) { //NOTE: Just doing this for laziness. I don't want to write a bunch of logic to train a phenome up front MessageBox.Show("Need to have a running experiment", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning); return; } // Get a genome NeatGenome genome = _ea.CurrentChampGenome; // Create a phenome IBlackBox phenome = ExperimentNEATBase.GetBlackBox(genome, _experimentArgs.Activation, _hyperneatArgs); // Instantiate a BrainNEAT EditorOptions options = new EditorOptions(); ItemOptions itemOptions = new ItemOptions(); Container energy = new Container() { QuantityMax = 1000, QuantityCurrent = 1000, }; BrainNEATDNA dnaBrain = new BrainNEATDNA() { PartType = BrainNEAT.PARTTYPE, Position = new Point3D(0, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(1, 1, 1) }; BrainNEAT brain = new BrainNEAT(options, itemOptions, dnaBrain, energy); brain.SetPhenome(phenome, genome, _experimentArgs.Activation, _hyperneatArgs); for (int cntr = 0; cntr < 100; cntr++) { foreach (INeuron neuron in brain.Neruons_Writeonly) { neuron.SetValue(StaticRandom.NextDouble(-2.5, 2.5)); } brain.Update_AnyThread(1); } #region save/load test2 // let BrainNEAT do the save/load BrainNEATDNA dna2 = (BrainNEATDNA)brain.GetNewDNA(); string dna2Text = XamlServices.Save(dna2).Replace('"', '\''); BrainNEAT brain2 = new BrainNEAT(options, itemOptions, dna2, energy); for (int cntr = 0; cntr < 100; cntr++) { foreach (INeuron neuron in brain2.Neruons_Writeonly) { neuron.SetValue(StaticRandom.NextDouble(-2.5, 2.5)); } brain2.Update_AnyThread(1); } BrainNEATDNA dna3 = (BrainNEATDNA)brain2.GetNewDNA(); BrainNEAT brain3 = new BrainNEAT(options, itemOptions, dna3, energy); for (int cntr = 0; cntr < 100; cntr++) { foreach (INeuron neuron in brain3.Neruons_Writeonly) { neuron.SetValue(StaticRandom.NextDouble(-2.5, 2.5)); } brain3.Update_AnyThread(1); } #endregion #region save/load test1 // initial test, building minimum necessary dna BrainNEATDNA brainDNA = new BrainNEATDNA() { Activation = _experimentArgs.Activation, Hyper = _hyperneatArgs, NEATPositions_Input = brain.Neruons_Readonly.Select(o => o.Position).ToArray(), NEATPositions_Output = brain.Neruons_Writeonly.Select(o => o.Position).ToArray(), Genome = ExperimentNEATBase.SavePopulation(new[] { genome }), }; // Make sure this can be serialized/deserialized string testString = XamlServices.Save(brainDNA); brainDNA = UtilityCore.Clone(brainDNA); List <NeatGenome> genomeList = null; if (_hyperneatArgs == null) { genomeList = ExperimentNEATBase.LoadPopulation(brainDNA.Genome, brainDNA.Activation, brainDNA.NEATPositions_Input.Length, brainDNA.NEATPositions_Output.Length); } else { genomeList = ExperimentNEATBase.LoadPopulation(brainDNA.Genome, brainDNA.Activation, _hyperneatArgs); } #endregion } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }