RLCOMP

Đấu trường Reinforcement Learning

Tổng giải thưởng:

  • Thời gian đăng ký:

    14/07/2020 - 05/08/2020
  • Thời gian gửi mã nguồn:

    08/08/2020 - 26/09/2020
Lần đầu tiên có mặt tại Việt Nam!

♦ MÔ TẢ

Trong trò chơi này, bạn phải điều khiển nhân vật của mình di chuyển trên một bản đồ được thể hiện dưới dạng ma trận hai chiều để vượt qua các chướng ngại vật và đào được nhiều vàng nhất có thể. Hãy chú ý quan sát bản đồ và cẩn thận với thanh năng lượng của mình để đưa ra các chiến thuật đúng đắn!

♦ CÂU CHUYỆN

Bạn là một thợ săn kho báu đi vào rừng để tìm kiếm những mỏ vàng được chôn sâu trong rừng. Ở đây, các thợ săn khác cũng đang vội vã đi tìm kho báu của mình vì vậy đừng chần chừ thêm nữa. Khu rừng thiêng đầy rẫy các cạm bẫy nguy hiểm nhưng mong bạn đừng nản lòng, vì trải qua gian khó mới thấy chiến thắng giá trị nhường nào!

♦ MỤC TIÊU

Bạn cần đào được số vàng nhiều nhất với số năng lượng tiêu tốn là ít nhất. Trong khu rừng nơi bạn đang đứng có rất nhiều cạm bẫy và chướng ngại vật, vì vậy hãy di chuyển một cách thông minh và sử dụng lệnh nghỉ đúng lúc.

♦ LUẬT CHƠI

  • thợ săn kho báu (1 ≤ n ≤ 4) sẽ cùng xuất phát tại cùng một điểm trong khu rừng.
  • Bản đồ khu rừng được biểu diễn dưới dạng một ma trận 2 chiều w*h. (w=21, h=9)
  • Số năng lượng lúc đầu của mọi người là 50.
  • Lượt chơi mỗi trận đấu là 100, mỗi lượt người chơi sẽ phải thể hiện một trong các hành động.
GoLeft GoRight GoUp GoDown Free Craft
Đi sang trái ← Đi sang phải → Đi lên ↑ Đi xuống ↓ Nghỉ ngơi Đào vàng
  • Sau mỗi 1 lượt, hệ thống sẽ gửi lại phương án đi của những người chơi khác đồng thời cập nhật số vàng và năng lượng của mỗi người chơi.
  • Người chơi phải vượt qua các chướng ngại vật và đào thật nhiều vàng để chiến thắng.

♦ QUY TẮC TIÊU THỤ NĂNG LƯỢNG:

Đi vào một trong các ô sau hoặc đào vàng sẽ tiêu tốn số năng lượng như sau:

Đất

-1 năng lượng

Mỏ vàng

-4 năng lượng

Đào vàng

-5 năng lượng

Rừng

là giá trị ngẫu nhiên từ trong đoạn [-5, -20]​ năng lượng

Đầm lầy:

-5 -> -20 -> -40 -> 100​ năng lượng. Năng lượng cần dùng sẽ tăng dần theo số lần vào ô có đầm lầy. Lần đầu tiên sẽ là trừ 5 năng lượng, lần thứ 2 là 20... (số lần vào tính theo lượt chơi)

Bẫy

