文章 "遗传算法 - 很简单!" - 页 4 1234567891011...20 新评论 Andrey Dik 2010.08.22 20:43 #31 shurick:非常感谢作者提供的程序库!在父搜索函数的循环中添加一行 "cnt++;",否则可能会进入永恒循环!的确,在某些情况下,循环可能会变成无限循环--当种群中只有一个个体时。感谢您的帖子,我很快就会进行修改。PS 很可能是我忘了插入 cnt++,毕竟这是我输入这个变量的原因。:)我记得我曾想用for() 运算符 来做循环,这样就可以调节搜索不同父代的 "持续性",但后来我改变了主意,觉得这样做没什么意义。 Документация по MQL5: Основы языка / Операторы / Оператор цикла for www.mql5.com Основы языка / Операторы / Оператор цикла for - Документация по MQL5 Serge 2010.08.25 15:49 #32 @joo是否 可以使用您的库来编译Ishimoku、MAKD 等指标 的参数? Andrey Dik 2010.08.25 16:15 #33 Graff: @joo 是否可以使用您的库来选择 Ishimoku、MAKD 等指标的参数?如果您问:"对于哪些交易者的优化任务,无法使用该库?- 那我就不知道该怎么回答了。当然可以。 Serge 2010.08.25 16:56 #34 joo:如果您问:"哪些交易员的优化任务无法使用该库?- 那我就不知道该怎么回答了。当然可以。 对不起,我不是程序员,我的问题很愚蠢。如果可能,请分享代码,其中您的库用于将多个参数匹配到一个指标(例如,Ishimoku、MAKD),以明确其工作。 Andrey Dik 2010.08.25 17:26 #35 Graff: 对不起,我的问题很愚蠢,我不是程序员。如果可能的话,请分享您的库用于为一个指标(如 Ishimoku、MAKD)选择多个参数的代码,以便更清楚地了解其工作原理。这个问题一点也不蠢。请使用文章中的第二个示例。用其他指标代替 ZZ 指标。在读取 ZZ 顶部的地方,您需要编写自己的条件(例如,MACD,您将获得相同的替代之字形,但根据您设置的规则)。这并不复杂。试试看,写写代码。如果失败了,可以提问,演示代码中有问题的地方。有兴趣的人会看到解决任务的方法,你和每个人都会从中受益。如果不想学习语言,请联系"工作"。 Alexander Agafonov 2010.08.25 20:14 #36 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 开始。 Andrey Dik 2010.08.25 22:27 #37 shurick:2joo:您能告诉我 RemovalDuplicates() 函数的本质吗?问题如下:如果我们有两条相同的染色体,是将它们都标记为重复体,还是保留其中一条不标记为重复体以便继续使用?该函数的算法如下:我们用唯一性特征 "1 "标记所有染色体。我们认为所有染色体都是唯一的。检查是否存在相同的染色体。为此,我们对群体进行虚拟复制,并将所有染色体相互比较,同时跳过序列号相同的染色体对。找到的重复染色体标记为重复特征 "0"。接下来,将所有未标记为 "0 "的剩余染色体复制到临时数组中。这样,我们就得到了一个填满的、没有空隙的临时数组,同时也知道了种群中还剩下多少条唯一的染色体。接下来,剩下的工作就是将染色体复制回群体中。正如你所看到的,没有染色体删除,唯一的染色体只是被移到了种群的起始位置。要测试此功能,请编写一个脚本,并尝试手动输入填充阵列 的棘手组合。您将看到该函数的工作效率。计算数组中列的最小检查次数,并将其与 RemovalDuplicates() 函数检查列的次数进行比较。 Alexander Agafonov 2010.08.25 23:32 #38 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 号染色体。 Andrey Dik 2010.08.26 04:55 #39 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() 操作符 中的运行次数,您可以通过引入一个额外变量来减少运行次数(同时唯一性检查次数保持不变,即尽可能少),在嵌套变量中每次增加一个变量。这会减慢函数的运行速度。PPSshurick:....从重复的染色体中保留一条唯一的染色体会更正确!也就是说,函数的任务是去除相同的染色体,但在我看来,将一条重复的染色体放回种群中会更好,因为重复染色体的存在并不能证明种群的生命力。该功能的工作就是去除重复的 染色体。这就是它的名称。而不是去除相同的染色体。看到区别了吗?该功能不会根据染色体的活力来区分它们。因此,在没有重复的单个副本中,只保留唯一的染色体。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| Alexander Agafonov 2010.08.26 11:28 #40 joo:PPPS 我再澄清一下,以防万一。非常感谢你的澄清,关于删除重复数据的问题已经得到了满意的答复。我在附件中附上了演示原始和优化功能的脚本代码,其中演示了减少循环次数的功能。在我当前的评论中,我并不是指出函数中的错误,而是建议对其进行优化,我的主要目的是找出重复删除的原理,我得到了全面的答复。再次感谢您提供的库和对函数的解释。 附加的文件: removalduplicatestest.mq5 8 kb 1234567891011...20 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
非常感谢作者提供的程序库!
在父搜索函数的循环中添加一行 "cnt++;",否则可能会进入永恒循环!
的确,在某些情况下,循环可能会变成无限循环--当种群中只有一个个体时。
感谢您的帖子,我很快就会进行修改。
PS 很可能是我忘了插入 cnt++,毕竟这是我输入这个变量的原因。:)
我记得我曾想用for() 运算符 来做循环,这样就可以调节搜索不同父代的 "持续性",但后来我改变了主意,觉得这样做没什么意义。
@joo 是否可以使用您的库来选择 Ishimoku、MAKD 等指标的参数?
如果您问:"对于哪些交易者的优化任务,无法使用该库?- 那我就不知道该怎么回答了。
当然可以。
如果您问:"哪些交易员的优化任务无法使用该库?- 那我就不知道该怎么回答了。
当然可以。
对不起,我的问题很愚蠢,我不是程序员。如果可能的话,请分享您的库用于为一个指标(如 Ishimoku、MAKD)选择多个参数的代码,以便更清楚地了解其工作原理。
这个问题一点也不蠢。
请使用文章中的第二个示例。用其他指标代替 ZZ 指标。在读取 ZZ 顶部的地方,您需要编写自己的条件(例如,MACD,您将获得相同的替代之字形,但根据您设置的规则)。这并不复杂。试试看,写写代码。如果失败了,可以提问,演示代码中有问题的地方。有兴趣的人会看到解决任务的方法,你和每个人都会从中受益。如果不想学习语言,请联系"工作"。
2joo:
您能告诉我 RemovalDuplicates() 函数的本质吗?问题如下:如果我们有两条相同的染色体,是应该将它们都标记为重复体,还是应该保留其中一条不标记为重复体以便继续使用?
另外,为了加快这个函数的运行速度,我建议 Ch2 循环从 Ch+1 开始,因为 Ch2 没有必要从零开始:
//Выбираем второй из пары...
for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
如果我的问题的答案是两条染色体都被标记为重复,那么用
do:
如果答案是一条染色体没有被标记为重复,那么 Ch2 循环就应该从 Ch+1 开始。
2joo:
您能告诉我 RemovalDuplicates() 函数的本质吗?问题如下:如果我们有两条相同的染色体,是将它们都标记为重复体,还是保留其中一条不标记为重复体以便继续使用?
该函数的算法如下:
我们用唯一性特征 "1 "标记所有染色体。我们认为所有染色体都是唯一的。
检查是否存在相同的染色体。为此,我们对群体进行虚拟复制,并将所有染色体相互比较,同时跳过序列号相同的染色体对。找到的重复染色体标记为重复特征 "0"。
接下来,将所有未标记为 "0 "的剩余染色体复制到临时数组中。这样,我们就得到了一个填满的、没有空隙的临时数组,同时也知道了种群中还剩下多少条唯一的染色体。
接下来,剩下的工作就是将染色体复制回群体中。正如你所看到的,没有染色体删除,唯一的染色体只是被移到了种群的起始位置。
要测试此功能,请编写一个脚本,并尝试手动输入填充阵列 的棘手组合。您将看到该函数的工作效率。计算数组中列的最小检查次数,并将其与 RemovalDuplicates() 函数检查列的次数进行比较。
ZY 若要测试此函数,请编写一个脚本,并尝试输入手工制作的填充数组的巧妙组合。您将看到该函数的有效/无效程度。计算数组中列的最小检查次数,并将其与 RemovalDuplicates() 函数检查列的次数进行比较。
在循环 "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|
因此只剩下一条唯一的染色体,其余的都是重复的,将在函数调用后被 "删除"。
在函数调用后被 "删除"。
在函数结束时
种群将变成这样
|10|9|7|6|5|4|3|2|
PPPS 我再澄清一下,以防万一。
非常感谢你的澄清,关于删除重复数据的问题已经得到了满意的答复。我在附件中附上了演示原始和优化功能的脚本代码,其中演示了减少循环次数的功能。在我当前的评论中,我并不是指出函数中的错误,而是建议对其进行优化,我的主要目的是找出重复删除的原理,我得到了全面的答复。再次感谢您提供的库和对函数的解释。