private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; GaTask task = (GaTask)e.Argument; try { task.ProgressPercent = 0; task.State = TaskState.Launched; task.LaunchTime = DateTime.Now; IList<IIndividual<Wrapper<LearningObject>>> individualsList = new List<IIndividual<Wrapper<LearningObject>>>(); //Individuals initializing for (int i = 0; i < task.GaConfigs.PopulationSize; i++) { //Wrap source LOs to pass to GA //List<Wrapper<LearningObject>> wrappedListOfLo = new List<Wrapper<LearningObject>>(); = task.SourceLearningObjects.Select(sourceLearningObject => new Wrapper<LearningObject>(GAUtils.GetProbability(0.5), sourceLearningObject)).ToList(); List<Wrapper<LearningObject>> wrappedListOfLo = new List<Wrapper<LearningObject>>(); foreach (var sourceLearningObject in task.SourceLearningObjects) { wrappedListOfLo.Add(new Wrapper<LearningObject>(GAUtils.GetProbability(0.5), sourceLearningObject)); } wrappedListOfLo = GAUtils.Shuffle(wrappedListOfLo).ToList(); individualsList.Add(new Individual<Wrapper<LearningObject>>(wrappedListOfLo)); } var population = new Population<Wrapper<LearningObject>>(individualsList, IndividualEvaluateFunc, MutationFunc, CrossoverFunc, SelectionFunc); IGeneticAlgorithm<Wrapper<LearningObject>> ga = new GA<Wrapper<LearningObject>>(population); IGAconfiguration configuration = new GAConfiguration(task.GaConfigs.GAIterationsNumber, task.GaConfigs.MutationProbability, task.GaConfigs.MutationPeriod, task.GaConfigs.CrossoverProbability, task.GaConfigs.ElitismPercentage); ga.Run(StopCondition, configuration, task.Id, worker); if (worker != null && worker.CancellationPending) { task.State = TaskState.Cancelled; e.Result = task; } else { task.State = TaskState.Finished; } if (task.State == TaskState.Finished) { if (worker != null) worker.ReportProgress(100, task.Id); } //Put result data to task task.AverageFFvalues = ga.Statistics.AverageFitnessFunctionValues; task.BestFfValues = ga.Statistics.BestFitnessFunctionValues; task.WorstFfValues = ga.Statistics.WorstFitnessFunctionValues; List<LearningObject> resultList = new List<LearningObject>(); foreach (var wrapper in ga.BestIndividual.Chromosome.Genes) { if (wrapper.Used) { resultList.Add(wrapper.Value); } } task.ResultLearningObjects = resultList; e.Result = task; } catch (Exception ex) { Console.WriteLine(ex.Message); task.State = TaskState.Error; task.ErrorMessage = ex.Message; e.Result = task; } }
static void Main() { IGAconfiguration configuration = new GAConfiguration(100, 0.9, null, 0.6, 0.3); IList<IIndividual<Wrapper<MyValuableClass>>> individualsList = new List<IIndividual<Wrapper<MyValuableClass>>>(); //Individuals initializing for (int i = 0; i < 1000; i++) { //Wrap source LOs to pass to GA List<Wrapper<MyValuableClass>> wrappedList = new List<Wrapper<MyValuableClass>>(); for (int j = 0; j < 5; j++) { wrappedList.Add(new Wrapper<MyValuableClass>(new MyValuableClass(GAUtils.GetRandom(0, 100)))); } individualsList.Add(new Individual<Wrapper<MyValuableClass>>(wrappedList)); } Console.WriteLine("Population creating"); var population = new Population<Wrapper<MyValuableClass>>(individualsList, IndividualEvaluateFunc, MutationFunc, CrossoverFunc, SelectionFunc); IGeneticAlgorithm<Wrapper<MyValuableClass>> ga = new GA<Wrapper<MyValuableClass>>(population); ObjectId id = new ObjectId(); Console.WriteLine("GA launching"); BackgroundWorker bgBackgroundWorker = new BackgroundWorker(); ga.Run(StopCondition, configuration, id, bgBackgroundWorker, WriteToCOnsole); foreach (var val in ga.Statistics.AverageFitnessFunctionValues) { Console.WriteLine(val); } string fileName = "data.txt"; using (StreamWriter outfile = new StreamWriter(fileName)) { foreach (var averageFitnessFunctionValue in ga.Statistics.AverageFitnessFunctionValues) { outfile.WriteLine(averageFitnessFunctionValue); } } //ga.Run(statistics => statistics.CurrentIteration > configuration.IterationsNumber, configuration, id, bgBackgroundWorker, WriteToCOnsole); }