2013-12-13 3 views
6

내 작업 :유전/진화 알고리즘 - 화가

만 (삼각형이나 뭐 같은) 프리미티브를 사용 (입력으로 주어진) 사진을 복사하는 프로그램을 작성합니다. 프로그램은 진화 알고리즘을 사용하여 출력 그림을 만들어야합니다.


내 질문 : 나는 인구를 생성하고이를 확인하는 알고리즘을 발명 할 필요가

(얼마나 - %에 - 그들은 입력 그림과 일치). 아이디어가 있습니다. 당신은 그것을 아래에서 찾을 수 있습니다.

그래서 나는 당신에게서 원하는 : 조언을 영감 (내 생각이 그렇게 나쁘지을 찾을 경우) (어쩌면 당신이 더 나은 아이디어가?)


내 생각 :

출력 그림을 만들기 위해 삼각형 만 사용한다고 가정 해 보겠습니다.

은 나의 첫 번째 인구는 P (- 요소라는 T 무작위로 생성 된 삼각형을 사용하여 생성) 사진입니다. 최선이 방법으로 다음의 인구를 만드는 데 사용되는

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 

:

난 그냥 제거 내 피트니스 기능에 의해 확인 인구의 모든 사진과 엘리트 및 인구의 나머지로의 E를 선택

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

[이 블로그 게시물] (http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)는 각 단계에서 인구를 선택하지는 않지만 달성하려는 목표를 자세히 묘사 한 것으로 이전 반복과 비교합니다. 그것은 나에게 유전적인 것보다 시뮬레이션 어닐링 (simulated annealing)과 같은 느낌이 들지만 그럼에도 불구하고 그것이 당신에게 가치 있다고 생각합니다. –

답변

2

나는 각 자식의 패치 수를 동적으로 만들 것이고 약간의 확률로 패치를 삽입/삭제하기 위해 돌연변이 연산을 얻을 것이다. 물론 이것은 어린이의 게놈에 많은 중복성과 부풀림을 초래할 수 있습니다. 이러한 상황에서는 일반적으로 개인의 게놈 길이를 피트 니스 기능의 매개 변수로 사용하여 적은 수의 패치를 사용하여 개인이 더 높은 적합도 값으로 보상을 받도록하는 것이 좋습니다. 예를 들어 개인 A와 B의 PictureDif가 동일하지만 A가 B보다 패치 수가 적 으면 A의 적합도가 높아집니다.

또 다른 문제는 제안한 재생산 연산자 (즉, 교차 작동)입니다. 진화 과정이 효율적으로 작동하려면 합리적인 탐사와 착취 균형을 달성해야합니다. 이렇게하는 한 가지 방법은 좋은 적합성 상관 관계를 나타내는 일련의 생식 기관을 갖는 것입니다. 이는 아동의 적합성이 부모의 적합성에 따라이되어야 함을 의미합니다.

단일 부모 복제의 경우 올바른 돌연변이 매개 변수를 찾아야합니다. 그러나 다 모체 복제 (크로스 오버)에 관해서는 자주 사용되는 기술 중 하나는 동일한 두 부모로부터 2 명의 아동 (1 명 대신)을 산출하는 것입니다. 첫 번째 아이에게는 각 유전자가 0.2의 확률로, 0.8의 확률을 가진 아버지로부터, 그리고 두 번째 아이는 다른 방향으로 주위에서 나온다. 물론 교차 후, 당신은 돌연변이를 할 수 있습니다.

아, 그리고 한 가지 더, 돌연변이 사업자, 당신이 말할 때

... 수 있도록 아이 요소 임의 변경 (임의의 숫자에 의해 자신의 색을 변경하거나 임의의 숫자를 추가 그의 (X, Y) 좌표 - 또는 그의 노드)

그것은 색상을 변경하는 가우스 분포을 사용하는 것이 좋습니다 등 좌표

[1] 진화 연산 : Kenneth A. De Jong의 통일 된 접근법 페이지 69