1P by GN⁺ | ★ favorite | 댓글 1개
  • 무작위로 생성된 두 바퀴 형태가 세대를 거치며 더 멀리 달리는 자동차로 선택·변이되는 과정을 브라우저에서 볼 수 있는 HTML5 시뮬레이션임
  • BoxCar2D의 아이디어를 느슨하게 따르지만, 코드는 새로 작성됐고 물리 계산에는 box2d를 사용함
  • 돌연변이율, 돌연변이 크기, 바닥 조건, 중력, 엘리트 클론 수를 조정해 진화 조건을 바꿀 수 있음
  • 같은 seed로 같은 트랙을 만들 수 있어 결과를 비교하기 쉽지만, 시뮬레이션 자체는 완전히 결정적이지 않음
  • 게놈은 차체와 바퀴의 형태·위치·밀도를 담으며, 멀리 갈수록 지형이 복잡해져 단순 최고 기록만으로 안정성을 보장하기 어려움

자동차가 진화하는 방식

  • 프로그램은 무작위 두 바퀴 형태를 세대별로 진화시켜 자동차처럼 달리는 개체를 만들어내는 간단한 유전 알고리듬 시뮬레이션임
  • BoxCar2D에서 느슨하게 아이디어를 얻었지만, 코드는 처음부터 작성됨
  • 물리 엔진은 box2d를 사용함
  • seedrandom.js는 David Bau가 작성함

조작과 진화 설정

  • 저장과 복원 기능으로 실험 상태를 이어갈 수 있음
    • Save Population은 현재 개체군을 로컬에 저장함
    • Restore Saved Population은 이전에 저장한 개체군을 복원함
  • 시뮬레이션 진행 방식도 직접 바꿀 수 있음
    • Suprise는 그리기를 토글해 시뮬레이션을 더 빠르게 만듦
    • New Population은 생성된 트랙은 유지한 채 자동차 개체군 전체를 다시 시작함
    • View top replay는 현재 시뮬레이션을 일시정지하고 최고 성능 자동차를 보여주며, 다시 클릭하면 시뮬레이션을 재개함
  • Create new world with seed는 같은 seed가 항상 같은 트랙을 만들기 때문에, 다른 사람과 같은 seed로 경쟁할 수 있음
  • 진화 파라미터는 새 세대가 얼마나 크게 바뀌는지를 좌우함
    • Mutation rate는 새 세대가 태어날 때 각 개체의 각 유전자가 무작위 값으로 변이할 확률임
    • Mutation size는 각 유전자가 변이할 수 있는 범위이며, 낮은 값일수록 원래 값에 가까운 값을 가짐
    • Elite clones는 다음 세대로 그대로 복사될 상위 n대의 자동차 수를 정함

그래프에서 보는 성능 변화

  • 그래프 색상은 세대별 성능을 서로 다른 기준으로 보여줌
    • 빨간색은 각 세대의 최고 점수를 나타냄
    • 초록색은 각 세대 상위 10대 자동차의 평균을 나타냄
    • 파란색은 전체 세대의 평균을 나타냄

게놈이 표현하는 자동차 구조

  • 자동차의 게놈은 차체와 바퀴를 구성하는 여러 유전자로 나뉨
    • Shape: 꼭짓점당 1개씩, 총 8개 유전자
    • Wheel size: 바퀴당 1개씩, 총 2개 유전자
    • Wheel position: 바퀴당 1개씩, 총 2개 유전자
    • Wheel density: 바퀴당 1개씩, 총 2개 유전자이며, 더 어두운 바퀴는 더 높은 밀도를 뜻함
    • Chassis density: 1개 유전자이며, 더 어두운 차체는 더 높은 밀도를 뜻함

한계와 코드 공개

  • 시뮬레이션은 기대만큼 결정적이지 않아, 최고 자동차가 이전과 같은 성능을 내지 못할 수 있음
  • 지형은 거리가 멀어질수록 더 복잡해짐
  • 스크립트 로딩 확인을 별도로 처리하지 않으므로, 동작이 이상하면 페이지를 새로고침해야 함
  • 코드는 GitHub repository에 공개되어 있으며 기여를 받을 수 있음
  • 원래 rednuht.org에서 작성되었고, 이후 GitHub의 기여자들이 참여함

댓글과 토론

