MerchantRPG.GeneticParty.Processing.PartyFitness.TranslateBack C# (CSharp) Method

TranslateBack() public method

public TranslateBack ( IList builds, ushort frontRow ) : AForge.Genetic.ShortArrayChromosome
builds IList
frontRow ushort
return AForge.Genetic.ShortArrayChromosome
        public ShortArrayChromosome TranslateBack(IList<HeroBuild> builds, ushort frontRow)
        {
            var chromosome = new ShortArrayChromosome(ChromosomeLength, ChromosomeMaxValue);
            for(int heroI = 0; heroI < builds.Count; heroI++)
            {
                int offset = heroI * BuildSize;
                var itemCount = builds[heroI].Items.Length;

                chromosome.Value[offset] = (ushort)builds[heroI].HeroType;
                Array.Copy(builds[heroI].Items.Select(x => (ushort)x).ToArray(), 0, chromosome.Value, offset + 1, itemCount);
                chromosome.Value[offset + itemCount + 1] = (ushort)builds[heroI].EnhancmentTypes[0];
                chromosome.Value[offset + itemCount + 2] = (ushort)builds[heroI].EnhancmentTypes[1];
                chromosome.Value[offset + itemCount + 3] = (ushort)builds[heroI].EnhancmentCounts[0];
            }

            if (simulator.PartySize > 1)
                chromosome.Value[simulator.PartySize * BuildSize] = frontRow;

            return chromosome;
        }

Usage Example

コード例 #1
0
        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;
                }
            }
        }