我的任务:
创建一个程序,仅使用基元(如三角形或其他东西)复制图片(作为输入)。程序应该使用进化算法来创建输出图像。
我的问题:
我需要发明一种算法来创建种群并检查它们(多少 - 以%表示 - 它们与输入图像匹配)。 我有个主意;你可以在下面找到它。
所以我想要你: 建议(如果你发现我的想法不那么糟糕)或灵感(也许你有更好的主意?)
我的想法:
假设我只使用三角形来构建输出图片。
我的第一个人群是 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)坐标 - 或他的节点)。
所以这是我的想法......我没有测试它,没有编码。 请检查我的想法 - 你怎么看?
答案 0 :(得分:2)
我会使每个子节点的补丁数量动态化并获得变异操作以插入/删除具有一些(低)概率的补丁。当然,这可能会导致孩子基因组中的大量冗余和膨胀。在这些情况下,通常使用个体基因组的长度作为适应度函数的参数是个好主意,以便个体获得奖励(具有更高的适应值)以使用更少的补丁。因此,例如,如果个体A和B的PictureDif相同但A的补丁少于B,则A具有更高的适应度。
另一个问题是您提出的生殖操作员(即交叉操作)。为了使进化过程高效运作,您需要实现合理的勘探和开发平衡。这样做的一种方法是通过一组具有良好适应性相关性的生殖操作员 [1],这意味着孩子的健康必须接近以适应其父母。
在单亲繁殖的情况下,您只需要找到正确的突变参数。然而,当涉及多父母繁殖(交叉)时,一种常用的技术是从同一2个父母中产生2个孩子(而不是1个)。对于第一个孩子,每个基因来自母亲,概率为0.2,父亲来自概率为0.8,而第二个孩子来自另一个方向。当然,在交叉之后,你可以做突变。
哦,还有一件事,对于变异算子,当你说
时...在子元素中进行随机更改(通过随机数更改颜色,或将随机数添加到他的(x,y)坐标 - 或其节点)
使用高斯分布来改变颜色,坐标等是个好主意。
[1]进化计算:Kenneth A. De Jong的统一方法,第69页