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 generationNumInGeneration表示适应度函数中的条目数。当我对每一代的结果进行分组时,我得到了以下结果:
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条条目)。
当我在第十代对染色体进行分组时,我会重复对相同的染色体进行评估:
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应该如何工作。在这种情况下,请解释人口数与适应度函数条目数之间的关系。如何设置和控制适应度函数的条目数。当适应度函数过大时,多次对同一染色体进行评价,会造成资源的浪费。在这种情况下,如果需要的话,我认为进行“外部”缓存没有问题。
发布于 2016-11-23 06:43:50
评价的数量是根据人口与经营者人数的关系得出的。如果对每一代的染色体都进行了评估,那么你会看到每一代300条染色体的评估结果。但是,根据指定的参数减少了这个数目。例如,交叉ReEvaluateAll设置为false。这意味着GAF不会重新评估它已经适应的任何东西。精英被设置为5%,这意味着这些将不会被评估为每个运营商/世代。交叉概率被设定为0.65,这意味着在许多情况下不会发生交叉的可能性很大,从而进一步减少了评估的次数。
父母选择部分取决于当前的适应度,因此,评估的过程是在开始第一代之前对种群进行初步评估,然后对每一代中的每个操作者进行上述评估。因此,第一代的评价比后续的评价更多,这是相当正常的。初始评估的结果可以通过连接到OnInitialEvaluationComplete事件来获得。如果您的总数为100,则此时的评估数将为100。
关于你问题的第二部分,...why,对于同一染色体来说,健身功能被称为更多次吗?答案是,事实并非如此。你有12条不同的染色体,所有的染色体都有相同的值。检查每个“重复”的Chromosome.Id属性(Guid)应该可以证明这一点。在遗传算法种群中,由于父母选择过程中的重复值,通常使用相同或相似的父母来创建后代,这是常见的。
从表面上看,你把已知染色体值的适应度值计算出来的想法,似乎是一种合理的方法来处理染色体,而不是对象类型。产品是开源的(LGPL),您可以添加它并创建一个拉请求。
https://stackoverflow.com/questions/39890443
复制相似问题