.NET中的遗传算法框架(GAF) - 种群与健身函数中条目数的联系

时间:2016-10-06 07:49:40

标签: c# genetic-algorithm genetic-programming genetic

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应该如何运作。在这种情况下,请解释人口数量与健身功能的条目数之间的关系。如何设置和控制健身功能的条目数。 在健身功能重的情况下,当对同一染色体进行多次评估时,存在资源浪费。在这种情况下,如果需要,我没有看到进行“外部”缓存的问题。

1 个答案:

答案 0 :(得分:1)

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

父选择部分地由当前适应性确定,因此,评估过程是在开始第一代之前对群体进行初始评估,然后如上所述对每一代中的每个操作者进行评估。因此,第一代的评估比后续评估更为正常。通过连接 OnInitialEvaluationComplete 事件可以获得初始评估的结果。如果您的人口为100,那么此时的评估数量将为100。

对于你的问题的第二部分 ...为什么健康功能在相同的染色体上被调用了更多次?答案是它不是。你有12条不同的染色体都具有相同的价值。检查每个'重复的Chromosome.Id属性(Guid)'应该证明这一点。由于父选择过程通常使用相同或相似的父母来创建后代,因此在GA群体中具有重复值是常见的。

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