2013-12-13 59 views
6

我的任务:遗传/进化算法 - 画家

创建使用原语只(如三角形或东西)一个程序复制的图片(作为输入)。该程序应该使用演化算法来创建输出图片。


我的问题:

我需要创造的算法,创建人口和检查他们(多少 - 以% - 他们输入图像匹配)。我有一个想法;你可以在下面找到它。

所以,我从你想要的:建议(如果你发现我的想法不是那么糟糕),或灵感(也许你有更好的想法?)


我的想法:

假设我只使用三角形来构建输出图片。

我的第一群是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)坐标或他的节点)。

所以这是我的想法...我没有测试它,没有编码。 请检查我的想法 - 你对此有何看法?

+0

你也许可以尝试改变目标函数,以便在开始时尝试匹配比单个像素更大的补丁。也许应用过滤器以使图片和候选人变得粗糙,并且可以以这样的方式进行交配和变异,即一个这样的补丁内的所有元素都会被移动。逐渐减小补丁的大小,直到达到像素。 (现在我想起它,就像在遗传算法中使用模拟退火一样。) – Fortunato

+2

[This blog post](http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)似乎详细描述了你想要达到的目标,尽管他没有从每一步中的人口中选择,只是将它与以前的迭代进行比较。这种感觉更像是模拟退火,而不是遗传给我的任何东西,但是我认为仔细观察它会对你有价值。 –

回答

2

我会使每个孩子的动态补丁数量变化,并获得变异操作以插入/删除具有某些(低)概率的补丁。当然,这可能会导致儿童基因组中的冗余和膨胀。在这些情况下,使用个体基因组的长度作为适应度函数的参数通常是一个好主意,这样个人可以获得奖励(具有更高的适应值),以便使用更少的补丁。例如,如果个人A和B的PictureDif相同,但A的补丁少于B,则A具有更高的适应性。

另一个问题是你提出的繁殖算子(即交叉操作)。为了使演化过程高效工作,您需要实现合理的勘探和开采平衡。这样做的一种方式是让一组生殖操作者展现良好的适合度相关性 [1],这意味着对于其父母的适应度,子女的适合度必须为关闭

在单亲繁殖的情况下,您只需要找到正确的突变参数。然而,当涉及到多父母再生产(交叉)时,常用的技术之一是从同一个2位父母中产生2个孩子(而不是1个)。对于第一个孩子来说,每个基因来自母亲的概率为0.2,父亲的概率为0.8,而第二个孩子则以相反的概率出现。当然,在交叉之后,你可以做突变。

哦,还有一两件事,对于变异操作,当你说

...让随机变化在元素的孩子(由随机数改变自己的颜色,或添加随机数到他(X,Y)坐标 - 或者他的节点)

它使用高斯分布改变颜色是个好主意,协调等

[1]进化计算:Kenneth A. De Jong的统一方法,第69页