我的任务:遗传/进化算法 - 画家
创建使用原语只(如三角形或东西)一个程序复制的图片(作为输入)。该程序应该使用演化算法来创建输出图片。
我的问题:
我需要创造的算法,创建人口和检查他们(多少 - 以% - 他们输入图像匹配)。我有一个想法;你可以在下面找到它。
所以,我从你想要的:建议(如果你发现我的想法不是那么糟糕),或灵感(也许你有更好的想法?)
我的想法:
假设我只使用三角形来构建输出图片。
我的第一群是P图片(通过使用Ť随机生成的三角形产生 - 称为元件)。
我检查我的适应度函数的人口每天的照片,并选择其中电子精英和人口的其余部分只是删除:
To compare 2 pictures we check every pixel in picture A and compare his R,G,B with
the same pixel (the same coordinates) in picture B.
I use this:
SingleDif = sqrt[ (Ar - Br)^2 + (Ag - Bg)^2 + (Ab - Bb)^2]
then i sum all differences (from all pixels) - lets call it SumDif
and use:
PictureDif = (DifMax - SumDif)/DifMax
where
DifMax = pictureHeight * pictureWidth * 255*3
最好使用这种方式来创建下一个人群:
picture MakeChild(picture Mother, picture Father)
{
picture child;
for(int i = 0; i < T; ++i)
{
j //this is a random number from 0 to 1 - created now
if(j < 0.5) child.element(i) = Mother.element(i);
else child.element(i) = Father.element(i)
if(j < some small %) mutate(child.element(i));
}
return child;
}
所以它很简单。只有变异需要评论:因此,小孩中的元素X与父母中的X不同的概率总是很小。为此,我们对子元素进行随机更改(通过随机数改变其颜色,或将随机数添加到他的(x,y)坐标或他的节点)。
所以这是我的想法...我没有测试它,没有编码。 请检查我的想法 - 你对此有何看法?
你也许可以尝试改变目标函数,以便在开始时尝试匹配比单个像素更大的补丁。也许应用过滤器以使图片和候选人变得粗糙,并且可以以这样的方式进行交配和变异,即一个这样的补丁内的所有元素都会被移动。逐渐减小补丁的大小,直到达到像素。 (现在我想起它,就像在遗传算法中使用模拟退火一样。) – Fortunato
[This blog post](http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)似乎详细描述了你想要达到的目标,尽管他没有从每一步中的人口中选择,只是将它与以前的迭代进行比较。这种感觉更像是模拟退火,而不是遗传给我的任何东西,但是我认为仔细观察它会对你有价值。 –