GA - 진화하는 프로그램 언어

1. 개요

DNA는 단 4개의 코드가 연속된 구조를 가지고 있습니다. t-RNA는 이러한 DNA를 3마디씩 해석해서 여러가지 일을 하고 있습니다. 즉 DNA는 4개의 코드 3마디 - 64개의 명령어를 가진(물론 상당한 명령어가 중복) 프로그램 언어라고 할 수 있죠.

이러한 DNA를 본떠서 유전자 알고리즘용 프로그램 언어를 만들어 봤습니다.


2. 명령어

최초, 이 언어는 임의로 만들어진 2048개 길이의 바이트 배열입니다. 이런 식으로 말이죠.

0x0E 0x6D 0x8A 0xF3 0x3E 0xAD 0xB7 0xCD 0x08 0xBE 0x37 0x78 0x27 0x8A 0x23 ...

각 코드는 몇개의 명령어에 대응합니다. 이때 명령어 코드는 중복될 수 있으며(ex : 0x0F, 0x2D, 0x70 등이 같은 명령어) 이 명령어는 프로그램 실행시 임의로 배정됩니다.

각 명령어에는 이런 것들이 있습니다.


Jump Mask Arg
Jump 명령어를 만나면 이 명령어로부터 앞뒤로, Mask와 연산한 결과가 Arg와 같은 바이트들을 탐색합니다. 가장 가까운 바이트를 찾아서 그곳으로 제어를 옮기게 됩니다.

MemorySet MemPos Value
MemoryInc MemPos Value
MemoryDec MemPos Value
이 시스템에는 32개의 내부변수를 가지고 있습니다. 이 명령어는 MemPos로부터 메모리 위치를 계산한 후, Value값을 넣거나 그만큼 증가 또는 감소시킵니다.


IfGreater MemPos Value Jump Mask Arg
IfLess MemPos Value Jump Mask Arg
조건에 따라 분기를 하는 명령어입니다. MemPos의 메모리값과 Value를 비교해서 조건에 맞으면 뒤의 Jump명령어를 실행, 맞지 않으면 무시하는 명령어입니다.

3. 재생산 & 돌연변이

이런 몇개 안되는 명령어를 가지고 예전에 했었던 꼬마자동차에 실어 실행했습니다. 그 결과를 가지고 재생산을 해야겠죠. 원래 DNA에서 착안한 것이라 재생산에서도 DNA의 재생산을 참고했습니다.

복제야 그냥 복사만 하면 되고 교차 역시 코드를 둘로 끊어 붙이면 됩니다.

A A A A A A A A A A A A A A A A
B B B B B B B B B B B B B B B B

A A A A A A A A B B B B B B B B
B B B B B B B B A A A A A A A A


돌연변이는 다음과 같습니다.

1. 일반적인 돌연변이 : 코드의 각 비트(바이트 아님)마다 일정확률로 반전

2. 결실 : 코드의 일정 영역을 제거

3. 중복 : 코드의 일정 영역을 다시한번 복사

4. 역위 : 코드의 일정영역 두군데가 위치가 바뀜

4. 메모리 & 입출력

위에서 언급했듯 이 시스템에는 32개의 int형 메모리를 가지고 있습니다. 프로그램은 Memory관련 명령어로 이 메모리를 갱신할 수도 있고 If관련 명령어로 이 메모리를 꺼내 사용할 수 있습니다.

외부 상태 - 자동차 앞 3부분의 장애물 여부 - 는 항상 메모리 앞쪽의 세개에 적용됩니다.

한편 뒤쪽의 세개 메모리의 값을 가지고 자동차의 움직임을 결정합니다.


5 결과

이와 같은 프로그램을 돌려서 자동차가 움직입니다. 만약 장애물에 걸린다면(장애물로 들어가려 한다면) 그 자리에서 움직이지 못합니다.

가장 많이 진행한 자동차를 중심으로 3000세대 번식시킨 결과들의 일부입니다.





여기서 볼 수 있듯 정체상태에서도 내부에서 꾸준히 유전자의 재조합이 일어나고 있습니다. 그러다가 장애물을 돌파할 수 있는 유전자가 발견되면 그것에 의해 적응도가 튀어오르는 계단식 진화 - 단속평형적 진화 - 가 일어나고 있는 것을 볼 수 있습니다. 시간이 더 있었다면 더 먼 거리를 이동할 수 있는 자동차가 나왔을지도 모르겠네요.