Đây là Thử thách nửa đêm # 3. Chủ đề: Thuật toán di truyền
Thử thách này là một chút thử nghiệm. Chúng tôi muốn xem những gì chúng tôi có thể làm, thách thức khôn ngoan, với các thuật toán di truyền. Không phải mọi thứ có thể là tối ưu, nhưng chúng tôi đã cố gắng hết sức để làm cho nó có thể truy cập được. Nếu điều này diễn ra, ai biết những gì chúng ta có thể thấy trong tương lai. Có lẽ một vị vua di truyền của Hill?
Thông số kỹ thuật khá dài! Chúng tôi đã cố gắng tách thông số kỹ thuật thành Cơ bản - mức tối thiểu bạn cần biết để bắt đầu chơi với khung và gửi câu trả lời - và Chi tiết Gory - thông số đầy đủ, với tất cả chi tiết về bộ điều khiển, dựa trên đó bạn có thể viết của riêng bạn.
Nếu bạn có bất kỳ câu hỏi nào, hãy tham gia trò chuyện với chúng tôi!
Bạn là một nhà nghiên cứu trong tâm lý học hành vi. Đó là tối thứ sáu và bạn và đồng nghiệp của bạn quyết định vui chơi và sử dụng chuột trong phòng thí nghiệm của bạn cho một cuộc đua chuột nhỏ. Trên thực tế, trước khi chúng ta quá gắn bó với chúng, hãy gọi chúng là mẫu vật .
Bạn đã thiết lập một đường đua nhỏ cho các mẫu vật và để làm cho nó thú vị hơn, bạn đã đặt một vài bức tường và bẫy và dịch chuyển tức thời trên đường đua. Bây giờ, mẫu vật của bạn vẫn là chuột ... họ không biết bẫy hay dịch chuyển tức thời là gì. Tất cả những gì họ nhìn thấy là một số thứ trong các màu sắc khác nhau. Họ cũng không có bất kỳ loại bộ nhớ nào - tất cả những gì họ có thể làm là đưa ra quyết định dựa trên môi trường hiện tại. Tôi đoán chọn lọc tự nhiên sẽ chọn ra những mẫu vật biết cách tránh bẫy từ những loài không (cuộc đua này sẽ mất một lúc ...). Hãy để cuộc chơi bắt đầu! †
† 84.465 mẫu vật đã bị tổn hại khi thực hiện thử thách này.
Những thứ cơ bản
Đây là một trò chơi một người chơi (bạn và đồng nghiệp của bạn không muốn trộn lẫn các quần thể để mỗi người xây dựng đường đua của riêng mình). Đường đua là một lưới hình chữ nhật, cao 15 ô và rộng 50 ô. Bạn bắt đầu với 15 mẫu trên các ô ngẫu nhiên (không nhất thiết phải khác biệt) ở cạnh trái (trong đó x = 0 ). Mẫu vật của bạn nên cố gắng đạt được mục tiêu là bất kỳ ô nào tại x ≥ 49 và 0 y ≤ 14 (mẫu vật có thể vượt quá đường đua sang phải). Mỗi lần điều này xảy ra, bạn sẽ nhận được một điểm. Bạn cũng bắt đầu trò chơi với 1 điểm. Bạn nên cố gắng tối đa hóa điểm của mình sau 10.000 lượt.
Nhiều mẫu vật có thể chiếm cùng một tế bào và sẽ không tương tác.
Ở mỗi lượt, mỗi mẫu vật nhìn thấy một lưới 5x5 của môi trường xung quanh (với chính nó ở giữa). Mỗi tế bào của lưới sẽ chứa một màu -1
để 15
. -1
đại diện cho các tế bào nằm ngoài giới hạn. Mẫu vật của bạn chết nếu nó di chuyển ra khỏi giới hạn. Đối với các màu khác, chúng đại diện cho các ô trống, bẫy, tường và dịch chuyển tức thời. Nhưng mẫu vật của bạn không biết màu nào đại diện cho cái gì và bạn cũng không. Có một số hạn chế mặc dù:
- 8 màu sẽ đại diện cho các ô trống.
- 4 màu sẽ đại diện cho một dịch chuyển tức thời. Một dịch chuyển tức thời sẽ gửi mẫu đến một ô nhất định trong vùng lân cận 9x9 của nó. Phần bù này sẽ giống nhau cho tất cả các dịch chuyển tức thời cùng màu.
- 2 màu sẽ đại diện cho các bức tường. Di chuyển vào một bức tường cũng giống như đứng yên.
- 2 màu sẽ đại diện cho một cái bẫy. Một cái bẫy chỉ ra rằng một trong 9 ô trong vùng lân cận của nó là gây chết người (không nhất thiết phải là tế bào bẫy). Phần bù này sẽ giống nhau cho tất cả các bẫy cùng màu.
Bây giờ, về lựa chọn tự nhiên đó ... mỗi mẫu vật có một bộ gen, đó là một số có 100 bit. Mẫu vật mới sẽ được tạo ra bằng cách lai chéo hai mẫu vật hiện có, và sau đó làm biến đổi bộ gen một chút. Mẫu vật càng thành công, cơ hội sinh sản càng lớn.
Vì vậy, đây là nhiệm vụ của bạn: Bạn sẽ viết một hàm duy nhất, nhận đầu vào là lưới 5x5 màu mà mẫu vật nhìn thấy, cũng như bộ gen của nó. Hàm của bạn sẽ trả về một di chuyển (Δx, y) cho mẫu vật, trong đó x và Δy sẽ là một trong số đó {-1, 0, 1}
. Bạn không được lưu lại bất kỳ dữ liệu nào giữa các lệnh gọi hàm. Điều này bao gồm sử dụng các trình tạo số ngẫu nhiên của riêng bạn. Chức năng của bạn sẽ được cung cấp RNG hạt giống mà bạn có thể sử dụng miễn phí theo ý muốn.
Điểm của bài nộp của bạn sẽ là giá trị trung bình hình học của số điểm trên 50 bài hát ngẫu nhiên. Chúng tôi đã phát hiện ra rằng điểm số này có thể có một chút sai lệch. Do đó, những điểm số này sẽ là sơ bộ . Một khi thách thức này kết thúc, thời hạn sẽ được công bố. Khi hết thời hạn, 100 bảng sẽ được chọn ngẫu nhiên và tất cả các bài nộp sẽ được giải cứu trên 100 bảng này. Vui lòng đặt một số điểm ước tính trong câu trả lời của bạn, nhưng chúng tôi sẽ tự chấm điểm mỗi lần gửi để đảm bảo không có ai gian lận.
Chúng tôi đã cung cấp các chương trình điều khiển trong một số ít ngôn ngữ. Hiện tại, bạn có thể viết bài gửi của mình bằng Python (2 hoặc 3), Ruby , C ++ , C # hoặc Java . Bộ điều khiển tạo ra các bảng, chạy trò chơi và cung cấp một khung cho thuật toán di truyền. Tất cả bạn phải làm là cung cấp chức năng di chuyển.
Đợi đã, vậy chính xác thì tôi làm gì với bộ gen?
Thách thức là tìm ra điều đó!
Vì các mẫu vật không có bộ nhớ, tất cả những gì bạn có trong một lượt cho trước là một lưới màu 5x5 không có ý nghĩa gì với bạn. Vì vậy, bạn sẽ phải sử dụng bộ gen để đạt được mục tiêu. Ý tưởng chung là bạn sử dụng các phần của bộ gen để lưu trữ thông tin về màu sắc hoặc bố cục lưới và bot của bạn dựa trên quyết định của nó về thông tin bổ sung được lưu trữ trong bộ gen.
Bây giờ, tất nhiên bạn không thể thực sự lưu trữ bất cứ thứ gì ở đó bằng tay. Vì vậy, thông tin thực tế được lưu trữ ở đó ban đầu sẽ hoàn toàn ngẫu nhiên. Nhưng thuật toán di truyền sẽ sớm chọn ra những mẫu vật có bộ gen chứa thông tin đúng trong khi tiêu diệt những mẫu có thông tin sai. Mục tiêu của bạn là tìm một ánh xạ từ các bit genome và trường nhìn của bạn để di chuyển, cho phép bạn nhanh chóng tìm thấy đường dẫn đến mục tiêu và luôn phát triển thành chiến lược chiến thắng.
Điều này cần đủ thông tin để giúp bạn bắt đầu. Nếu bạn muốn, bạn có thể bỏ qua phần tiếp theo và chọn bộ điều khiển bạn chọn từ danh sách các bộ điều khiển ở phía dưới (cũng chứa thông tin về cách sử dụng bộ điều khiển cụ thể đó).
Đọc tiếp nếu bạn muốn tất cả ...
Chi tiết Gory
Thông số kỹ thuật này đã hoàn tất. Tất cả các bộ điều khiển phải thực hiện các quy tắc này.
Tất cả sự ngẫu nhiên sử dụng một phân phối thống nhất, trừ khi có quy định khác.
Theo dõi thế hệ:
- Đường đua là một lưới hình chữ nhật, rộng X = 53 ô và cao Y = 15 ô. Các ô có x ≥ 49 là các ô mục tiêu (trong đó x là không dựa trên).
- Mỗi ô có một màu duy nhất và có thể hoặc không gây chết - các ô không gây chết trừ khi được chỉ định bởi một trong các loại ô bên dưới.
- Có 16 màu ô khác nhau, được dán nhãn từ
0
đến15
, ý nghĩa của chúng sẽ thay đổi từ trò chơi này sang trò chơi khác. Ngoài ra,-1
đại diện cho các tế bào nằm ngoài giới hạn - đây là những tế bào gây chết người . - Chọn 8 màu ngẫu nhiên . Đây sẽ là các ô trống (không có tác dụng).
- Chọn thêm 4 màu ngẫu nhiên . Đây là những người dịch chuyển tức thời. Đối với hai trong số các màu này, chọn độ lệch khác không trong vùng lân cận 9x9 (từ (-4, -4) đến (4,4) ngoại trừ (0,0)). Đối với hai màu còn lại, đảo ngược các độ lệch đó. Nếu một mẫu vật bước trên thiết bị dịch chuyển tức thời, nó sẽ được di chuyển ngay lập tức bởi phần bù đó.
- Chọn thêm 2 màu ngẫu nhiên . Đây là những cái bẫy. Đối với mỗi màu này, chọn một phần bù trong vùng lân cận 3x3 (từ (-1, -1) đến (1,1)). Một cái bẫy chỉ ra rằng tế bào ở phần bù đó gây chết người . Lưu ý: Bản thân tế bào bẫy không nhất thiết gây chết người.
- Các 2 màu còn lại là bức tường, mà cản trở phong trào. Cố gắng di chuyển lên một tế bào trên tường sẽ biến việc di chuyển thành đứng yên. Các tế bào tường tự gây chết người .
- Đối với mỗi ô không có mục tiêu của lưới, chọn một màu ngẫu nhiên. Đối với mỗi tế bào mục tiêu chọn ngẫu nhiên trống màu.
- Đối với mỗi ô ở cạnh trái của bản nhạc, hãy xác định liệu mục tiêu có thể đạt được trong vòng 100 lượt hay không (theo quy tắc thứ tự lần lượt bên dưới). Nếu vậy, ô này là một ô bắt đầu được chấp nhận . Nếu có ít hơn 10 ô bắt đầu, hãy loại bỏ bản nhạc và tạo một ô mới.
- Tạo 15 mẫu vật, mỗi mẫu có bộ gen ngẫu nhiên và 0 tuổi . Đặt từng mẫu trên một ô bắt đầu ngẫu nhiên.
Đặt hàng lần lượt:
- Các bước sau đây sẽ được thực hiện, theo thứ tự, cho từng mẫu. Các mẫu vật không tương tác hoặc nhìn thấy nhau, và có thể chiếm cùng một tế bào.
- Nếu tuổi của mẫu vật là 100 , nó sẽ chết. Nếu không, tăng tuổi của nó lên 1.
- Mẫu vật được đưa ra trường nhìn của nó - một lưới màu 5x5, tập trung vào mẫu vật - và trả về một bước di chuyển trong vùng lân cận 3x3 của nó. Di chuyển ngoài phạm vi này sẽ khiến bộ điều khiển chấm dứt.
- Nếu ô mục tiêu là một bức tường, thì di chuyển được thay đổi thành (0,0).
- Nếu ô mục tiêu là một dịch chuyển tức thời, mẫu vật được di chuyển bằng phần bù của dịch chuyển tức thời. Lưu ý: Bước này được thực hiện một lần , không lặp lại.
- Nếu tế bào hiện đang bị chiếm giữ bởi mẫu vật (có khả năng sau khi sử dụng một dịch chuyển tức thời) sẽ gây chết mẫu. Đây là mẫu vật duy nhất có thời gian chết (ngoài bước 1.1. Ở trên). Cụ thể, một mẫu vật mới sinh ra trên một tế bào gây chết người sẽ không chết ngay lập tức, nhưng có cơ hội di chuyển khỏi tế bào nguy hiểm trước tiên.
- Nếu mẫu vật chiếm một ô mục tiêu, ghi điểm, di chuyển mẫu đến một ô bắt đầu ngẫu nhiên và đặt lại tuổi của nó về 0.
- Nếu có ít hơn hai mẫu vật còn lại trên bảng, trò chơi kết thúc.
- Tạo 10 mẫu vật mới với tuổi 0 . Mỗi bộ gen được xác định (cá nhân) theo các quy tắc nhân giống dưới đây. Đặt từng mẫu trên một ô bắt đầu ngẫu nhiên.
Chăn nuôi:
Khi một mẫu vật mới được tạo ra, chọn ngẫu nhiên hai cha mẹ khác nhau , với sự thiên vị đối với mẫu vật đã tiến xa hơn về phía bên phải. Xác suất của mẫu vật được chọn tỷ lệ thuận với điểm thể lực hiện tại của nó . Điểm thể lực của mẫu vật là
1 + x + 50 * số lần đạt được mục tiêu
Trong đó x là chỉ số ngang dựa trên 0. Mẫu vật được tạo ra trong cùng một lượt không thể được chọn làm cha mẹ.
Trong hai cha mẹ, chọn một ngẫu nhiên để lấy bit gen đầu tiên từ đó.
- Bây giờ khi bạn đi dọc theo bộ gen, chuyển đổi cha mẹ với xác suất 0,05 và tiếp tục lấy bit từ cha mẹ kết quả.
- Đột biến bộ gen được lắp ráp hoàn chỉnh: với mỗi bit, lật nó với xác suất 0,01 .
Ghi điểm:
- Một trò chơi kéo dài 10.000 lượt.
- Người chơi bắt đầu trò chơi với 1 điểm (để cho phép sử dụng giá trị trung bình hình học).
- Mỗi khi mẫu vật đạt được mục tiêu, người chơi sẽ ghi được một điểm.
- Hiện tại, mỗi lần gửi của người chơi sẽ được chạy trong 50 trò chơi, mỗi trò chơi có một bản nhạc ngẫu nhiên khác nhau.
- Cách tiếp cận trên dẫn đến nhiều phương sai hơn mong muốn. Một khi thách thức này kết thúc, thời hạn sẽ được công bố. Khi hết thời hạn, 100 bảng sẽ được chọn ngẫu nhiên và tất cả các bài nộp sẽ được giải cứu trên 100 bảng này.
- Điểm tổng thể của người chơi là giá trị trung bình hình học của điểm số của các trò chơi cá nhân này.
Bộ điều khiển
Bạn có thể chọn bất kỳ bộ điều khiển nào sau đây (vì chúng tương đương về chức năng). Chúng tôi đã kiểm tra tất cả trong số chúng, nhưng nếu bạn phát hiện ra lỗi, muốn cải thiện mã hoặc hiệu suất hoặc thêm một tính năng như đầu ra đồ họa, vui lòng gửi vấn đề hoặc gửi yêu cầu kéo trên GitHub! Bạn cũng được hoan nghênh thêm bộ điều khiển mới bằng ngôn ngữ khác!
Nhấp vào tên ngôn ngữ cho mỗi bộ điều khiển để đến đúng thư mục trên GitHub, trong đó có một README.md
hướng dẫn sử dụng chính xác.
Nếu bạn không quen thuộc với git và / hoặc GitHub, bạn có thể tải xuống toàn bộ kho lưu trữ dưới dạng ZIP từ trang trước (xem nút trong thanh bên).
Con trăn
- Được kiểm tra kỹ lưỡng nhất. Đây là thực hiện tham khảo của chúng tôi.
- Hoạt động với cả Python 2.6+ và Python 3.2+!
- Nó rất chậm. Chúng tôi khuyên bạn nên chạy nó với PyPy để tăng tốc đáng kể.
- Hỗ trợ đầu ra đồ họa bằng cách sử dụng
pygame
hoặctkinter
.
Hồng ngọc
- Đã thử nghiệm với Ruby 2.0.0. Nên làm việc với các phiên bản mới hơn.
- Nó cũng khá chậm, nhưng Ruby có thể thuận tiện cho việc tạo ra một ý tưởng cho bài nộp.
C ++
- Yêu cầu C ++ 11.
- Tùy chọn hỗ trợ đa luồng.
- Cho đến nay bộ điều khiển nhanh nhất trong bó.
C #
- Sử dụng LINQ, vì vậy nó yêu cầu .NET 3.5.
- Khá chậm.
Java
- Không đặc biệt chậm. Không đặc biệt nhanh.
Bảng xếp hạng sơ bộ
Tất cả các điểm số là sơ bộ. Tuy nhiên, nếu một cái gì đó là sai hoặc lỗi thời, xin vui lòng cho tôi biết. Trình ví dụ của chúng tôi được liệt kê để so sánh, nhưng không tranh cãi.
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
Tín dụng
Thử thách này là một nỗ lực hợp tác lớn:
- Nathan Merril: Đã viết trình điều khiển Python và Java. Biến khái niệm thử thách từ Vua đồi thành Cuộc đua chuột.
- trichoplax: Chơi. Làm việc trên bộ điều khiển Python.
- frageum: Đã viết trình điều khiển C ++.
- VisualMelon: Đã viết trình điều khiển C #.
- Martin Büttner: Khái niệm. Đã viết trình điều khiển Ruby. Chơi đùa Làm việc trên bộ điều khiển Python.
- T Áp-ra-ham: Chơi đùa. Đã kiểm tra Python và xem xét bộ điều khiển C # và C ++.
Tất cả những người dùng ở trên (và có lẽ một vài người nữa tôi đã quên) đã góp phần vào thiết kế tổng thể của thử thách.
Cập nhật bộ điều khiển C ++
Nếu bạn đang sử dụng C ++ với Visual Studio và đa luồng, bạn sẽ nhận được bản cập nhật mới nhất do lỗi với trình tạo số ngẫu nhiên của chúng cho phép tạo bảng trùng lặp.
'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.'