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

 
shurick:

非常感谢作者提供的程序库!

在父搜索函数的循环中添加一行 "cnt++;",否则可能会进入永恒循环!

的确,在某些情况下,循环可能会变成无限循环--当种群中只有一个个体时。

感谢您的帖子,我很快就会进行修改。

PS 很可能是我忘了插入 cnt++,毕竟这是我输入这个变量的原因。:)

我记得我曾想用for() 运算符 来做循环,这样就可以调节搜索不同父代的 "持续性",但后来我改变了主意,觉得这样做没什么意义。

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
@joo是否 可以使用您的库来编译Ishimoku、MAKD 等指标 的参数?
 
Graff:
@joo 是否可以使用您的库来选择 Ishimoku、MAKD 等指标的参数?

如果您问:"对于哪些交易者的优化任务,无法使用该库?- 那我就不知道该怎么回答了。

当然可以。

 
joo:

如果您问:"哪些交易员的优化任务无法使用该库?- 那我就不知道该怎么回答了。

当然可以。

对不起,我不是程序员,我的问题很愚蠢。如果可能,请分享代码,其中您的库用于将多个参数匹配到一个指标(例如,Ishimoku、MAKD),以明确其工作。
 
Graff:
对不起,我的问题很愚蠢,我不是程序员。如果可能的话,请分享您的库用于为一个指标(如 Ishimoku、MAKD)选择多个参数的代码,以便更清楚地了解其工作原理。

这个问题一点也不蠢。

请使用文章中的第二个示例。用其他指标代替 ZZ 指标。在读取 ZZ 顶部的地方,您需要编写自己的条件(例如,MACD,您将获得相同的替代之字形,但根据您设置的规则)。这并不复杂。试试看,写写代码。如果失败了,可以提问,演示代码中有问题的地方。有兴趣的人会看到解决任务的方法,你和每个人都会从中受益。如果不想学习语言,请联系"工作"。

 

2joo:

您能告诉我 RemovalDuplicates() 函数的本质吗?问题如下:如果我们有两条相同的染色体,是应该将它们都标记为重复体,还是应该保留其中一条不标记为重复体以便继续使用?

另外,为了加快这个函数的运行速度,我建议 Ch2 循环从 Ch+1 开始,因为 Ch2 没有必要从零开始:

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

如果我的问题的答案是两条染色体都被标记为重复,那么用

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

do:

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

如果答案是一条染色体没有被标记为重复,那么 Ch2 循环就应该从 Ch+1 开始。

 
shurick:

2joo:

您能告诉我 RemovalDuplicates() 函数的本质吗?问题如下:如果我们有两条相同的染色体,是将它们都标记为重复体,还是保留其中一条不标记为重复体以便继续使用?

该函数的算法如下:

我们用唯一性特征 "1 "标记所有染色体。我们认为所有染色体都是唯一的。

检查是否存在相同的染色体。为此,我们对群体进行虚拟复制,并将所有染色体相互比较,同时跳过序列号相同的染色体对。找到的重复染色体标记为重复特征 "0"。

接下来,将所有未标记为 "0 "的剩余染色体复制到临时数组中。这样,我们就得到了一个填满的、没有空隙的临时数组,同时也知道了种群中还剩下多少条唯一的染色体。

接下来,剩下的工作就是将染色体复制回群体中。正如你所看到的,没有染色体删除,唯一的染色体只是被移到了种群的起始位置。


要测试此功能,请编写一个脚本,并尝试手动输入填充阵列 的棘手组合。您将看到该函数的工作效率。计算数组中列的最小检查次数,并将其与 RemovalDuplicates() 函数检查列的次数进行比较。

 
joo:

ZY 若要测试此函数,请编写一个脚本,并尝试输入手工制作的填充数组的巧妙组合。您将看到该函数的有效/无效程度。计算数组中列的最小检查次数,并将其与 RemovalDuplicates() 函数检查列的次数进行比较。

当您开始 "for(Ch2=Ch+1) "循环时,必要且充分的迭代次数将减少 2.5 倍,其中一个重复将不会被标记为重复。在这里,我想知道让重复序列中的一条染色体保持唯一性会有多正确!也就是说,函数的任务是删除相同的染色体,但在我看来,将重复染色体中的一个副本放回群体中会更好,因为重复染色体的存在并不能证明其生命力。例如:如果有一个染色体数组{1,3,4,7,7,6,7,8,8},我认为最佳的重复删除结果是这样的:{1,3,4,7,6,8}.因此,我们将进一步考虑第 7 和第 8 号染色体。
 
shurick:
在循环 "for(Ch2=Ch+1) "开始时,必要且充分的迭代次数将减少 2 次,重复染色体中的一条将不会被标记为重复。在这里,我想知道让重复染色体中的一条染色体保持唯一性会更正确!也就是说,函数的任务是删除相同的染色体,但在我看来,最好还是将其中一条重复的染色体放回种群中,因为重复染色体的存在并不能证明种群的生命力。例如:如果有一个染色体数组{1,3,4,7,7,6,7,8,8},我认为最佳的重复删除结果是这样的:{1,3,4,7,6,8}.因此,第 7 和第 8 号染色体将被进一步考虑。

你之前关于 cnt++ 的评论是公平的。但这次你错了。我建议你不要猜测 "如果......会发生什么?",而是写一个脚本,测试函数并演示结果。

只保留一条独一无二的染色体,其余完全相同的副本将被识别为复制并 "删除"。

这可能是整个 UGA 算法中最具莫斯科特色的功能之一。它花了我最多的时间。但其中没有任何错误。


PS 最重要的是,不应该重复检查相同的染色体--这一点已经做到了。

检查唯一性的次数是必要的最少次数。如果您说的是for() 操作符 中的运行次数,您可以通过引入一个额外变量来减少运行次数(同时唯一性检查次数保持不变,即尽可能少),在嵌套变量中每次增加一个变量。这会减慢函数的运行速度。

PPS

shurick

....

从重复的染色体中保留一条唯一的染色体会更正确!也就是说,函数的任务是去除相同的染色体,但在我看来,将一条重复的染色体放回种群中会更好,因为重复染色体的存在并不能证明种群的生命力。

该功能的工作就是去除重复的 染色体。这就是它的名称。而不是去除相同的染色体。看到区别了吗?该功能不会根据染色体的活力来区分它们。因此,在没有重复的单个副本中,只保留唯一的染色体

PPPS 为了以防万一,我再做一个说明。

假设我们有一个由 20 条染色体组成的种群(为简单明了起见,只有一个整数基因),最大化问题是:

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

也就是说,在含有基因的染色体群体中

2 - 4 条

3 - 4 条

4 - 2 条

5 - 3 条

6 - 2 个

7 - 3 件

9 - 1 件

10 - 1 条。

总共 20 条染色体。

去掉重复的染色体后,种群将变成这样,剩下 8 条染色体:

|7|2|3|9|4|5|6|10|

因此只剩下一条唯一的染色体,其余的都是重复的,将在函数调用后被 "删除"。

在函数调用后被 "删除"。

PopulationRanking();

在函数结束时

RemovalDuplicates()

种群将变成这样

|10|9|7|6|5|4|3|2|

 
joo:

PPPS 我再澄清一下,以防万一。

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

功能优化检查脚本的结果

附加的文件: