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

 
shurick:

非常感谢你的澄清,关于删除重复数据的问题已经得到了满意的答复。我在附件中附上了演示原始函数和优化函数的脚本代码,其中演示了循环次数的减少。在我目前的评论中,我并不是指出函数中的错误,而是建议对其进行优化,我的主要目的是找出重复删除的原理,我得到了全面的答复。再次感谢您提供的库和对函数的说明。

110 和 160 对 20 条染色体来说太多了....你把计数器放错地方了。

这才是正确的位置:

//Select the second of the pair....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG 计算我们传递周期 Ch 和 Ch2 的次数
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG 计算我们比较染色体的次数。
          //重置相同基因的数量
          cnt=0;
          //检查基因,只要基因相同即可。
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //如果相同基因的数量与基因总数相同
          //......染色体被认为是重复的。
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

好的。现在试试同样的群体,同样的染色体,但按这个顺序排列:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

我们观察到了什么?

 

给舒里克

的确如此。所有不同染色体的唯一性检查次数可通过公式计算得出

(PopulChromosCount^2-PopulChromosCount)/2

在我们的例子中,有 20 条染色体(假设所有染色体都不同),检查次数为

(20*20-20)/2=190

这一点可以通过以下检查得到证实:

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,17,18,19,20}

如果发现重复,检查次数会更少。

感谢您对项目 的积极参与!

我们将对图书馆进行适当修改。虽然这些改动不会影响算法的搜索能力,但会使其工作更加合理。

 
joo:

我们在看什么?

结果

虽然这些变化丝毫不会影响算法的搜索能力

完全正确,算法的质量不会改变,虽然起初我对此表示怀疑,但现在你已经向我证明了这一点,不过在这些怀疑的基础上找到了优化的方法:)

 
更新了 UGA 库和文章示例。当前的作者免费版本为 1.2.1。
附加的文件:
 
更新 UGA 库和本文示例。当前免费制作版本 1.2.1。
附加的文件:
 

我研究了这篇文章,在代码中发现了这样一个不一致的地方,即在两个获取范围值的函数中使用了相同的公式

//复制
void Replication
...
    //设定创建新基因的边界
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// 人工突变。
void ArtificialMutation
...
    //设定创建新基因的边界
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

也就是说,获得的数据超出了两个基因值的范围,这是 "人工突变 "的特征。这是一个错误还是另有解释?

在我看来,复制法有必要改变符号:

最小值 = C1+((C2-C1)*ReplicationOffset);

最大值 = C2-((C2-C1)*ReplicationOffset);


 
Batohov:

我研究了这篇文章,发现代码中有一处不一致,两个函数使用相同的公式来获取范围值

即获得了两个基因值之外的数据,这是 "人工突变 "的特征。这是一个错误还是另有解释?

在我看来,复制法需要改变符号:

最小值 = C1+((C2-C1)*ReplicationOffset);

最大值 = C2-((C2-C1)*ReplicationOffset);

没有错误或不一致。在复制和人工突变中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的

但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围 这些界限之外

复制的作用是传递双亲基因的特征(在边界之内)。

人工突变的作用是产生不同于亲代的新基因(在边界之外)。

 
joo:

不存在错误或不一致。在复制和人工变异中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的

但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围 这些界限之外

复制的作用是传递双亲基因的特征(在边界之内)。

人工突变的作用是产生不同于父母基因的新基因(在边界之外)。

谢谢你的快速回复,我明白你的思路了。
 
joo:

顺便说一句,很高兴成为与 ZZ 有关的最著名的交易神话之一(文章中的第二项任务)的破坏者。 :)

显然,我没有理解任务的措辞。我的陈述

在最小交易点数为N 点的条件下,最大利润的入场点位于 ZigZag 的顶部,最小膝数为N + Spread 点数。

 
joo:

我在 MQL4 论坛主题"测试多变量多极值函数 " 中发布了一些有趣的测试函数,文章中介绍了其中一个。

如果您愿意,可以尝试使用 GA 以外的其他优化算法找到所提议函数的极值,并将结果发布在这里。欢迎您这样做。首先,这对每个人和我来说都会很有趣。

我意识到评估拟合的有效性非常重要。其中一种方法是在原始数据中添加噪音。

其他优化方法的源代码可以在这里(http://alglib.sources.ru/optimization/) 和这里(http://ool.sourceforge.net/) 找到。

显然,每种优化算法在各自的目标函数类别上都有更好的表现。

您在实践中使用哪些目标函数?