GA - 나무형유전자와 LISP

1. 개요
지금까지는 1차원(선형)유전자 또는 2차원(평면)유전자만을 다루어 왔습니다. 그리고 모두 데이터를 유전자화시켜 최적의 데이터조합을 찾기 위해 유전자알고리즘을 사용해 왔습니다.

그에 반해 이번에 소개할 '진화 알고리즘'은, 데이터가 아니라 프로그램 자체를 진화시키는 방식입니다. 방식은 똑같습니다. 임의로 만든 프로그램으로부터 시작해서 조금이라도 잘 돌아가는 프로그램들을 재생산하여 목적에 맞는 프로그램을 진화시키는 것입니다.
물론 모든 프로그램을 그렇게 진화시킬 수 있는 것은 아닙니다. 진화시키기에 가장 적당한 언어는 리스프(LISP)입니다. 왜냐하면 리스프 프로그램은 다음과 같이 트리구조로 바꾸기에 가장 적당한 언어이기 때문입니다.

(defun prime (x)
.. (do ((num 2 1))
...... ((> (* num num) x) 0)
...... (setq d (/ x num))
......
(setq t (* d num))
...... (if (= t x)
.......... (return nil)
...... )
.. )
)

2. 교차
이렇게 프로그램을 나무형으로 변환했지만 이 프로그램을 '진화'시키기 위해서는 진화연산 - 교차와 돌연변이가 필요합니다.
1차원이나 2차원유전자의 교차에서 유전자 일부를 교환했던 것처럼 나무형 유전자 역시 유전자 일부를 교환함으로써 교차를 할 수 있습니다. 즉 다음 그림과 같이 임의의 가지를 교환함으로써 교차를 실행할 수 있습니다.3. 돌연변이
나무형 유전자의 돌연변이에는 다음과 같은 여러가지가 있습니다.
3.1 가지추가
3.2 순서교환
3.3 가지삭제

댓글 없음:

댓글 쓰기