我正在尝试使用DARP Problem来解决Genetic Algorithm DLL。
事情就是这样,尽管它有时会提出正确的解决方案,但有时却没有。虽然我使用的是一个非常简单的问题版本。当我检查基因组时,算法评估我发现它评估了相同基因组的几倍。
为什么几次评估相同?如果没有效率会不会更高效?
答案 0 :(得分:2)
对同一染色体进行两次评估,并在一个种群(或不同种群)中使用相同的染色体不止一次之间存在差异。第一个可能是有用的避免;第二,也许不是。
考虑:
在某些一代G1中,你交配了0011和1100,将它们从中间穿过,变得幸运并且没有变异任何基因,最终得到0000和1111.你将它们变回来,将它们重新加入到人口中为下一代,并继续算法。
然后在一些后期的G2中,你在第一个索引处配对0111和1001并且(再次忽略突变)最终得到1111和0001.其中一个已经被评估过,那么为什么要再次评估呢?特别是如果评估该函数非常昂贵,那么如果你能负担得起内存,最好保留一个哈希表(或其他一些表)来存储以前评估的结果。
但是!仅仅因为你已经为染色体生成了一个值并不意味着你不应该在结果中自然地包含它,允许它进一步变异或允许它与同一群体的其他成员交配。如果你不这样做,你就会有效地惩罚成功,这与你想做的完全相反。如果染色体一代又一代地持续存在或重新出现,那么这是一个很好的解决方案,它是一个很好的解决方案,如果它是局部最大值而不是全局最大值,那么精心挑选的变异算子将会驱动它。
答案 1 :(得分:1)
为什么遗传算法可能会对同一个体进行评估的基本解释正是因为它是非指导性的,所以可以预期重现以前看到的(或同时看到的)基因组。
更有用的是,您的问题可以解释为两个不同的事情:
与评估适应度函数相关的高成本,可以通过散列基因组来缓解,但可以通过记忆来进行折衷。这是可以想象的,但我从未见过它。通常,GA会搜索高维空间,因此您最终会得到一个非常稀疏的哈希值。
一个群体,其中许多或所有成员已经融合到一个或几个模式:在某些时候,你的基因组的多样性将倾向于0.这是预期的结果,因为算法已经融合到最好的它找到的解决方案。如果这种情况发生得太早,结果平庸,则表明您陷入了局部最低限度,并且您过早地失去了多样性。
在这种情况下,研究输出以确定两种情况中的哪一种发生了:
在前一种情况下,你必须保持多样性。确保不太适合的个体获得更多机会,可能通过减少营业额或缩放适应度函数。
在后一种情况下,你必须增加多样性。确保向群体注入更多随机性,可能是通过提高突变率或增加营业额。
(当然,在这两种情况下,当GA在解决方案领域融合时,你最终做希望多样性降低。所以你不只是想“打开所有拨号”和转入蒙特卡罗搜索。)
答案 2 :(得分:0)
基本遗传算法由
组成每一步都
当algorythm达到适应度函数的阈值时,或者如果在最后K次迭代中没有人口变化,则algorythm停止。
因此,它可能会停止在最佳解决方案,但在本地最大值。
一部分人口可以从一次迭代到另一次迭代保持不变,因为它们可以具有良好的适应度函数值。 由于突变,也有可能“退回”普遍的基因组。
有许多技巧可以让遗传算法更好地工作:选择适当的种群编码到基因组中,找到一个良好的适应度函数,玩交叉和变异比率。
答案 3 :(得分:0)
根据遗传算法的具体情况,您可能在连续群体中具有相同的基因组。例如,精英主义从每个群体中保存最佳或 n 最佳基因组。
从计算的角度来看,重新评估基因组是低效的。避免这种情况的最简单方法是为每个基因组放置一个布尔HasFitness
标志。您还可以为每个基因组编码创建唯一的字符串键,并将所有适应值存储在字典中。这种查找可能会非常昂贵,所以只有在您的健身功能足够昂贵以保证查找费用增加时才会建议这样做。
答案 4 :(得分:0)
除了精英主义之外,GA不会反复评估相同的基因组。您所看到的是相同的基因组被重新生成和重新评估。这是因为每一代都是一组新的基因组,以前可能已经或未曾进行过评估。
为避免重新评估,您需要保留已生成的基因组列表及其适应性。要访问适应性,您需要将每个新种群与列表进行比较,当它不在列表中时,您需要对其进行评估,并将其添加到列表中。
由于真实世界的应用程序有数千个参数,最终会有数百万个存储的基因组。然后搜索和搜索变得非常昂贵。保持。因此,每次评估基因组可能更快。