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

另一个问题是为什么同一条染色体的适应度函数调用次数更多。在这个例子中,有可能看到已经进行了 12 次相同的计算?是否需要设置一些内部缓存?

可能我对 GAF 应该如何工作有错误的想法。在这种情况下,请解释人口数和适应度函数的条目数之间的联系。如何设置和控制适应度函数的条目数。如果适应度函数过重,则对同一染色体进行多次评估时会浪费资源。在这种情况下,如果需要,我认为进行“外部”缓存没有问题。

4

1 回答 1

1

评估的数量基于与运营商数量相关的总体数量。如果每一代都对所有染色体进行评估,那么您将看到每代进行 300 次评估。但是,此数字会根据指定的参数而减少。例如,交叉ReEvaluateAll设置为 false。这意味着 GAF 不会重新评估它已经适合的任何东西。Elite 设置为 5%,这意味着不会针对每个运营商/代进行评估。交叉概率设置为 0.65 相当低,这意味着在许多情况下交叉不会发生的可能性很大,从而进一步减少了评估的数量。

父代选择部分取决于当前的适应度,因此,评估过程是在开始第一代之前对种群进行初步评估,然后对每一代中的每个算子进行如上所述的评估。所以第一代的评价多于后代是很正常的。初始评估的结果可通过连接到OnInitialEvaluationComplete事件获得。如果您的总体人数为 100,则此时的评估数量将为 100。

对于您问题的第二部分……为什么同一染色体的适应度函数调用次数更多?答案是它不是。你所拥有的是 12 条不同的染色体,它们都具有相同的值。检查每个“重复”的 Chromosome.Id 属性(Guid)应该证明这一点。由于父母选择过程通常使用相同或相似的父母来创建后代,因此在 GA 人口中通常会出现重复值。

从表面上看,您为已知染色体值缓存适应度值的想法似乎是除对象类型之外的染色体的合理方法。该产品是开源的 (LGPL),您可以随时添加它并创建拉取请求。

于 2016-11-23T06:43:50.747 回答