Algorithm 遗传/进化算法-Painter

Algorithm 遗传/进化算法-Painter,algorithm,genetic-algorithm,evolutionary-algorithm,Algorithm,Genetic Algorithm,Evolutionary Algorithm,我的任务: 创建一个程序,仅使用基本体(如三角形或其他)复制图片(作为输入)。程序应使用进化算法创建输出图片 我的问题: 我需要发明一种算法来创建种群并检查它们(它们与输入图片的匹配程度)。 我有一个想法;你可以在下面找到它 那么我想从你那里得到什么:建议(如果你觉得我的想法还不错)或灵感(也许你有更好的想法?) 我的想法: 假设我只使用三角形来构建输出图片 我的第一个群体是p图片(使用T随机生成的三角形生成,称为元素) 我通过我的健身功能检查人群中的每一张图片,并选择其中的E张作为精英,其

我的任务:

创建一个程序,仅使用基本体(如三角形或其他)复制图片(作为输入)。程序应使用进化算法创建输出图片


我的问题:

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

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


我的想法:

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

我的第一个群体是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;
    }
picture-MakeChild(图片母亲,图片父亲)
{
图画儿童;
对于(int i=0;i
所以很简单。只有突变需要注释:所以孩子身上的X元素和他父母身上的X元素总是有一些小概率的不同。为了做到这一点,我们在child中的元素中进行随机更改(通过随机数更改其颜色,或将随机数添加到其(x,y)坐标-或其节点)

这就是我的想法。。。我没有测试它,没有编写代码。
请检查我的想法-你怎么看?

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

另一个问题是您提出的繁殖操作符(即交叉操作)。为了使进化过程有效地工作,您需要实现合理的探索和开发平衡。实现这一点的一种方法是让一组生殖算子表现出良好的适应度相关性[1],这意味着孩子的适应度必须与其父母的适应度接近

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

还有一件事,对于变异算子,当你说

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

最好使用高斯分布来更改颜色、坐标等


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

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