Gil*_*ili 11 genetic-algorithm evolutionary-algorithm
Roger Alsing编写了一个使用C#重建蒙娜丽莎的进化算法.他的算法很简单:
有一个名为Watchmaker的Java进化算法框架.作者使用真正的遗传算法重新实现了蒙娜丽莎问题:http://watchmaker.uncommons.org/examples/monalisa.php
它开始时已经足够好了,但是在30分钟内,制表师的实现停滞不前,而罗杰的实现看起来接近完成.我试着玩这些设置,但它没有多大帮助.为什么Watchmaker的实现比Roger慢得多,为什么它会停滞不前?
链接:
Gil*_*ili 14
我在过去的一个月里研究过这个问题并做了一些有趣的发现:
我修改了健身分数以删除隐藏的多边形(纯粹出于性能原因):
fitness += candidate.size();
这意味着健身分数永远不会达到零.
我已将多边形的最大数量从50增加到65535.
当我第一次尝试运行Watchmaker的Mona Lisa示例时,它会运行数天而不会看起来与目标图像有任何关系.罗杰的算法更好但一小时后仍然停滞不前.使用新算法,我设法在不到15分钟内重新创建目标图像.健身分数读数为150,000,但肉眼看来候选人几乎与原始人相同.
我整理了一个诊断显示,向我展示了随着时间推移而变化的整个人口.它还告诉我在任何给定时间有多少独特候选人在人口中活跃.数字较小表示缺乏差异.人口压力太高或突变率太低.根据我的经验,一个体面的人口至少有50%的独特候选人.
我使用这个诊断显示来调整算法.每当独特候选者的数量太少时,我就会增加突变率.每当算法停滞太快时,我都会检查人口中发生了什么.我经常注意到突变量太高(颜色或顶点移动得太快).
我很高兴我在过去一个月里研究过这个问题.它教会了我很多关于GA的本质.它与设计有很多关系,而不是代码优化.我还发现,观察整个人口实时演变是非常重要的,而不是只研究最适合的候选人.这使您可以相当快速地发现哪些突变有效以及您的突变率是否过低或过高.
我还学到了另一个重要的教训,即如何为健身评估者提供与用户所示完全相同的图像,这一点非常重要.
如果你回想起我报告的原始问题是候选图像在评估之前被缩小,从而允许许多像素避免检测/校正.昨天我为显示给用户的图像启用了抗锯齿功能.我想只要评估者看到100%的像素(没有缩放)我应该是安全的,但事实证明这还不够.
看看下面的图片:
启用抗锯齿:

禁用抗锯齿:

它们显示启用和禁用抗锯齿的完全相同的候选项.请注意消除锯齿版本如何在整个面部出现"条纹"错误,类似于我在缩放候选人时看到的问题.事实证明,候选者有时会包含多边形,这些多边形会以"条纹"(以子像素精度渲染的多边形)的形式将错误引入图像.有趣的是,别名会抑制这些错误,因此评估程序功能无法看到它.因此,用户会看到一大堆错误,健身功能永远无法修复.听起来很熟悉?
总之:您应该始终(始终!)将健身功能传递给您向用户显示的完全相同的图像.比抱歉更安全:)
遗传算法很有趣.我鼓励你自己和他们一起玩.