- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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 的工作方式有错误的认识。在这种情况下,请解释人口数量与适应度函数的条目数量之间的联系。如何设置和控制健身功能的条目数。如果适应度函数太重,则对同一染色体进行多次评估会造成资源浪费。在那种情况下,如果需要,我认为进行“外部”缓存没有问题。
最佳答案
评估的数量基于与运算符(operator)数量相关的人口数量。如果对每一代的所有染色体进行评估,那么您将看到每代有 300 次评估。但是,这个数字会根据指定的参数减少。例如交叉 ReEvaluateAll 设置为 false。这意味着 GAF 不会重新评估它已经适合的任何东西。 Elite 设置为 5%,这意味着不会对每个运算符(operator)/生成进行评估。交叉概率设置得相当低,为 0.65,这意味着在许多情况下很可能不会发生交叉,从而进一步减少评估次数。
parent 的选择部分取决于当前的适应性,因此,评估过程是在开始第一代之前对种群进行初步评估,然后如上所述对每一代中的每个运算符(operator)进行评估。所以第一代的评价比后代多也是很正常的。初始评估的结果可通过连接到 OnInitialEvaluationComplete 事件获得。如果人口为 100,则此时的评估数将为 100。
对于问题的第二部分...为什么对同一条染色体调用适应度函数的次数更多?答案是事实并非如此。你拥有的是 12 条不同的染色体,它们都具有相同的值。检查每个“重复项”的 Chromosome.Id 属性 (Guid) 应该可以证明这一点。由于亲代选择过程通常使用相同或相似的亲代来创建后代,因此在 GA 种群中存在重复值是很常见的。
从表面上看,您为已知染色体值缓存适应度值的想法对于对象类型以外的染色体来说似乎是一种合理的方法。该产品是开源的 (LGPL),您可以随时添加它并创建拉取请求。
关于c# - .NET 中的遗传算法框架 (GAF) - 种群与适应度函数条目数之间的联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39890443/
private static int generation = 0; private static int numInGeneration = 0; public static void Calcul
我想使用 gramian-angular-fields-method (GAF) 将时间序列编码为图像,目的是应用卷积神经网络 (CNN)。到目前为止,我还没有找到实现此功能的 R 函数。 对于 Py
我是一名优秀的程序员,十分优秀!