我的任務:遺傳/進化算法 - 畫家
創建使用原語只(如三角形或東西)一個程序複製的圖片(作爲輸入)。該程序應該使用演化算法來創建輸出圖片。
我的問題:
我需要創造的算法,創建人口和檢查他們(多少 - 以% - 他們輸入圖像匹配)。我有一個想法;你可以在下面找到它。
所以,我從你想要的:建議(如果你發現我的想法不是那麼糟糕),或靈感(也許你有更好的想法?)
我的想法:
假設我只使用三角形來構建輸出圖片。
我的第一羣是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)座標或他的節點)。
所以這是我的想法...我沒有測試它,沒有編碼。 請檢查我的想法 - 你對此有何看法?
你也許可以嘗試改變目標函數,以便在開始時嘗試匹配比單個像素更大的補丁。也許應用過濾器以使圖片和候選人變得粗糙,並且可以以這樣的方式進行交配和變異,即一個這樣的補丁內的所有元素都會被移動。逐漸減小補丁的大小,直到達到像素。 (現在我想起它,就像在遺傳算法中使用模擬退火一樣。) – Fortunato
[This blog post](http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)似乎詳細描述了你想要達到的目標,儘管他沒有從每一步中的人口中選擇,只是將它與以前的迭代進行比較。這種感覺更像是模擬退火,而不是遺傳給我的任何東西,但是我認爲仔細觀察它會對你有價值。 –