2
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 がどのように機能するべきか、私は間違った考えを持っています。その場合、人口数とフィットネス関数へのエントリ数の関係を説明してください。フィットネス機能へのエントリ数を設定および制御する方法。適応度関数が重すぎる場合、同じ染色体に対して複数回評価が行われると、リソースが無駄になります。その場合、必要に応じて「外部」キャッシュを作成しても問題はありません。

4

1 に答える 1

1

評価の数は、演算子の数に対する母集団の数に基づいています。世代ごとにすべての染色体が評価された場合、世代ごとに 300 回の評価が表示されます。ただし、この数は、指定されたパラメーターに基づいて削減されます。たとえば、クロスオーバーReEvaluateAllは false に設定されます。これは、GAF がすでに適合性を持っているものを再評価しないことを意味します。Elite は 5% に設定されています。これは、これらがオペレーター/世代ごとに評価されないことを意味します。交叉確率は 0.65 とかなり低く設定されています。これは、多くの場合、交叉が発生しない可能性がかなりあることを意味し、それによって評価の数がさらに減少します。

親の選択は現在の適応度によって部分的に決定されるため、評価のプロセスは、最初の世代を開始する前に母集団の初期評価を行い、次に各世代の各演算子について上記のように評価することです。したがって、最初の世代が次の世代よりも多くの評価を受けるのはごく普通のことです。初期評価の結果は、OnInitialEvaluationCompleteイベントに接続することで入手できます。母集団が 100 の場合、この時点での評価の数は 100 になります。

質問の 2 番目の部分については、同じ染色体に対してフィットネス関数が何度も呼び出されるのはなぜですか? 答えはそうではないということです。あなたが持っているのは、すべて同じ値を持つ12個の異なる染色体です。「重複」のそれぞれについて Chromosome.Id プロパティ (Guid) をチェックすると、これが証明されます。多くの場合、同じまたは類似の親を使用して子孫を作成する親選択プロセスにより、GA 母集団に重複する値が含まれることがよくあります。

既知の染色体値の適合値をキャッシュするというあなたの考えは、一見すると、オブジェクトタイプ以外の染色体に対する合理的なアプローチのようです。この製品はオープン ソース (LGPL) です。いつでもこれを追加してプル リクエストを作成できます。

于 2016-11-23T06:43:50.747 に答える