private static void Optimize(string monsterName, string[] startingBuild = null, ushort startingBuildFrontRow = 0)
{
var monster = Library.Monsters.First(x => x.Name == monsterName);
var simulator = monster.MaxPartyMembers > 1 ?
(ASimulator)new PartySimulator(monster, 40, 40, false) :
(ASimulator)new SingleHeroSimulator(monster, 40, 40);
double lastFitness = 0;
while(true)
{
var fitnessEvaluator = new PartyFitness(simulator);
var ancestor = (startingBuild == null) ?
new ShortArrayChromosome(fitnessEvaluator.ChromosomeLength, fitnessEvaluator.ChromosomeMaxValue) :
fitnessEvaluator.TranslateBack(simulator.TranslateBack(startingBuild), startingBuildFrontRow);
var population = new Population(20,
ancestor,
fitnessEvaluator,
new RankSelection());
population.RandomSelectionPortion = 0.15;
for(int stagnation = 0; stagnation < 5000; stagnation++)
{
population.RunEpoch();
if (population.BestChromosome.Fitness > lastFitness)
{
lastFitness = population.BestChromosome.Fitness;
Console.Write(fitnessEvaluator.Translate(population.BestChromosome).Trim());
Console.WriteLine(" " + population.BestChromosome.Fitness);
Console.WriteLine();
stagnation = 0;
}
population.MutationRate = stagnation > 1000 ?
Math.Min(stagnation / 3000.0, 0.25) :
0.1;
}
}
}