/// <summary> /// Calculates the fitness of this individual. /// </summary> public override void CalculateFitness() { if (this.FitnessCalculated) { return; } var mapFitness = new MapFitness(this.ConvertedPhenotype, this.MapFitnessOptions); this.Fitness = mapFitness.CalculateFitness(); this.MapFitnessValues = mapFitness.FitnessValues; }
/// <summary> /// Runs novelty search on a given set of maps with the given settings. /// </summary> /// <param name="maps"> The maps to run evolution on. </param> /// <param name="r"> The random number generator. </param> /// <param name="mapSearchOptions"> The map search options. </param> /// <param name="noveltySearchOptions"> The novelty search options. </param> /// <param name="mapFitnessOptions"> The map fitness options. </param> /// <param name="numberOfGenerations"> The number of generations to run. </param> /// <param name="folderName"> The folder to save results to in "Images/Finished Maps". </param> /// <param name="fileToWriteTo"> The file to write timings and fitness per generation to. </param> /// <param name="lowestFitnessLevelForPrint"> The fitness required before a map is printed. </param> public static void RunNoveltySearch( List <MapPhenotype> maps, Random r, MapSearchOptions mapSearchOptions = null, NoveltySearchOptions noveltySearchOptions = null, MapFitnessOptions mapFitnessOptions = null, int numberOfGenerations = 10, string folderName = "MapNovelty", string fileToWriteTo = "NoveltySearchGenerationTimes.txt", double lowestFitnessLevelForPrint = double.MinValue) { var stringToWrite = new StringBuilder(); var mso = mapSearchOptions ?? new MapSearchOptions(null); var mfo = mapFitnessOptions ?? new MapFitnessOptions(); var nso = noveltySearchOptions ?? new NoveltySearchOptions(); var sw = new Stopwatch(); sw.Start(); var baseMapCounter = 0; foreach (var map in maps) { sw.Restart(); stringToWrite.AppendLine(string.Format("Performing novelty search on base map number {0}.", baseMapCounter)); var heightLevels = map.HeightLevels.Clone() as Enums.HeightLevel[, ]; var items = map.MapItems.Clone() as Enums.Item[, ]; var baseMap = new MapPhenotype(heightLevels, items); baseMap.CreateCompleteMap(Enums.Half.Top, Enums.MapFunction.Turn).SaveMapToPngFile(string.Format("Base Map {0}", baseMapCounter), folderName, false); mso = new MapSearchOptions(map, mso); var searcher = new MapSearcher(r, mso, nso); searcher.RunGenerations(numberOfGenerations, stringToWrite); var archiveMaps = new List <MapPhenotype>(); var variationValue = 0; foreach (var solution in searcher.Archive.Archive) { var individual = (MapSolution)solution; variationValue++; var fitness = new MapFitness(individual.ConvertedPhenotype, mfo).CalculateFitness(); if (fitness >= lowestFitnessLevelForPrint) { individual.ConvertedPhenotype.SaveMapToPngFile(string.Format("Base Map {0}_Map {1}_Fitness {2}", baseMapCounter, variationValue, fitness), folderName, false); } else { Console.WriteLine("fitness too low: " + fitness); } archiveMaps.Add(individual.ConvertedPhenotype); } stringToWrite.AppendLine(string.Format("It took {0} ms to perform novelty search on base map number {1}.", sw.ElapsedMilliseconds, baseMapCounter)); stringToWrite.AppendLine(); MapHelper.SaveGreyscaleNoveltyMap(archiveMaps, string.Format("Base Map {0} NoveltyMap", baseMapCounter), folderName); baseMapCounter++; } WriteToTextFile(stringToWrite.ToString(), fileToWriteTo, folderName); }