내 작업 :유전/진화 알고리즘 - 화가
만 (삼각형이나 뭐 같은) 프리미티브를 사용 (입력으로 주어진) 사진을 복사하는 프로그램을 작성합니다. 프로그램은 진화 알고리즘을 사용하여 출력 그림을 만들어야합니다.
내 질문 : 나는 인구를 생성하고이를 확인하는 알고리즘을 발명 할 필요가
(얼마나 - %에 - 그들은 입력 그림과 일치). 아이디어가 있습니다. 당신은 그것을 아래에서 찾을 수 있습니다.
그래서 나는 당신에게서 원하는 : 조언을 영감 (내 생각이 그렇게 나쁘지을 찾을 경우) (어쩌면 당신이 더 나은 아이디어가?)
내 생각 :
출력 그림을 만들기 위해 삼각형 만 사용한다고 가정 해 보겠습니다.
은 나의 첫 번째 인구는 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) 좌표 또는 노드에 추가).
내 생각에 ... 테스트하지 않았고 코드를 작성하지 않았습니다. 제 아이디어를 확인하십시오 - 그것에 대해 어떻게 생각하십니까?
처음에는 하나의 픽셀보다 큰 패치를 맞추려고 목적 함수를 변경하려고 할 수 있습니다. 어쩌면 필터를 적용하여 그림과 후보자를 거칠게 만들 수 있으며 그러한 패치 내의 모든 요소가 이동하는 방식으로 짝짓기 및 변이를 수행 할 수 있습니다. 픽셀을 얻을 때까지 점차적으로 패치의 크기를 줄입니다. (이제 생각해 보면 유전자 알고리즘 내에서 시뮬레이션 된 어닐링을 사용하는 것과 같습니다.) – Fortunato
[이 블로그 게시물] (http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /)는 각 단계에서 인구를 선택하지는 않지만 달성하려는 목표를 자세히 묘사 한 것으로 이전 반복과 비교합니다. 그것은 나에게 유전적인 것보다 시뮬레이션 어닐링 (simulated annealing)과 같은 느낌이 들지만 그럼에도 불구하고 그것이 당신에게 가치 있다고 생각합니다. –