Hacker News 의견들
  • 이걸 거의 20년 전에 처음 만들었는데, 아직도 가끔 여기 올라오는 걸 보니 반갑네요
    Ruffle 덕분에 아직 브라우저에서 실행됩니다:
    https://peteshadbolt.co.uk/posts/ga/

    • 그때 Adobe Flash Player 팀에서 일했는데, 이 Flash 무비를 테스트 케이스로 썼던 기억이 납니다 :)
    • 며칠 동안 돌렸을 때 나온 결과 예시가 있나요? 아니면 20년 동안이라도요? ;-)
    • Firefox에서 "Save Local Population" 옵션을 누르면 충돌하는 것 같습니다. 왜 그런지 짐작 가는 이유가 있을까요?
      사이트는 정말 멋집니다. 올라올 때마다 너무 오래 붙잡고 있게 되네요
    • 충돌 판정을 하중에만 두는 대신 구조물이나 스프링에도 추가하면 어떤 결과가 나올까요?
    • 인터넷에서 시간을 빼앗는 것들 중에서도 원본은 가장 기억에 남는 축에 듭니다
      친구와 점심시간 동안 실행해 두고 돌아와서 누가 이겼는지 보곤 했어요
  • 항상 한 설계가 운 좋게 성공한 뒤 세대마다 지배하고, 이후 돌연변이들은 제대로 작동하는 수준에 근처도 못 가는 막다른 길에 빠지는 것 같습니다
    수백 세대가 지나도 상위 10개가 바뀌지 않는 식입니다. 유전 알고리즘의 특성일 수도 있겠네요. 꽤 괜찮은 해를 빠르게 찾은 다음 국소 최댓값에 갇히는 방식일 수도 있고, 돌연변이 확률과 돌연변이 크기 설정을 더 만져봐야 할 수도 있습니다

    • 일반적으로는 돌연변이 확률을 아주 낮게 유지해서 개체군이 시간이 지나며 천천히 바뀌게 하는 편이 좋습니다
      높은 돌연변이 확률은 국소 최적해에 빨리 도달하지만 빠져나오기 어렵고, 낮은 돌연변이 확률은 훨씬 많은 세대가 필요하지만 보통 더 나은 적응으로 이어집니다
    • 단일 엘리트 복제 개체만 두고 돌리는 것처럼 들립니다
      유전 휴리스틱에서는 바로 그런 현상 때문에 매우 나쁜 방식입니다
    • 모양 말고도 더 많은 요소가 바뀌어야 할 것 같습니다. 더 강한 동력을 가진 느린 차라면 홈에 덜 빠질 수도 있겠죠
      하지만 지금은 동력과 속도는 변하지 않고, 몇 세대 지나면 모양만 아주 조금 바뀌는 듯합니다. 아래로 내려보니 유전체 설명이 있네요: 모양 8개 유전자, 바퀴 크기 2개, 바퀴 위치 2개, 바퀴 밀도 2개, 차체 밀도 1개입니다. 결국 바퀴 두 개와 중간 정도 차체 형태에 수렴하고 이후 큰 진전이 없어 보입니다. 동력과 속도도 변이 요소로 넣으면 흥미로울 것 같습니다
  • 재미있습니다. 다만 속도 조절은 아주 직관적이진 않네요. "Surprise"를 누르면 빨라져서 여러 반복을 빠르게 지나갈 수 있습니다
    돌연변이 확률, 즉 g가 바뀔 가능성과 돌연변이 크기 Δg는 개체군이 시간에 따라 진화하는 걸 보면서 만져보기 좋은 초매개변수입니다. 차에 일종의 서스펜션이 생기도록 "compliance" 유전자가 있으면 흥미로울 것 같습니다. 제가 돌려본 대부분의 실행에서는 거의 다 Tron 바이크 같은 형태로 진화했습니다

    • 아주 높은 돌연변이 확률로 오래 백그라운드에서 돌렸더니 꽤 다른 형태도 나왔습니다
      큰 바퀴에 작은 바퀴가 붙은 형태인데, 통통 튀면서 모든 장애물을 넘어갑니다
  • 예전 논의들입니다:
    https://news.ycombinator.com/item?id=5942757 (664 points | Jun 2013 | 169 comments)
    https://news.ycombinator.com/item?id=10600486 (162 points | Nov 2015 | 57 comments)

  • Flash 없는 boxcar2d네요
    https://news.ycombinator.com/item?id=2196747

    • 게다가 이상하게도 서스펜션 매개변수가 전부 빠진 것 같습니다
      물리 시뮬레이션은 명백히 비탄성 충돌을 쓰는 듯한데, 이건 상당히 비현실적이고 그래서 겉보기엔 충분히 괜찮은 많은 차들이 코스를 통과하지 못합니다. 마찰 계수도 매우 낮아 보입니다. 제가 만든 차 대부분은 두 구간짜리 경사도 못 올라갔습니다
    • 알고 보니 boxcar2d는 Ruffle에서 완벽히 동작하고, Internet Archive가 자동으로 Ruffle을 불러옵니다 :)
      https://web.archive.org/web/20240428203838/http://boxcar2d.c...
    • 10년도 더 전에 이런 걸 본 적이 있다고 생각했는데 맞았네요
  • 작은 버그가 있습니다. 약 280m 이후로는 도로가 없어서 모든 차가 끝없는 구덩이로 떨어집니다

  • “무작위 두 바퀴 형태를 여러 세대에 걸쳐 차로 진화시킨다”라고 되어 있는데, 제가 사는 곳에서는 두 바퀴 자동차를 오토바이라고 부릅니다
    그래도 시뮬레이션은 아주 멋집니다!

    • 이 차들이 달리는 시뮬레이션에는 차량이 넘어질 수 있는 세 번째 차원이 없고, 바퀴 한 쌍을 더 둘 공간도 없습니다
      그래서 전통적인 네 바퀴 자동차처럼 속도가 0이어도 넘어지지 않습니다. 그 성질만으로도 오토바이보다 네 바퀴 자동차에 더 가까운 동작이라고 볼 수 있다고 생각합니다
  • 매우 시각적이고 재미있는 시각화라서 마음에 듭니다
    이걸 보고 "Self-parking car evolution"에서 유전 알고리즘을 실험해 보게 됐습니다:
    https://trekhleb.dev/self-parking-car-evolution/

  • Cell Lab이라는 훌륭한 Android 앱이 떠오릅니다. 페트리 접시 안에서 살 다세포 또는 단세포 생물을 만들 수 있었죠
    원하면 방사선 수준을 높여 돌연변이와 진화가 일어나게 할 수도 있었습니다

  • 이런 걸 좋아한다면 https://old.reddit.com/r/WatchMachinesLearn/에 와보세요

    • 주제는 멋진데, 그다지 활발한 하위 레딧은 아닌 것 같습니다. 최신 게시물이 3년 전이네요 :-/