2013-12-13 40 views
6

我的任務:遺傳/進化算法 - 畫家

創建使用原語只(如三角形或東西)一個程序複製的圖片(作爲輸入)。該程序應該使用演化算法來創建輸出圖片。


我的問題:

我需要創造的算法,創建人口和檢查他們(多少 - 以% - 他們輸入圖像匹配)。我有一個想法;你可以在下面找到它。

所以,我從你想要的:建議(如果你發現我的想法不是那麼糟糕),或靈感(也許你有更好的想法?)


我的想法:

假設我只使用三角形來構建輸出圖片。

我的第一羣是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)座標或他的節點)。

所以這是我的想法...我沒有測試它,沒有編碼。 請檢查我的想法 - 你對此有何看法?

+0

你也許可以嘗試改變目標函數,以便在開始時嘗試匹配比單個像素更大的補丁。也許應用過濾器以使圖片和候選人變得粗糙,並且可以以這樣的方式進行交配和變異,即一個這樣的補丁內的所有元素都會被移動。逐漸減小補丁的大小,直到達到像素。 (現在我想起它,就像在遺傳算法中使用模擬退火一樣。) – Fortunato

+2

[This blog post](http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)似乎詳細描述了你想要達到的目標,儘管他沒有從每一步中的人口中選擇,只是將它與以前的迭代進行比較。這種感覺更像是模擬退火,而不是遺傳給我的任何東西,但是我認爲仔細觀察它會對你有價值。 –

回答

2

我會使每個孩子的動態補丁數量變化,並獲得變異操作以插入/刪除具有某些(低)概率的補丁。當然,這可能會導致兒童基因組中的冗餘和膨脹。在這些情況下,使用個體基因組的長度作爲適應度函數的參數通常是一個好主意,這樣個人可以獲得獎勵(具有更高的適應值),以便使用更少的補丁。例如,如果個人A和B的PictureDif相同,但A的補丁少於B,則A具有更高的適應性。

另一個問題是你提出的繁殖算子(即交叉操作)。爲了使演化過程高效工作,您需要實現合理的勘探和開採平衡。這樣做的一種方式是讓一組生殖操作者展現良好的適合度相關性 [1],這意味着對於其父母的適應度,子女的適合度必須爲關閉

在單親繁殖的情況下,您只需要找到正確的突變參數。然而,當涉及到多父母再生產(交叉)時,常用的技術之一是從同一個2位父母中產生2個孩子(而不是1個)。對於第一個孩子來說,每個基因來自母親的概率爲0.2,父親的概率爲0.8,而第二個孩子則以相反的概率出現。當然,在交叉之後,你可以做突變。

哦,還有一兩件事,對於變異操作,當你說

...讓隨機變化在元素的孩子(由隨機數改變自己的顏色,或添加隨機數到他(X,Y)座標 - 或者他的節點)

它使用高斯分佈改變顏色是個好主意,協調等

[1]進化計算:Kenneth A. De Jong的統一方法,第69頁