돌연변이와 자연선택을 기반으로 조건에 맞는 결과를 출력하는 비정형 기계가 나타날 때까지 세대를 반복하는 프로그램입니다.
[UnorganizedMachine](GitHub - altair823/UnorganizedMachine) 을 외부 라이브러리로 사용하였습니다.
튜링이 제안한 비정형 소자, 두 개의 입력을 NAND 논리 연산하여 현재 상태로 갖는 소자를 사용하여 구성한 기계를 뜻합니다.
기계는 1개 이상의 비정형 소자와 이들을 잇는 Edge들로 구성되어 있습니다. Edge는 한 소자의 상태를 다른 소자에게 입력으로 보내는 역할을 합니다.
기본적으로 간선은 상태를 그대로 다음 소자에게 전달하지만, 돌연변이가 발생하면 상태를 역전하여 전달하는 �간선으로 바뀝니다.
간선의 돌연변이는, 기본적으로 이전 소자의 상태를 다음 소자에게 그대로 전하던 것을 역전해서 전달하는 간선으로 변하는 것을 뜻합니다.
세대가 반복될수록 한 기계 안에서 더 많은 간선에서 돌연변이가 일어납니다. 이미 돌연변이가 일어난 간선에서 다시 돌연변이가 일어나 기본값으로 돌아갈 수 있습니다.
돌연변이가 일어난 뒤, 기계의 결과값을 비교하여 목표값과 가장 차이가 큰 기계들 중 일부를 제거합니다. 그리고 원래의 기계 수를 회복하기 위하여 목표값과 가장 가까운 기계들부터 남은 기계들을 차례대로 복제합니다. 이 과정을 통해 전체 기계 풀은 세대가 지날수록 목표값과 점점 더 가까워지는 기계들을 갖게됩니다.
주어진 최대 시행이 다 끝나기 전에 목표값을 출력한 기계가 나타난다면 그때까지 시행들을 모두 csv 파일로 저장합니다.
각 시행에서 기계들이 갖는 차이값을 기록합니다.