文章 "遗传算法 - 很简单!" - 页 8

 
joo:

1) 讲故事的人?嗯,很遗憾,我没有领会到其中的幽默。数据库检查发生在函数 CheckHistoryChromosomes(chromos,historyHromosomes ) 中,该函数由GetFitness(historyHromosomes) 调用。这就是为什么我说的是正确的--没有重复运行 FF。

2) 与数据库的核对是通过基因进行的。当出现新染色体时,每个基因都会被SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) 归一化。因此,这里也没有 "童话"。

3) 参见 2)

1,2,3) 明白了。差不多了。但这仍然不是 "无间隙 "比较实数是否相等的理由。:)

SelectInDiscreteSpace()略有改动。我不喜欢你在内部修正 Step 的做法。对用户进行修正不是什么大不了的事。至少这次不是。

用户可能有合理的考虑,使 Step 在基因变化范围方面 "不合理"。

结果是这样的

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // 确保边界正确
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // 如果违规,返回违规边界
  if ( In < InMin ) return( InMin );
// if ( In > InMax ) return( InMax );// 最后我们将这样做, всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // 达到给定的比例
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step ); // 不,我们不会让它达到 "给定比例"。
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

对 SelectInDiscreteSpace() 稍作了修改。我不喜欢你纠正 Step 的做法。纠正用户不关国王的事。至少这次不是。

用户可能有合理的考虑,使 Step 在基因变化范围方面 "不合理"。

明白吗?

这样做并不好,因为马上就会出现一个问题,即从输入数字的哪一边 "抓取 "数值行上的数值(不知道什么"右",右边还是左边)--我的算法给出了充分的答案,但你的算法,唉。这就是为什么你需要这样做:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

下面是你我代码结果的一些对比示例:



结果


我的 你的
2,2 2 2
InMIN 2
最大值 3
步长 0,8






结果


我的 您的
2,8 3 2,8
InMIN 2
最大值 3
步进 0,8






结果


我的 您的
2,2 2,25 2,3
InMIN 2
最大值 3
步进 0,3
 
这种归一化的意义与 NormalizeDouble() 不同,但这取决于所有者,如果所有者不喜欢它,可以使用归一化到所需的符号,而不是像SelectInDiscreteSpace() 中的指定步长。
 
joo:
这种归一化的意义与 NormalizeDouble() 不同,但这取决于所有者,谁不喜欢它,可以使用归一化到所需的符号,而不是像在SelectInDiscreteSpace() 中那样使用指定的步长。

一切都很清楚了,就像上一篇文章一样。

安德烈,所有列出的变体都有权在这里存在。当然,你的也一样。在优化过程中浮动、变化的离散度值得密切关注。

--

关于一般的一切.....:

你应该添加设置、遗传运算符库等。

我正在考虑在对象上重写一切,制作一个功能更强大的程序和用户界面(图形界面,在标签页中有许多设置)。有些东西需要添加,有些东西需要共同优化。

更确切地说,我还在考虑是基于你的代码(使用片段)还是重新编写一遍。

如果您想参与,请私信我

我不确定是否会发表。我们将拭目以待。现在我只想为自己做这件事。

 
MetaDriver:

总的来说

1) 从好的方面来说--您需要添加自定义功能、基因运算符库等。

2) 更准确地说,我还在考虑是基于你的代码(使用片段)还是重新编写一遍。

3) 如果您想参与,请私信我

1) 相反,我正试图在不降低控制灵活性的前提下减少 UGA 参数的数量。

2) 我知道有几个人在他们的项目中原封不动地使用文章中的代码,还有一些人从零开始重写代码。

3) 我曾给您写过私人信息。

 
MetaDriver:

这些都是可以理解的,就像上一篇文章一样。

安德烈,这里列出的所有选择都有存在的权利。当然,你的也一样。浮动离散性在优化过程中会发生变化,值得密切关注。

--

关于一般的一切.....:

你应该添加设置、遗传运算符库等。

我正在考虑在对象上重写一切,制作一个功能更强大的程序和用户界面(图形界面,在标签页中有大量设置)。有些东西需要添加,有些东西需要共同优化。

更确切地说,我还在考虑是以您的代码为基础(使用片段),还是重新编写一遍。

...

弗拉基米尔,你是想骑车还是开车?

您是想要一个漂亮的代码,还是想要构建一个比测试版更酷的 GA?

我个人认为测试版相当酷,但参数很少。

 
Urain:

弗拉基米尔,你想骑马还是开车?

你是想要一个漂亮的代码,还是想制造一个比测试版更酷的 GA?

我个人认为测试版已经很酷了,只有一个细微差别的参数是不够的。

我想要一个方便的代码。易于使用、扩展、修改和嵌入。

 
MetaDriver:

我想要一个方便的代码。易于使用、扩展、修改和嵌入。

然后描述 GA 的对象模型。根据描述的模型创建空类,然后填充代码并规定交互方式。
 

第 175 行改为

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

如果不这样做,工作报告就会出错。

 
Rich:

第 175 行改为

如果不这样做,操作报告会出错。

是的,如果自 gen. 运算符循环第一次运行以来,在给定的时间内没有任何改进,就会出现除以 0 的错误。

在初始化时立即为resetCounterFF 变量赋值 1 是最简单也是更符合逻辑的做法:

int    resetCounterFF   =1;// "没有改进的纪元 "重置计数器