-10 năng lượng. Chỉ được sử dụng 1 lần (tính theo lượt chơi. Nếu trong 1 lượt chơi, nhiều người chơi cùng đi vào 1 ô bẫy (chưa được sử dụng), thì tất cả đều sẽ bị trừ 10 năng lượng. Sau khi được sử dụng, bẫy chuyển thành đất.

♦ QUY TẮC HỒI NĂNG LƯỢNG:

Để hồi năng lượng, nhà thám hiểm phải dành thời gian ngồi nghỉ:

Số lần nghỉ 1 lượt 2 lượt liên tiếp 3 lượt liên tiếp Năng lượng hồi quá E
Số năng lượng hồi [E/4] [E/4] + [E/3] [E/4] + [E/3] + [E/2] Không hồi thêm

Lưu ý: kết quả của phép chia được làm tròn xuống số nguyên gần nhất

♦ QUY TẮC ĐÀO VÀNG:

Giả sử tại thời điêm hiện tại, lượng vàng trong mỏ là G và có m người cùng đào vàng. Số lượng vàng mỗi người thu được được tính toán như bảng dưới đây:

Lượng vàng Lượng vàng mỗi người đạt được Lượng vàng còn lại ở mỏ Năng lượng tiêu tốn
G >= m*50 50 G-m*50 5
G < m*50 ceil(G/m) 0
(ô này chuyển thành ô đất)
5

♦ CÁC QUY TẮC KHÁC:

    • Không đứng tại mỏ mà dùng lệnh đào vàng: -1năng lượng
    • Đi ra khỏi bản đồ: Loại
    • Không đưa ra hành động khi đến lượt chơi: Loại
    • Năng lượng của người chơi <= 0Loại

♦ QUY TẮC CHIẾN THẮNG

  • Chỉ còn duy nhất 1 người do những người khác đã bị loại thì người đó là người chiến thắng
  • Nếu số vàng ở mỏ được đào hết trước T lượt hoặc hết T lượt chơi:
    • Người có nhiều vàng nhất sẽ chiến thắng
    • Nếu có nhiều người được số vàng cao bằng nhau, người nhiều năng lượng nhất sẽ chiến thắng.
    • Nếu có nhiều người có cùng số vàng và năng lượng cao bằng nhau, hệ thống sẽ chọn ngẫu nhiên một người chiến thắng

♦ MÔI TRƯỜNG:

  • Hệ điều hành: Ubuntu 18.04.4 LTS (4 vCPUs, 2.5 GHz, No GPU, 2 GiB memory)
  • Ngôn ngữ: Python3 (phiên bản 3.6.9)
  • Kích cỡ mã nguồn + Thư viện: < 30MB (người chơi phải sử dụng thư viện có sẵn của ngôn ngữ lập trình hoặc thư viện nhúng vào mã nguồn của bạn để nó có thể chạy trên máy chủ.)
  • Tensorflow 1.14.0 và 2.2.0
  • Keras 2.3.1
  • Numpy 1.18.4
  • Pandas 0.15
  • PyTorch 1.5.0
  • joblib 0.16.0
  • ray 0.8.6 (ray[rllib], ray[tune])
  • requests 2.24.0
  • semver 2.10.2 
  • tf-agents 0.3.0 (0.5.0 trên tensorflow 2.2.0)
  • Pyqlearning v1.2.4
  • Mushroom-RL v1.4.0
  • gym 0.17.2
  • opencv-python 4.2.0.34
  • prettytable 0.7.2
  • yacs 0.1.7

♦ CẤU TRÚC MÃ NGUỒN:

  • Cấu trúc của mã nguồn sẽ như sau: 

Trong đó:

    • Bài thi của bạn cần có 2 thư mục là srcbuild
    • Thư mục src chứa mã nguồn và tập tin build.sh: Khi chạy tập tin build.sh, các mã nguồn đã được biên dịch sẽ được đưa vào thư mục build. Chú ý, việc biên dịch mã nguồn được xem là thành công chỉ khi thực hiện tập tin build và không có bất kỳ một tin nhắn nào trả về (bao gồm cả tin nhắn cảnh báo (Warning)). Lệnh chạy sẽ là python3
    • Thư mục build cần có thêm tập tin run.sh
    • Mã nguồn của bạn sẽ được chạy qua việc gọi tập tin run.sh
  • Cách tải mã nguồn lên hệ thống:
    • Máy khách của bạn có thể kết nối máy chủ thành công và đạt được ít nhất 50 điểm thì được xem là đạt yêu cầu, và trạng thái sẽ là Verified
    • Nén bài thi thành tập tin .zip với tên bất kỳ và tải tập tin lên hệ thống
    • Sau khi tải đoạn mã hệ thống sẽ trả về trạng thái Building, Build Failed, Verifying, Failed hoặc Verified:
      • Build Failed, Failed: hệ thống sẽ cho phép người dùng tải về tập tin chứa thông tin lỗi.
      • Verifying, Failed, Verified: người dùng sẽ xem được màn hình chạy của trò chơi.

♦ GIAO TIẾP GIỮA NGƯỜI CHƠI VÀ MÁY CHỦ:

Máy chủ và người chơi sẽ giao tiếp thông qua socket. Thông tin của socket (host, port) sẽ được truyền ở tham số đầu vào khi chạy tập tin run.sh

  • Các tin nhắn trao đổi giữa người chơi và máy chủ:
    • Khi người chơi kết nối đến máy chủ thành công, máy chủ sẽ gửi về cho người chơi tin nhắn có nội dung như sau:
      { 
          "playerId": int,
          “posx”: int,
          “posy”: int,
          “energy”: int,
          "gameinfo": {
              "numberOfPlayers": int,
              "width": int,
              "height": int,
              "steps": int,
              "golds":[
                  {
                      "posx": int,
                      "posy": int,
                      "amount": int
                  }
              ],
              "obstacles":[
                  {
                      "type": int, //0: đất, 1: rừng, 2: bẫy, 3: đầm lầy
                      "posx": int,
                      "posy": int,
                      "value": int
                  }
              ]
          }
      }

Trong đó:
♦ Thông tin người chơi gồm:
- playerId: mã ID của người chơi
- (posx, posy): tọa độ khởi tạo ban đầu
- energy: năng lượng khởi tạo ban đầu

♦ Thông tin trận đấu gồm:
- numberOfPlayers: số người chơi tham gia trận đấu
- (width, height): kích thước của bản đồ
- steps: số lượt tối đa trong trận đấu
- golds: thông tin của các mỏ vàng bao gồm tọa độ (posx, posy) và khối lượng vàng ban đầu (amount)
- obstacles: thông tin các chướng ngại vật trên đường đi bao gồm tọa độ (posx, posy), loại chướng ngại vật (type), và giá trị của chướng ngại vật (value <= 0, là năng lượng mà người chơi sẽ mất khi đi vào ô có vật cản tương ứng). Nếu kiểu dữ liệu của vật cản là rừng (type = 1), value = 0

Các loại chương ngại vật được thể hiện bằng số nguyên như sau: 0: đất, 1: rừng, 2: bẫy, 3: đầm lầy

  • Mỗi lượt chơi, người chơi gửi lên máy chủ 1 trong câu lệnh: "0", "1", "2", "3", "4", "5" với ý nghĩa:
     "0"  đi sang trái
     "1"  đi sang phải
     "2"  đi lên
     "3"  đi xuống
     "4"  nghỉ ngơi
     "5"  đào vàng
    ngoài các câu lệnh trên bị loại
  • Sau khi người chơi gửi các hành động đến máy chủ, máy chủ phản hồi lại trạng thái mới của bản đồ như sau:
    {
            "players":[
                {
                    "playerId": int,
                    "posx": int,
                    "posy": int,
                    "score": int,
                    "energy": int,
                    "status": int, //0: PLAYING, 1: ELIMINATED_WENT_OUT_MAP, 2: ELIMINATED_OUT_OF_ENERGY, 3: ELIMINATED_INVALID_ACTION, 4: STOP_EMPTY_GOLD, 5: STOP_END_STEP
                    "lastAction": int //0: đi sang trái, 1: đi sang phải, 2: đi lên, 3: đi xuống, 4: nghỉ ngơi, 5: đào vàng, 6: bị loại (trường hợp action = null do đã bị loại)
                }
            ],
            "golds":[
                {
                    "posx": int,
                    "posy": int,
                    "amount": int
                }
            ]  ,
            "changedObstacles":[
                {
                    "posx": int,
                    "posy": int,
                    "type": int,
                    "value": int
                }
            ] 
    }
    

Trong đó, trạng thái của tất cả người chơi gồm:
- playerId: mã ID của người chơi
- (posx, posy): tọa độ hiện tại của người chơi
- score: điểm của người chơi (số vàng đã đào được)
- energy: năng lượng còn lại của người chơi
- lastAction: hành động của người chơi ở lượt chơi trước (state = 6 nghĩa là người chơi đã bị loại)
- status: trạng thái hiện tại của người chơi (đang chơi, bị loại hay đã dừng do trận đấu đã kết thúc)

golds: thông tin các mỏ vàng hiện tại trên bản đổ

changedObstacles: là danh sách các vật cản bị thay đổi bởi lượt chơi vừa xảy ra. Bao gồm: vàng -> đất sau khi đã đào hết, bẫy -> đất khi có người chơi đi vào, và năng lượng của đầm lầy bị thay đổi khi có nguời chơi đi vào.
Hành động của người chơi được thể hiện như sau:

 "0"  đi sang trái
 "1"  đi sang phải
 "2"  đi lên
 "3"  đi xuống
 "4"  nghỉ ngơi
 "5"  đào vàng
 "6"  bị loại

Trạng thái của người chơi được thể hiện như sau:

 "0"  đang chơi
 "1"  bị loại vì đi ra khỏi bản đồ
 "2"  bị loại vì hết năng lượng
 "3" bị loại vì không gửi action cho server hoặc hành động không phải là giá trị từ "0"-"5"
 "4" kết thúc trận đấu vì hết vàng
 "5" kết thúc trận đấu vì hết lượt đi
    • Khi người chơi bị loại, máy chủ sẽ ngắt kết nối với người chơi
    • Khi trò chơi kết thúc máy chủ sẽ ngắt kết nối đến tất cả người chơi.
    • Cách tính tọa độ của bản đồ:
      • (0,0) là điểm trái trên cùng của bản đồ
      • (posx, posy) được tính bắt đầu từ (0,0) với posx là cột thứ posx và posy là hàng thứ posy trên bản đồ.

    ♦ CÁC GIỚI HẠN VỀ THỜI GIAN:

    • Thời gian kết nối đến máy chủ: 1 phút. Nghĩa là trong vòng 1 phút, từ thời điểm chạy bài thi (chạy tập tin run.sh), nếu máy chủ không nhận được kết nối từ người chơi thì được xem là kết nối thất bại. Và người chơi sẽ bị loại khỏi cuộc thi.
    • Thời gian chờ giữa các step: 1000 ms. Nghĩa là trong vòng 1000 ms, tính từ thời điểm máy chủ gửi trạng thái của trò chơi cho người chơi, mà máy chủ không nhận được action từ phía người chơi thì người chơi sẽ bị loại khỏi trận đấu. Kết nối giữa người chơi và máy chủ sẽ bị ngắt.

    ♦ MÃ NGUỒN ĐƯỢC XÁC NHẬN NHƯ THẾ NÀO?

    • Ngay sau khi nhận được tập tin .zip, máy chủ sẽ thực hiện biên dịch đoạn mã (chạy tập tin build.sh) và chạy thử mã nguồn (chạy tập tin run.sh) để đảm bảo cấu trúc mã nguồn là đúng và việc kết nối đến máy chủ socket thành công. Chú ý, lúc này máy chủ sẽ không thực hiện tính điểm cũng như không đánh giá nội dung tin nhắn mà người chơi gửi lên máy chủ là đúng hay sai.
    • Mã nguồn mẫu:
      Tải mã nguồn mẫu tại đây: sample-source

      Hướng dẫn cài đặt môi trường: MinerAI - Cài đặt môi trường.pdf 

      Hướng dẫn huấn luyện tại local PC: MinerAI - CodeAISample.pdf

      Version Date: 2020/09/08 10:26 

      Nội dung cập nhật: Change logs.docx

      (Bạn cũng có thể sử dụng Git để clone mã nguồn mẫu về từ repository: https://github.com/xphongvn/rlcomp2020)

    ♦ SỐ LẦN NỘP BÀI:

    Mỗi đội thi được submit code không giới hạn số lượt lên hệ thống, nhưng chỉ được thi đấu tối đa 20 lượt với Bot của Ban tổ chức.

    Lượt đấu với bot sẽ được tự động kích hoạt sau khi code của đội thi được verify thành công. Mỗi lượt sẽ có 5 trận đấu.

    Không tìm thấy dữ liệu

    Không tìm thấy dữ liệu