p5js로 Cellular Automata 1 Dimention Binary State Simulator를 만들었다.
inputfield 창에 0 -255 사이의 수를 입력하면
규칙별 시뮬레이션이 가능하다.
1차원 2개의 상태(0,1 또는 살아있거나 죽어있거나)가 있는 환경의 세포자동자 에서는
어떤 셀의 양 옆 셀의 정보를 바탕으로 특정 규칙에 따라 다음 세대에서의 셀 상태가 결정된다.
검은 칸은 죽어있는 상태이고(1) 하고 흰 칸(0)은 살아있는 상태라고 가정하자.
한 칸이 다음세대에 어떻게 진화되는지 알기위해서는 위의 그림처럼 나와 양 옆의 두 이웃 , 총 3개 셀을 검사해야한다.
그러면
나와 양 옆의 셀 모두 죽은 경우 -> 0,0,0
나와 오른쪽 셀은 살아있고 왼쪽 셀은 죽은상태인 경우 -> 0,1,1
나만 죽은 경우 -> 1,0,1
나와 왼쪽 셀은 죽고 오른쪽 셀은 살아있는경우 -> 1,1,0
..
등등등등등 8개의 케이스가 나오게된다.
그리고 각 케이스별로 다음 세대에 어떻게 될지 대입하여 찾아볼수 있는 어떤 매뉴얼 같은것이 Rule이다.
총 8가지 케이스가 있기 때문에 조합이 가능한 경우의 수 256가지의 Rule 이 나오게 된다.
0000 0000 (0) -> Rule 0
0000 0001 (1) -> Rule 1
0000 0010 (2) -> Rule 2
0000 0011 (3) -> Rule 3
...
1111 1110 (254) -> Rule 254
1111 1111 (255) -> Rule 255
예를 들어 Rule 110 (0110 1110)에서는
현재 나와 왼쪽이 죽었고 오른쪽 은 살아있는 상황일때
즉 6번(1,1,0) 케이스일때 다음 세대에 나는 죽는다고 알려준다.
오른쪽부터 해당 케이스 번호의 칸으로 이동하여 확인해보면
해당 케이스일때 다음 세대에 내가 어떤상태가 될지 알수 있다.
이것을 코드로 구현하기 위해서는 다양한 방법이 있는데 나는 >> 시프트 연산 사용했다.
케이스 번호만큼 시프트 연산을 한다.
if ((rules >> parseInt(sum, 2)) % 2 == 1) {cellArrayNext[i] = 1;}
연산한 결과가 홀수면 규칙 10진수의 2진수 변환한 마지막 자리 숫자가 1인 것이고
짝수거나 0이면 0인 것이므로 해당 결과를 셀의 다음 세대에 대입하여 주면 된다.
'study > algorithm' 카테고리의 다른 글
토끼와 거북이 알고리즘 (0) | 2021.06.18 |
---|
댓글