【发布时间】: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