// 初期化 public override void Initialize() { for (int i = 0; i < InitialPopulationSize; i++) { _genes.Add(GAUtility.GenerateGene(ChromosomesType, CalcFunc, GeneLength)); _populationSize++; } }
public override void Mutation(int index) { switch (MutationType) { case MutationType.Swap: _genes[index].Chromosomes = GAUtility.SwapMutation(_genes[index].Chromosomes, MutationRate); break; } }
/// <summary> /// 選択 /// </summary> /// <returns>選択された遺伝子のインデックス</returns> public override int Selection() { var fittnessValues = _genes.Select(x => x.Fittness).ToArray(); switch (SelectionType) { case SelectionType.Roulette: return(GAUtility.RouletteSelection(fittnessValues)); case SelectionType.Rank: return(GAUtility.RankSelection(fittnessValues)); default: throw new ArgumentException(); } }
/// <summary> /// 交叉 /// </summary> public override List <int>[] CrossOver() { var targetIndeces = Enumerable.Range(0, _genes.Count).Shuffle().Take(2).ToArray(); switch (CrossOverType) { case CrossOverType.SinglePoint: return(GAUtility.SinglePointCrossOver(_genes[targetIndeces[0]].Chromosomes, _genes[targetIndeces[1]].Chromosomes)); case CrossOverType.DoublePoint: return(null); case CrossOverType.PermutationSinglePoint: return(GAUtility.PermutationCrossOver(_genes[targetIndeces[0]].Chromosomes, _genes[targetIndeces[1]].Chromosomes, isSingleCross: true)); case CrossOverType.PermutationDoublePoint: return(GAUtility.PermutationCrossOver(_genes[targetIndeces[0]].Chromosomes, _genes[targetIndeces[1]].Chromosomes, isSingleCross: false)); default: return(null); } }