Example #1
0
    /// <summary>
    /// 迭代
    /// </summary>
    public void Epoch()
    {
        onUpdateFitnessScores();

        List <UGenome> NewBabys = new List <UGenome>();

        while (NewBabys.Count < Genomes.Length)
        {
            //选择两个父辈用来产生后代
            UGenome Dad   = Selection();
            UGenome Mum   = Selection();
            UGenome Baby1 = new UGenome(Config.NumWeights);
            UGenome Baby2 = new UGenome(Config.NumWeights);
            Crossover(Mum.Weights, Dad.Weights, out Baby1.Weights, out Baby2.Weights);

            //变异
            Mutate(Baby1.Weights);
            Mutate(Baby2.Weights);

            //增加新婴儿
            NewBabys.Add(Baby1);
            NewBabys.Add(Baby2);
        }

        //设置为新代
        Genomes = NewBabys.ToArray();

        Generation++;
    }
Example #2
0
    public void Init(ConfigData cfg)
    {
        Config = cfg;

        Genomes = new UGenome[cfg.PopSize];
        for (int i = 0; i < Config.PopSize; i++)
        {
            Genomes[i] = new UGenome(Config.NumWeights);
        }
    }
    //排序操作(适应性分数高的在前)
    public int CompareTo(object obj)
    {
        UGenome Genome = (UGenome)obj;

        if (this.Fidness < Genome.Fidness)
        {
            return(1);
        }
        else if (this.Fidness == Genome.Fidness)
        {
            return(0);
        }
        else
        {
            return(-1);
        }
    }