文章 "遗传算法 - 很简单!" - 页 5 123456789101112...20 新评论 Andrey Dik 2010.08.26 13:57 #41 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};我们观察到了什么? Andrey Dik 2010.08.26 17:06 #42 给舒里克的确如此。所有不同染色体的唯一性检查次数可通过公式计算得出 (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};如果发现重复,检查次数会更少。感谢您对项目 的积极参与!我们将对图书馆进行适当修改。虽然这些改动不会影响算法的搜索能力,但会使其工作更加合理。 Alexander Agafonov 2010.08.26 17:31 #43 joo:我们在看什么?虽然这些变化丝毫不会影响算法的搜索能力完全正确,算法的质量不会改变,虽然起初我对此表示怀疑,但现在你已经向我证明了这一点,不过在这些怀疑的基础上找到了优化的方法:) Andrey Dik 2010.08.30 11:35 #44 更新了 UGA 库和文章示例。当前的作者免费版本为 1.2.1。 附加的文件: ugalib_v1.2.1_ru.zip 13 kb Andrey Dik 2010.08.30 11:37 #45 更新 UGA 库和本文示例。当前免费制作版本 1.2.1。 附加的文件: ugalib_v1.2.1_eng.zip 12 kb Henadiy E. Batohov 2010.10.27 12:35 #46 我研究了这篇文章,在代码中发现了这样一个不一致的地方,即在两个获取范围值的函数中使用了相同的公式 : //复制 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); Andrey Dik 2010.10.27 12:56 #47 Batohov:我研究了这篇文章,发现代码中有一处不一致,两个函数使用相同的公式来获取范围值 : 即获得了两个基因值之外的数据,这是 "人工突变 "的特征。这是一个错误还是另有解释?在我看来,复制法需要改变符号:最小值 = C1+((C2-C1)*ReplicationOffset);最大值 = C2-((C2-C1)*ReplicationOffset);没有错误或不一致。在复制和人工突变中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的。但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围在 这些界限之外。复制的作用是传递双亲基因的特征(在边界之内)。人工突变的作用是产生不同于亲代的新基因(在边界之外)。 Henadiy E. Batohov 2010.10.27 13:04 #48 joo:不存在错误或不一致。在复制和人工变异中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的。但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围在 这些界限之外。复制的作用是传递双亲基因的特征(在边界之内)。人工突变的作用是产生不同于父母基因的新基因(在边界之外)。 谢谢你的快速回复,我明白你的思路了。 hrenfx 2010.11.04 03:08 #49 joo:顺便说一句,很高兴成为与 ZZ 有关的最著名的交易神话之一(文章中的第二项任务)的破坏者。 :)显然,我没有理解任务的措辞。我的陈述在最小交易点数为N 点的条件下,最大利润的入场点位于 ZigZag 的顶部,最小膝数为N + Spread 点数。 hrenfx 2010.11.04 03:16 #50 joo:我在 MQL4 论坛主题"测试多变量多极值函数 " 中发布了一些有趣的测试函数,文章中介绍了其中一个。如果您愿意,可以尝试使用 GA 以外的其他优化算法找到所提议函数的极值,并将结果发布在这里。欢迎您这样做。首先,这对每个人和我来说都会很有趣。 我意识到评估拟合的有效性非常重要。其中一种方法是在原始数据中添加噪音。其他优化方法的源代码可以在这里(http://alglib.sources.ru/optimization/) 和这里(http://ool.sourceforge.net/) 找到。显然,每种优化算法在各自的目标函数类别上都有更好的表现。您在实践中使用哪些目标函数? 123456789101112...20 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
非常感谢你的澄清,关于删除重复数据的问题已经得到了满意的答复。我在附件中附上了演示原始函数和优化函数的脚本代码,其中演示了循环次数的减少。在我目前的评论中,我并不是指出函数中的错误,而是建议对其进行优化,我的主要目的是找出重复删除的原理,我得到了全面的答复。再次感谢您提供的库和对函数的说明。
110 和 160 对 20 条染色体来说太多了....你把计数器放错地方了。
这才是正确的位置:
好的。现在试试同样的群体,同样的染色体,但按这个顺序排列:
我们观察到了什么?
给舒里克
的确如此。所有不同染色体的唯一性检查次数可通过公式计算得出
(PopulChromosCount^2-PopulChromosCount)/2在我们的例子中,有 20 条染色体(假设所有染色体都不同),检查次数为
(20*20-20)/2=190这一点可以通过以下检查得到证实:
如果发现重复,检查次数会更少。
感谢您对项目 的积极参与!
我们将对图书馆进行适当修改。虽然这些改动不会影响算法的搜索能力,但会使其工作更加合理。
我们在看什么?
虽然这些变化丝毫不会影响算法的搜索能力
完全正确,算法的质量不会改变,虽然起初我对此表示怀疑,但现在你已经向我证明了这一点,不过在这些怀疑的基础上找到了优化的方法:)
我研究了这篇文章,在代码中发现了这样一个不一致的地方,即在两个获取范围值的函数中使用了相同的公式 :
也就是说,获得的数据超出了两个基因值的范围,这是 "人工突变 "的特征。这是一个错误还是另有解释?
在我看来,复制法有必要改变符号:
最小值 = C1+((C2-C1)*ReplicationOffset);
最大值 = C2-((C2-C1)*ReplicationOffset);
我研究了这篇文章,发现代码中有一处不一致,两个函数使用相同的公式来获取范围值 :
即获得了两个基因值之外的数据,这是 "人工突变 "的特征。这是一个错误还是另有解释?
在我看来,复制法需要改变符号:
最小值 = C1+((C2-C1)*ReplicationOffset);
最大值 = C2-((C2-C1)*ReplicationOffset);
没有错误或不一致。在复制和人工突变中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的。
但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围在 这些界限之外。
复制的作用是传递双亲基因的特征(在边界之内)。
人工突变的作用是产生不同于亲代的新基因(在边界之外)。
不存在错误或不一致。在复制和人工变异中,新基因可能出现的边界(你引用的代码部分)都是以同样的方式定义的。
但是,复制的可能性范围在这些界限之内,而人工突变的可能性范围在 这些界限之外。
复制的作用是传递双亲基因的特征(在边界之内)。
人工突变的作用是产生不同于父母基因的新基因(在边界之外)。
顺便说一句,很高兴成为与 ZZ 有关的最著名的交易神话之一(文章中的第二项任务)的破坏者。 :)
显然,我没有理解任务的措辞。我的陈述
在最小交易点数为N 点的条件下,最大利润的入场点位于 ZigZag 的顶部,最小膝数为N + Spread 点数。
我在 MQL4 论坛主题"测试多变量多极值函数 " 中发布了一些有趣的测试函数,文章中介绍了其中一个。
如果您愿意,可以尝试使用 GA 以外的其他优化算法找到所提议函数的极值,并将结果发布在这里。欢迎您这样做。首先,这对每个人和我来说都会很有趣。
我意识到评估拟合的有效性非常重要。其中一种方法是在原始数据中添加噪音。
其他优化方法的源代码可以在这里(http://alglib.sources.ru/optimization/) 和这里(http://ool.sourceforge.net/) 找到。
显然,每种优化算法在各自的目标函数类别上都有更好的表现。
您在实践中使用哪些目标函数?