이것은 Fortnightly Challenge # 3입니다. 주제 : 유전자 알고리즘
이 도전은 약간의 실험입니다. 우리는 유전자 알고리즘으로 우리가 할 수있는 일을 도전적인 방법으로보고 싶었습니다. 모든 것이 최적은 아니지만 최선을 다해 액세스 할 수 있도록 노력했습니다. 이것이 효과가 있다면, 미래에 우리가 볼 수있는 것을 아는 사람. 어쩌면 언덕의 유전자 왕일까요?
사양이 꽤 길다! 우리는 스펙을 The Basics로 분리하려고 시도했습니다-프레임 워크로 게임을 시작하고 답변을 제출하기 위해 알아야 할 최소한의 정보와 Gory Details-전체 스펙과 컨트롤러에 대한 모든 세부 정보를 기반으로합니다. 직접 쓸 수 있습니다.
질문이 있으시면 언제든지 채팅 에 참여하십시오!
당신은 행동 심리학의 연구원입니다. 금요일 저녁에 여러분과 동료들은 약간의 쥐 경주에 재미를 느끼고 실험실 쥐를 사용하기로 결정합니다. 실제로 감정적으로 너무 감정적으로 연결되기 전에 표본 이라고 부릅니다 .
시편에 작은 레이스 트랙을 설정했으며, 더 흥미롭게하기 위해 트랙을 가로 질러 벽과 함정 및 순간 이동 장치를 몇 개 배치했습니다. 자, 당신의 표본은 여전히 쥐입니다 ... 그들은 함정이나 텔레 포터가 무엇인지 전혀 모릅니다. 그들이 보는 것은 다른 색상의 것들입니다. 그들은 또한 어떤 종류의 기억도 가지고 있지 않습니다. 그들이 할 수있는 모든 것은 그들의 현재 환경에 기초하여 결정을 내리는 것입니다. 자연 선택은 그렇지 않은 사람들의 함정을 피하는 방법을 알고있는 표본을 골라 낼 것입니다 (이 경주는 시간이 걸릴 것입니다 ...). 게임을 시작하자! †
† 84,465 개의 시편이이 도전을 위해 해를 입었습니다.
기초
이 게임은 싱글 플레이어 게임입니다 (귀하와 동료는 인구를 섞지 않기 때문에 각자 자신 만의 레이스 트랙을 만들었습니다). 레이스 트랙은 키가 15 셀 , 폭이 50 셀인 직사각형 그리드 입니다. 왼쪽 가장자리 ( x = 0 )의 무작위 (필수 별개의) 셀에서 15 개의 표본으로 시작 합니다. 시편은 x ≥ 49 및 0 ≤ y ≤ 14의 셀인 목표에 도달하려고 시도해야합니다 (시편이 트랙을 오른쪽으로 오버 슈트 할 수 있음). 이런 일이 생길 때마다 포인트를 얻습니다. 당신은 또한 1 포인트로 게임을 시작합니다. 10,000 회전 후 포인트를 최대화해야 합니다.
여러 시편이 동일한 셀을 차지할 수 있으며 상호 작용하지 않습니다.
각 차례마다, 각 시편은 주변의 5x5 격자를 본다 (중앙에 위치). 해당 격자의 각 셀에는의 색상이 포함 -1
됩니다 15
. -1
경계를 벗어난 셀을 나타냅니다. 시편이 경계를 벗어나면 사망합니다. 다른 색상은 빈 셀, 트랩, 벽 및 텔레 포터를 나타냅니다. 그러나 표본은 어떤 색이 무엇을 나타내는 지 알지 못합니다. 그래도 몇 가지 제약이 있습니다.
- 8 개의 색상은 빈 셀을 나타냅니다.
- 4 색은 텔레 포터를 나타냅니다. 텔레 포터는 표본을 9x9 인근의 특정 셀로 보냅니다. 이 오프셋은 같은 색상의 모든 텔레 포터에서 동일합니다.
- 2 색은 벽을 나타냅니다. 벽으로 이동하는 것은 여전히 서있는 것과 같습니다.
- 2 색은 함정을 나타냅니다. 트랩은 바로 근처에있는 9 개의 셀 중 하나 가 치명적 임을 나타냅니다 (트랩 셀 자체는 아님). 이 오프셋은 동일한 색상의 모든 트랩에 대해 동일합니다.
자, 자연 선택에 대해 ... 각 표본에는 100 비트 의 숫자 인 게놈이 있습니다. 두 개의 기존 표본을 교차 교배 한 다음 게놈을 약간 돌연변이시켜 새로운 표본을 만듭니다. 표본의 성공률이 높을수록 재현 가능성이 커집니다.
그래서 당신의 임무는 다음과 같습니다 : 단일 함수를 작성합니다.이 함수는 표본이 보는 5x5 격자와 게놈을 입력으로받습니다. 함수는 시편에 대한 이동 (Δx, Δy)을 반환합니다. 여기서 Δx 및 Δy는 각각 다음 중 하나입니다 {-1, 0, 1}
. 함수 호출간에 데이터를 유지해서는 안됩니다. 여기에는 자신의 난수 생성기를 사용하는 것이 포함됩니다. 귀하의 기능에는 원하는대로 자유롭게 사용할 수있는 시드 RNG가 제공됩니다.
귀하의 제출 점수는 50 개의 무작위 트랙에 걸친 포인트 수의 기하 평균 입니다 . 이 점수에는 약간의 차이가있을 수 있습니다. 따라서이 점수는 예비 점수가됩니다 . 이 도전이 종료되면 마감일이 발표됩니다. 마감일이 끝나면 100 개의 보드가 무작위로 선택되며 모든 제출물은이 100 개의 보드에서 채점됩니다. 귀하의 답변에 예상 점수를 매길 수 있지만, 우리는 아무도 속임수를 쓰지 않도록 모든 제출물에 점수를 매길 것입니다.
우리는 소수의 언어로 컨트롤러 프로그램을 제공했습니다. 현재, 파이썬 (2 또는 3), Ruby , C ++ , C # 또는 Java로 제출물을 작성할 수 있습니다 . 컨트롤러는 보드를 생성하고 게임을 실행하며 유전자 알고리즘에 대한 프레임 워크를 제공합니다. 이동 기능을 제공하기 만하면됩니다.
잠깐, 유전체로 정확히 무엇을해야합니까?
도전은 그것을 알아내는 것입니다!
표본에 기억이 없기 때문에 주어진 차례에 당신이 얻는 것은 5x5 색상의 격자로 당신에게 아무런 의미가 없습니다. 따라서 목표를 달성하려면 게놈을 사용해야합니다. 일반적으로 게놈의 일부를 사용하여 색상 또는 그리드 레이아웃에 대한 정보를 저장하고 봇은 게놈에 저장된 추가 정보를 기반으로 결정을 내립니다.
물론 실제로 수동으로 아무것도 저장할 수는 없습니다. 따라서 저장된 실제 정보는 처음에는 완전히 무작위입니다. 그러나 유전자 알고리즘은 유전체에 올바른 정보가 포함 된 표본을 선택하고 잘못된 정보가있는 표본을 제거합니다. 목표는 게놈 비트 및 시야에서 이동으로의 맵핑을 찾는 것입니다.이를 통해 목표에 대한 경로를 신속하게 찾고 지속적으로 승리 전략으로 발전 할 수 있습니다.
시작하기에 충분한 정보가 있어야합니다. 원하는 경우 다음 섹션을 건너 뛰고 맨 아래에있는 컨트롤러 목록에서 해당 컨트롤러를 선택할 수 있습니다 (특정 컨트롤러 사용 방법에 대한 정보도 포함되어 있음).
모든 것을 원한다면 계속 읽으십시오 ...
처참한 세부 사항
이 사양이 완성되었습니다. 모든 컨트롤러는 이러한 규칙을 구현해야합니다.
달리 명시되지 않는 한 모든 무작위성은 균일 분포를 사용합니다.
트랙 생성 :
- 트랙은 직사각형 그리드이며, X = 53 셀, Y = 15 셀입니다. x가 49 이상인 셀 은 목표 셀입니다 (여기서 x 는 0을 기준으로 함).
- 각 세포는 단일 색상을 가지고 있으며 치명적이지 않을 수도 있습니다. 아래의 세포 유형 중 하나에 의해 명시되지 않는 한 세포는 치명적이지 않습니다.
- 에서 로 레이블이 지정된 16 개의 서로 다른 셀 색상 이 있으며 그 의미는 게임 마다 다릅니다 . 또한 범위를 벗어난 셀을 나타냅니다.이 셀은 치명적 입니다.
0
15
-1
- 8 임의의 색상을 선택하십시오 . 이것들은 비어있는 셀이 될 것입니다.
- 임의의 색상을 4 개 더 선택하십시오 . 이들은 텔레 포터입니다. 이 색상 중 두 가지의 경우 9x9 이웃에서 (0,0을 제외하고 (-4, -4)에서 (4,4)까지 0이 아닌 오프셋을 선택하십시오 . 다른 두 가지 색상의 경우 해당 오프셋을 반전시킵니다. 시편이 텔레 포터를 밟으면 즉시 해당 오프셋만큼 이동합니다.
- 무작위 색상을 2 개 더 선택하십시오 . 이들은 함정입니다. 이러한 각 색상에 대해 (1, -1)에서 (1,1)까지 3x3 이웃에서 오프셋을 선택하십시오. 트랩은 해당 오프셋의 셀이 치명적 임을 나타냅니다 . 참고 : 트랩 셀 자체가 반드시 치명적이지는 않습니다.
- 2 나머지 색 이동을 방해하는 벽이다. 벽면 셀로 이동하려고하면 이동이 정지 상태로 유지됩니다. 벽 세포 자체는 치명적 입니다.
- 그리드의 목표가 아닌 셀마다 임의의 색상을 선택하십시오. 각 목표 셀에 대해 임의의 빈 색상을 선택하십시오 .
- 트랙의 왼쪽 가장자리에있는 각 셀에 대해 100 턴 이내에 목표를 달성 할 수 있는지 여부를 결정합니다 ( 아래 의 턴 순서 규칙 에 따라 ). 그렇다면이 셀은 허용되는 시작 셀 입니다. 시작 셀이 10 개 미만인 경우 트랙을 삭제하고 새 트랙을 생성하십시오.
- 무작위 게놈과 연령이 0 인 표본 15 개를 만듭니다 . 임의의 시작 셀에 각 표본을 놓습니다.
순서 전환 :
- 각 시편에 대해 다음 단계가 순서대로 수행됩니다. 표본은 서로 상호 작용하거나 보지 않으며 동일한 셀을 차지할 수 있습니다.
- 표본의 나이가 100 이면 사망합니다. 그렇지 않으면, 나이를 1 씩 늘리십시오.
- 시편에는 시편 중앙에 5x5 색상 격자가 표시되며 3x3 이웃으로 이동합니다. 이 범위를 벗어나면 컨트롤러가 종료됩니다.
- 대상 군이 벽이면 이동이 (0,0)으로 변경됩니다.
- 표적 세포가 텔레 포터 인 경우, 시편은 텔레 포터의 오프셋에 의해 이동됩니다. 참고 : 이 단계는 반복적으로 수행 되지 않고 한 번 수행 됩니다.
- 시편이 현재 점유하고있는 셀 (잠재적으로 하나의 텔레 포터를 사용한 후)이 치명적인 경우 시편이 사망합니다. 이것은 시편이 죽는 유일한 시간이다 (위의 1.1 단계와는 별개). 특히, 치명적인 세포에 생성되는 새로운 표본은 즉시 죽지는 않지만 위험한 세포에서 먼저 벗어날 수 있습니다.
- 시편이 목표 셀을 점유하면 점수를 매기고 시편을 임의의 시작 셀로 이동 하고 나이를 0으로 재설정합니다.
- 보드에 2 개 미만의 표본이 남아 있으면 게임이 종료됩니다.
- 나이가 0 인 10 개의 새로운 표본을 만듭니다 . 각 게놈은 아래의 육종 규칙에 의해 (개별적으로) 결정됩니다. 임의의 시작 셀에 각 표본을 놓습니다.
번식:
새로운 표본이 만들어 지면 오른쪽으로 더 진행된 표본에 대한 편견과 함께 두 개의 별개의 부모를 무작위로 선택하십시오 . 표본이 선택 될 확률은 현재 체력 점수에 비례합니다 . 표본의 체력 점수는
1 + x + 50 * 목표에 도달 한 횟수
여기서 x 는 0 기반 가로 인덱스입니다. 같은 차례에 만들어진 표본은 부모로 선택할 수 없습니다.
두 부모 중에서 첫 번째 게놈 비트를 취하기 위해 무작위를 선택하십시오.
- 이제 게놈을 따라 걸을 때 확률이 0.05 인 부모를 전환 하고 결과 부모에서 비트를 계속 가져갑니다.
- 완전히 조립 된 게놈을 돌연변이시킵니다 : 각 비트에 대해 확률 0.01으로 뒤집으십시오 .
채점 :
- 한 게임은 10,000 턴 동안 지속됩니다 .
- 플레이어는 기하 평균을 사용할 수 있도록 1 포인트로 게임을 시작합니다.
- 표본이 목표에 도달 할 때마다 플레이어는 점수를 얻습니다.
- 현재 각 플레이어의 제출은 각각 다른 무작위 트랙을 가진 50 게임에 대해 실행됩니다 .
- 상기 접근법은 바람직한 것보다 더 많은 분산을 초래한다. 이 도전이 종료되면 마감일이 발표됩니다. 마감일이 끝나면 100 개의 보드가 무작위로 선택되며 모든 제출물은이 100 개의 보드에서 채점됩니다.
- 플레이어의 전체 점수는 이러한 개별 게임 점수의 기하 평균 입니다.
컨트롤러
다음 컨트롤러 중 하나를 선택할 수 있습니다 (기능적으로 동일하므로). 우리는 모두 테스트했지만 버그를 발견하거나 코드 또는 성능을 개선하거나 그래픽 출력과 같은 기능을 추가하려는 경우 문제를 제기하거나 GitHub에서 풀 요청을 보내십시오! 다른 언어로 새 컨트롤러를 추가 할 수도 있습니다.
각 컨트롤러의 언어 이름을 클릭하면 README.md
정확한 사용법 지침 이 포함 된 GitHub의 올바른 디렉토리로 이동 합니다.
git 및 / 또는 GitHub에 익숙하지 않은 경우 첫 페이지에서 전체 저장소를 ZIP으로 다운로드 할 수 있습니다 (사이드 바의 버튼 참조).
파이썬
- 가장 철저한 테스트를 거쳤습니다. 이것이 우리의 참조 구현입니다.
- Python 2.6 이상 및 Python 3.2 이상에서 작동합니다!
- 매우 느립니다. 속도 를 높이 려면 PyPy 로 실행하는 것이 좋습니다 .
- 중 하나를 사용하여 그래픽 출력 지원
pygame
또는tkinter
.
루비
- Ruby 2.0.0으로 테스트되었습니다. 최신 버전에서 작동합니다.
- 또한 느리지 만 Ruby는 제출 아이디어를 프로토 타이핑하는 데 편리 할 수 있습니다.
C ++
- C ++ 11이 필요합니다.
- 선택적으로 멀티 스레딩을 지원합니다.
- 지금까지 가장 빠른 컨트롤러입니다.
씨#
- LINQ를 사용하므로 .NET 3.5가 필요합니다.
- 오히려 천천히.
자바
- 특별히 느리지 않습니다. 특별히 빠르지는 않습니다.
예비 리더 보드
모든 점수는 예비입니다. 그럼에도 불구하고 문제가 있거나 잘못 된 경우 알려 주시기 바랍니다. 예제 제출은 비교를 위해 나열되었지만 경합에는 표시되지 않습니다.
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
크레딧
이 도전은 큰 협력 노력이었습니다.
- Nathan Merril : Python 및 Java 컨트롤러를 작성했습니다. 도전 개념을 왕의 왕에서 쥐 경주로 바꿨습니다.
- trichoplax : 플레이 테스트 . 파이썬 컨트롤러에서 일했습니다.
- feersum : C ++ 컨트롤러를 작성했습니다.
- VisualMelon : C # 컨트롤러를 썼습니다.
- 마틴 부트 너 : 개념. 루비 컨트롤러를 작성했습니다. 플레이 테스트. 파이썬 컨트롤러에서 일했습니다.
- 아브라함 : 플레이 테스팅. Python을 테스트하고 C # 및 C ++ 컨트롤러를 검토했습니다.
위의 모든 사용자 (그리고 아마도 더 잊어 버린 몇 명)는 도전의 전반적인 디자인에 기여했습니다.
C ++ 컨트롤러 업데이트
Visual Studio 및 멀티 스레딩과 함께 C ++를 사용하는 경우 임의의 숫자 생성기 시드 관련 버그로 인해 최신 보드를 만들 수 있습니다.
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'