갑자기 생각나는것이 있는데 마침 시간도 있어서 메트렙으로 가상의 세계를 만들어 보았습니다.
재미삼아 만들어본다는게 뜻하지 않게 1주일이나 걸렸네요.
그런데 정작 만든것은 코드 400줄 정도 밖에 안되는 (주석빼고, 코드 좀더 효율적으로 짜면 200줄이 않될지도) 간단한 세상입니다.
이 세계의 기반은 1000x1000pixel의 에너지가 있는 땅이며,
땅 위에서의 그 에너지로 부터의 1x1pixel의 식물들이 있고,
마지막으로 1x1pixel의 동물들이 있습니다.
각각의 동물들에게는 에너지와 관련된 무작위의 이동성향이 부여됩니다.
동물은 그 성향을 바탕으로, 자기가 가지고 있는 에너지를 사용하여 다른 곳으로 이동하게 되며,
그러다가 식물을 만나게 되면 그 식물을 먹고 에너지를 모읍니다.
그러나 때로는 계속 식물을 만나지 못하면 그 동물은 에너지가 고갈되어 굶어 죽습니다.
반면에 돌아다니다가 다른 다른 동물을 만나게 되면 그 동물과 싸우게 됩니다.
이 싸움에서 승자는 에너지가 많은 쪽이며, 승자는 패자의 에너지를 흡수하며, 패자는 잡아 먹혀 죽습니다.
동물의 행동이 이런식으로 진행되다가 일정수준의 에너지를 확보한 동물은 자신과 동일한 이동성향을 가진 자손,
또는 자신과 동일한 성향에다가 추가된 pixel로 복잡성이 증가한 진화된(?) 자손을 번식할수 있습니다.
(아직 단성생식만이 존재하는 세상임, 양성생식은 추후에)
이렇게 해서세상을 작동시키면 결국 살아남는 동물이 있고 죽는 동물이 있을 것인데,
이런 헛짓거리를 시작하게된 동기이자 최종적으로 보고자하는 결과는 잘 진화를 해서 살아남는 놈들의 pixel모양 및 이동성향 정보입니다.
처음에 무작위의 1pixel로 시작된 동물이 어쩌다 잘 살아남게 되면 자신의 기존 정보와 함께 무작위의 방식으로 pixel수도 늘릴텐데
복잡성이 증가한 그pixel의 형태나 정보에서(처음 설정된 땅의 에너지 패턴에 의해 결정되는) 어떤 규칙을 볼수 있지는 않을까 하는 겁니다.
한마디로, 이 가상 세계는 무작위에서 시작해서 무작위로 진행되는 과정에서 어쩌면 규칙이 발견될수 있지도 않을까해서 만들어 본 것입니다.
1. 먼저 땅을 만듭니다.
땅의 크기는 1000x1000pixel로 설정하였습니다.
빨간색은 땅의 에너지 손실률을 나타냅니다.
빨간색이 진할수록 그 영역에서의 동물은 에너지 손실은 더 큽니다.
파랑색은 식물이 존재할 가능성을 나타냅니다.
파랑색이 진할수록 식물이 존재할 가능성이 큽니다.
초록색은 존재하는 식물이 가지고 있는 에너지의 양을 나타냅니다.
초록색이 진할수록 식물이 (존재한다면) 가지고 있는 에너지의 양이 큽니다.
이렇게 하여 그냥 순전히 임의로 설정된 것이기는 하지만 땅이 만들어 졌습니다.
2. 다음으로 식물을 만듭니다.
만들려는 세상에서의 주인공은 동물인지라 식물은 그냥 동물의 에너지 공급원 그 이상도 아니고 그 이하도 아닌걸로 설정하였습니다.
무작위값과 앞서 에너지와 관련된 땅의 설정으로 부터 10000여개 식물의 위치와, 보유 에너지의 크기(최대 1)를 설정하였습니다.
앞서의 에너지 소모정도를 나타낸 빨간색 땅 위에 식물의 분포를 가지고 있는 에너지의 크기가 반영된 하얀 점으로 표시하였습니다.
이 세상에서는 식물이 동물에게 먹히면 먹힌 숫자 만큼의식물이 곧바로 다시 만들어지게 되여 총식물의 수는 언제나 10000개로 유지됩니다.
이런 세상에서의 동물은 가능한 에너지 소모는 적고, 식물이 많이 있을 법한,
그리고 에너지가 큰 식물이 있을 법한 위치(왼쪽 상단이나 모서리쪽)로 이동해야 오래 살아남을수 있겠죠.
3. 마지막으로 동물을 만듭니다.
동물에게는 설정해야 하는 것이 너무나 많겠지만 최소한으로 만들었습니다.
첫번째는 시작위치, 두번째는 에너지 보유량(red), 세번째는 이동의 무작위률(blue), 마지막은 이동성향(green)입니다.
이동성향은 다시 나눠지며, 이동반경, 에너지소모 큰영역회피성, 에너지분포큰영역추구성, 큰에너지획득영역추구성입니다.
최종적인 이동방향과 거리는 이동성향과 무작위 이동성이 반영되어 결정됩니다.
모든 설정값들은 무작위로 부여되었으며 10개정도로 만들어 보겠습니다.
에너지 소모정도를 밝기 정도로 표시한 땅위에 동물은 rgb 색깔 pixel로 뿌렸는데 잘 안보여서 그림은 생략.
한번이동하는데는 일정 에너지가 들고, 도착한 영역의 에너지소모율에 따라서 에너지가 뺏깁니다.
그렇게 하여 도착한 곳에서 식물을 만나게 되면 그 식물이 먹게 되고, 그 식물이 가지고 있는 양만큼의 에너지를 보충받게 됩니다.
동물에게는 한계 수명같은것은 설정하지 않았지만, 계속 식물은 못만나면 에너지가 계속 줄어들어 결국 그 동물은 굶어 죽게 됩니다.
4. 여기까지의 기본적인 설정들을 바탕으로 시물레이션 해보았습니다.
세상은 한 1000년으로 설정하겠습니다.
그 결과 최종 동물 이동경로를 그린것이 다음과 같습니다.
pixel이 작아서 잘 안보이지만 (여기서는 더 안보이네요;;) 살아남은 놈은 빨간색으로, 죽은 놈은 회색으로 표시하였습니다.
예상했던데로 모서리쪽으로 동물들이 이동하였네요.
5. 시물레이션 결과 개체들의 특성을 살펴본 그래프입니다.
아래 그림1은 시간이 지남(x축)에 따른 개체수(y축)를 표시한 그래프입니다.
파랑색선은 생존개체수이고, 녹색선은 누적된 굶어죽은 개체수입니다.
생존 개체수는 처음에 10개로 시작하여 점점 줄어들다가 최종 1000년에는 4개가 되었네요.
그러니까 1000년이 흐르는 동안 4마리가 살아남고 나머지 6마리는 굶어 죽었습니다.
아래 그림 2는 각 개체별(x축)로 에너지 상태(y축)를 살펴본 것입니다.
빨간색은 에너지 값을, 파란색은 먹은 식물 개수를 표시한 것입니다.
가장 많이 식물을 먹은 놈은 5번 (10개)인데 가장 에너지가 많은 놈은 4번(~8)이네요.
1번은 식물을 하나를 먹고도 죽었고, 하나도 식물을 못 먹은 놈들은 모두 죽었네요.
당연한 이야기지만 이것은 무작위로 시작해서 무작위로 진행되기 때문에 결과는 할때마다 다릅니다.
6. 이제 동물들에게 약육강식의 원칙을 적용해보겠습니다.
그러니까 동물들이 서로 이동하다가 만약 다른 동물과 만나게 되면 둘이 싸움을 붙이는 것이죠.
전투력은 그냥 간단히 에너지 크기로 설정하였습니다.
그러니까 둘중 에너지가 큰 놈이 살아남고, 에너지가 작은놈은 큰놈에게 잡아먹힙니다.
싸움에서 이긴 에너지가 큰놈은 싸움에서 진 잡아먹은 놈의 에너지까지 받아 먹게 됩니다.
이렇게 한 후 시물레이션을 해보면 다음과 같습니다.
이번에는 잡아먹히는 놈들이 생기기 때문에 그것을 감안하여 동물 개체수를 2배로 늘려서 20개로 하였습니다.
마찬가지로 살아남은 놈은 빨간색으로 죽은 놈은 흰색으로 표시하였습니다.
시작 개체수가 많아서 그런지 아까보다는 좀더 점들이 많아 보이네요.
7. 약육강식이 적용된 세상에 대한 시물레이션 특성을 살펴본 그래프 입니다.
아래 그림1은 시간이 지남(x축)에 따른 개체수(y축)를 표시한 그래프입니다.
파랑색은 생존개체수, 녹색은 굶어죽은 개체수, 빨간색은 잡혀먹은 개체수입니다.
시간이 지나면서 굶어 죽는 놈이 생기고, 좀더 지나니까 잡혀먹는 놈도 생기는 것이 확인이 되네요.
이 시물레이션에서의 최종 생존개체는 6마리.
아래 그림 2는 각 개체별(x축)로 에너지 상태(y축)의 값을 살펴본 것입니다.
빨간색은 에너지 값을, 파란색은 먹은 식물 개수를, 녹색은 먹은 개수의 상대적인 값으로 표시하였습니다.
대략 식물을 많이 찾아먹고, 동물을 많이 잡아먹은 놈들이 살아남은듯 한데
15번이나 20개체 처럼 그렇게 해도 살아남지 못하는 경우도 있네요.
8. 이제 동물들에게 번식능력까지 부여해 보겠습니다.
일정 수준의 에너지를 확보한 동물에게 번식기회를 주었습니다.
새로운 개체는 모개체의 복제판으로 모개체와 탄생 위치를 제외하고 완전히 동일한 움직임성향을 가지게 됩니다.
단성생식임에도 불구하고 동물에게 이 번식능력을 부여하는데 설정해야 하는것도 신경써야하는 것도 너무 많아서 꽤나 힘들었습니다.
하물며 양성생식은 또 얼마나 복잡할까 해서 그것은 일단 보류상태입니다.
번식능력을 부여하여 시물레이션을 하니 초기값에 따라서 총 개체수가 기하급수적으로 늘어나거서 또는 탄생개체수가 없게되는 상황이 있어서
초기상태를 설정하는데 약간의 어려움이 있었습니다.
이전까지와는 달리 개체수의 패턴은 조금의 차이에 의해 완전히 뒤바뀌기도 해서 전혀 예측할수가 없네요.
유지되는 식물개체수나 새로운 개체 시작 지점에 영향을 많이 받는듯 합니다.
유지식물개체수를 3000으로 줄여서 시물레이션 한 결과입니다.
재대로 한것인지는 모르겠지만 결과가 의외로 별로 재미가 없네요.
탄생개체는 다른 색깔로 표시를 하면 좀 재미있을 법 한데 귀찮아서 신경 못썻네요.
9. 번식능력까지 부여된 세상에 대한 시물레이션 특성을 살펴본 그래프 입니다.
아래 그림1은 시간이 지남(x축)에 따른 개체수(y축)를 표시한 그래프입니다.
파랑색은 생존개체수, 녹색은 굶어죽은 개체수, 빨간색은 잡혀먹은 개체수, 마지막으로 cyan 색은 탄생개체수입니다.
이 그래프로 보건데 개체는 느닺없이 발생하기도 하는듯 하고, 설정환경에서 발생한 개체 대부분은 얼마 안가서 다른 개체에게 잡혀 먹히는듯 하네요.
이 시물레이션에서의 개체수는 20에서 시작해서 최대 47까지 늘었다가 최종적으로 4마리로 마무리 됩니다.
아래 2번 그림은 총 113개 탄생개체를 세대별로 표시한 것입니다.
세로축은 개체번호이고, 가로축은 세대손이며 개체수는 색깔로 표시되었습니다.
결론적으로 처음에 시작된 총 20개의 개체중에 새로운 개체를 탄생시킨 개체는 1번과 4번 뿐입니다.
1번이 혼자 30개의 자식을 만들었고, 그 30개의 개체에서 총 3개의 자식, 또는 1번의 손자가 만들어 졌습니다.
4번은 혼자 63개의 개체를 만들었고, 4번의 손자가 16마리, 4번의 증손자가 1마리입니다.
번식능력이 부여되면서 결과를 별로 예측할수가 없어서 이것이 맞는 결과인지를 솔직히 확신할수가 없네요.
10. 마지막으로 동물들에게 진화능력까지 부여해 보았습니다.
사실 지금까지중에서도 가장 복잡하고 까다롭고 불확실한 단계입니다.
번식한 개체에게 특정수준의 에너지가 남게되면 자신보다 pixel 개수가 1개 더 많은 자손을 번식할 수있습니다.
multipixel을 가진 탄생한 자손개체는 모개체와 동일한 정보를 가진 pixel과 함께 추가로 1pixel을 더 가지게 됩니다.
이런식으로 해서 진행한다면 경우에 따라서는 수개, 수십개의 pixel을 가진 복잡성의 동물이 생길수가 있게 됩니다.
이런 과정을 '일종의' 진화로 봐도 무방할까 합니다.
아쉽게도 데이터 생성 코드가 비효율적으로 짜서 계속 메모리 뻑이 나서 세상을 500년으로 줄여서 했으며
몇번의 시물레이션 끝에 얻은 진화개체가 있는 결과는 다음과 같으며 역시 이전과 별반 다를바 없습니다.
11. 마지막 진화능력까지 부여된 세상에 대한 시물레이션 특성을 살펴본 그래프 입니다.
아래 그림1은 시간이 지남(x축)에 따른 개체수(y축)를 표시한 그래프입니다.
파랑색은 생존개체수, 녹색은 누적 굶어죽은 개체수, 빨간색은 누적 잡혀먹은 개체수, cyan 색은 누적 탄생개체수이며,
마지막으로 검정색이 누적 multipixel 개체수 입니다.
아래 그림2는 총 55개의 발생개체를 세대별로 표시한 것입니다.
자손은 11번 개체와 14번 개체뿐이고 나머지는 자손이 없습니다.
11번 개체의 자식은 21마리이고 손자식은 27마리이고 증손자식은 3마리이며,
14번 개체의 자식은 1마리이고 손자식은 3마리입니다.
확인결과 multipixel을 가진 진화개체는 11번 개체의 17번째 손자식과 27번째의 손자식 딱 2개 생겼으며
그나마도 pixel개수가 2개이며, 끝까지 살아남지도 못했네요.;;
여기까지입니다.
아쉽게도 아직 기대한 것을 보지 못했네요.
기대하는 것을 보려면 500년이 아니라 500만년은 되어야 할 것 같은데 참 곤란하네요.
디버깅과 데이터 생성 코드 부터 수정하고, 양성생식 만들고, 연산과정 줄이는 작업과, 결과 검증작업이 남았습니다.
이걸 가지고 땅도 바꿔보고, 초기값도 바꿔 보고, 세상을 좀더 정교화 하기도해서 처음에 의도했던 것을 보게 되었으면 좋겠네요.