/// <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++; }
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); } }