private static int generation = 0;
private static int numInGeneration = 0;
public static void Calculate()
{
const double crossoverProbability = 0.65;
const double mutationProbability = 0.08;
const int elitismPercentage = 5;
...
var population = new Population(100, 40, false, false, ParentSelectionMethod.FitnessProportionateSelection);
private static double EvaluateFitness(Chromosome chromosome)
{
numInGeneration++; // incrementing evaluation number in the same generation
// save to DB chromosome, fitness, generation, numInGeneration ...
private static bool TerminateAlgorithm(Population population, int currentGeneration, long currentEvaluation)
{
numInGeneration = 0; // reseting number in generation
NumInGeneration は、フィットネス関数内のエントリ数を表します。各世代の結果をグループ化すると、次の結果が得られました。
Generation NumInGeneration
0 289
1 186
2 188
3 182
4 190
5 189
6 184
7 184
8 185
100 の評価がない理由、フィットネス関数への 100 のエントリ。この場合第0世代では289回?
世代ごとに 100 の染色体が生成されることを期待していましたが、これは 100 の評価 (フィットネス関数への 100 のエントリ) があることを意味していました。
0 世代の染色体をグループ化すると、同じ染色体の評価を繰り返す必要があります。
Chromosome Repeating
0001001110101011101110111011101011101011 12
0010000111110011110100011011101110101100 8
0010111011001000001110011000110001010010 5
0011100011110010100010001100001101111001 5
0000011011001111101000001101011111111111 4
0010011010100110001001110101001101111101 4
0001101110101101110100001000110000001000 3
0100011001110010100001010111000011111011 3
1110100110001010000101010110111100000101 2
0100010110100111010100100100110110111111 2
0100101111011000000000111100100000011100 2
1111001111101100011101100000101101101001 2
1100000100110000001010110110110001010000 2
0110010101110011000101001111011010111011 2
1100101011010001010011100101101110011100 2
0010000110101011110010111010110100000010 2
0100000000000101101011111011111011111100 2
0100110011000001010000011110001110010110 2
0111101101000111111011111011111011100100 2
0111110010011110010010000000100011010010 2
0111111011110101111111000001101011011111 1
0111111100101001110011111110110100010010 1
1000001001101011100010001011011110100110 1
もう 1 つの問題は、同じ染色体に対してフィットネス関数が何度も呼び出される理由です。この例では、同じ計算が 12 回行われていることがわかりますか? セットアップが必要な内部キャッシュはありますか?
おそらく、GAF がどのように機能するべきか、私は間違った考えを持っています。その場合、人口数とフィットネス関数へのエントリ数の関係を説明してください。フィットネス機能へのエントリ数を設定および制御する方法。適応度関数が重すぎる場合、同じ染色体に対して複数回評価が行われると、リソースが無駄になります。その場合、必要に応じて「外部」キャッシュを作成しても問題はありません。