【问题标题】:Genetic/Evolutionary algorithm - Painter遗传/进化算法 - Painter
【发布时间】:2014-01-01 07:08:47
【问题描述】:

我的任务:

创建一个程序以仅使用图元(如三角形或其他东西)复制图片(作为输入给出)。程序应该使用进化算法来创建输出图片。


我的问题:

我需要发明一种算法来创建种群并检查它们(它们与输入图片的匹配程度有多少 - 以 % 为单位)。 我有个主意;你可以在下面找到它。

那么我想从你这里得到什么:建议(如果你觉得我的想法还不错)或灵感(也许你有更好的想法?)


我的想法:

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

我的第一个种群是 P 图片(使用 T 随机生成的三角形生成 - 称为元素)。

我通过我的适应度函数检查人口中的每张图片,并选择其中的 E 作为精英,其余人口只是删除:

    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) 坐标或他的节点)。

所以这是我的想法……我没有测试它,也没有编码。 请检查我的想法 - 你怎么看?

【问题讨论】:

  • 您可能会尝试改变目标函数,以便在开始时您尝试匹配比单个像素更大的补丁。也许应用一个过滤器来粗化图片和候选者,你可以进行交配和变异,这样一个补丁中的所有元素都会被移动。您逐渐减小补丁的大小,直到达到像素。 (现在我想起来了,这就像在遗传算法中使用模拟退火。)
  • This blog post 似乎详细说明了您要实现的目标,尽管他没有在每一步从总体中进行选择,只是将其与上一次迭代进行比较。这对我来说更像是模拟退火,而不是任何遗传,但我认为查看它对你来说是有价值的。

标签: algorithm genetic-algorithm evolutionary-algorithm


【解决方案1】:

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

另一个问题是您提出的再生算子(即交叉操作)。为了让进化过程高效工作,你需要达到合理的探索和利用平衡。这样做的一种方法是拥有一组表现出良好适应度相关性 [1]的生殖算子,这意味着孩子的适应度必须接近其父母。

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

还有一件事,对于变异运算符,当你说时

...在子元素中进行随机更改(通过随机数更改他的颜色,或将随机数添加到他的 (x,y) 坐标 - 或他的节点)

使用高斯分布来改变颜色、坐标等是个好主意。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 2015-02-18
    • 2013-07-02
    • 2022-01-25
    • 1970-01-01
    • 2011-02-22
    • 2020-06-10
    相关资源
    最近更新 更多