試玩 GOWOG ,初探 OpenAI(使用 NeuroEvolution 神經進化)與 Golang 多人在線遊戲開發

GOWOGjavascript

GOWOG 是一款迷你的,使用 Golang 編寫的多人 Web 遊戲。html

試玩遊戲

Demo:http://game.giongto35.com前端

在 Agent 上的 AI 實驗

因爲服務器,客戶端和消息是分離的,所以很容易與後端進行通訊。
此項目是用 Python 編寫的 AI agent,能夠學習與環境的交互。
這個實驗是利用 neuroevolution (神經進化)在迷宮中尋找一條路徑。java

油管 Demo:https://www.youtube.com/watch?v=pWbb1m91mhUpython

本地 Docker 運行

run_local.shwebpack

#!/bin/bash
docker build . --build-arg HOSTNAME=localhost:8080 -t gowog_local|| exit
docker stop gowog
docker rm gowog
docker run --privileged -d --name gowog -p 8080:8080 gowog_local server -prod client/build/

執行,我本地是 Macgit

./run_local.sh

打開 http://www.javashuo.com/tag/http://localhost:8080es6

本地開發

遊戲包含兩部分:服務器和客戶端。服務器使用 Golang,客戶端使用 Node.JSPhaser 遊戲引擎。github

服務器

爲少調整過的項目:Kirk-Wang/gowoggolang

個人本地環境是 go 1.14

本地啓動:

go run cmd/server/*

服務器將監聽 8080

客戶端

npm install
npm run dev -- --env.HOST_IP=localhost:8080 # HOST_IP -> 服務器地址

進入 http://localhost:3000

注意

在開發過程當中,客戶端在端口 3000 上運行,服務器端在端口 8080 上運行。

productiondocker環境中,已構建 Client,golang 服務器將在同一端口 8080 上返回客戶端頁面。所以,若是咱們運行 docker 環境,則遊戲將在瀏覽器中的 http://www.javashuo.com/tag/http://localhost:8080 運行。

通信約定

服務器和客戶端之間的通訊包基於 protobuf。 安裝 protoc 以生成 protobuf

每次你在 server/message.proto 中有更改(package singature)時。請運行:

cd server
./generate.sh

遊戲前端設計

這個前端項目是基於:

├── client
│   ├── index.html
│   ├── src
│   │   ├── config.js: javascript config
│   │   ├── index.html
│   │   ├── main.js
│   │   ├── sprites
│   │   │   ├── Leaderboard.js: Leaderboard object
│   │   │   ├── Map.js: Map object
│   │   │   ├── Player.js: Player object
│   │   │   └── Shoot.js: Shoot object
│   │   ├── states
│   │   │   ├── Boot.js Boot screen
│   │   │   ├── const.js
│   │   │   ├── Game.js: Game master
│   │   │   ├── message_pb.js: Protobuf Message
│   │   │   ├── Splash.js
│   │   │   └── utils.js
│   │   └── utils.js

每一個對象都是從 Sprite 繼承的類。
玩家包含 shootManager,每次射擊時,shoot manager 都會生成新的 bullet

遊戲後端設計方案

Components(組件)

遊戲中主要有 5 個實體。他們的狀態是私有的

實體 私有狀態
Client websocket.Conn client hold 住 websocket 鏈接
Hub Client Hub 處理全部通信, 包含全部 client 列表
ObjManager Player, Shoot, ... ObjManager 包含全部 Player 和 Shoot,處理遊戲邏輯
Game Master ObjManager, Hub Master object 由 ObjManager 和 Hub 組成

Architecture(架構圖)

不一樣的實體經過包裝在函數中的 channel 彼此調用。

Client 與 Server 交互設計方案

Player connect(玩家鏈接)

Player Disconnect(玩家斷開鏈接)

Client input(客戶端輸入)

Profile

Profile 是研究 Golang 性能並找出 slow components 的方法。運行服務器時,可使用標誌 --cpuprofile--memprofile 來配置 server。

cd server
go run cmd/server/* --cpuprofile --memprofile

代碼結構

├── server
│   ├── cmd
│   │   └── server
│   │       └── server.go: Entrypoint running server
│   ├── game
│   │   ├── common
│   │   ├── config
│   │   │   └── 1.map: Map represented 0 and 1
│   │   ├── gameconst
│   │   ├── game.go: Game master objects, containing logic and communication
│   │   ├── mappkg
│   │   ├── objmanager
│   │   ├── playerpkg
│   │   ├── shape
│   │   ├── shootpkg
│   │   ├── types.go
│   │   └── ws
│   │       ├── wsclient.go
│   │       └── wshub.go
│   ├── generate.sh: Generate protobuf for server + client + AI environment
│   ├── message.proto
│   └── Message_proto
│       └── message.pb.go
├── Dockerfile
└── run_local.sh

AI 訓練設計方案

此倉庫包含遵循 openAI Gym 格式和訓練腳本的 CS2D 環境。
訓練腳本使用 NeuroEvolution(神經進化)在迷宮中找到到達目的地的最短路徑。

https://www.youtube.com/watch?v=pWbb1m91mhU

運行

按照的說明運行 gowog 環境。即本地 Docker 運行:

./run_local.sh

使用 virtualenv 設置 python3 虛擬環境(直接用 Docker 吧~)。

  • 安裝 requirements.txt 所包含的庫。

運行訓練腳本

python train_ga.py -n save_file_name

save_fie_name 是保存權重(weights)的地方。
在下一次,若是咱們指定了一個現有的文件,它將繼續從該文件的最後一次運行中的權重(weights)進行訓練。

Genetic Algorithm(遺傳算法)

_cs2denv_ga.py 的實現_

基於機器學習的目的,CS2D Agent 是在 CS2D 上構建的。
它遵循 openAI gym,支持 agent 的基本方法,包括:reset()step()observation_spaceaction_space

ObservationSpace 是一個一維數組,它由來自服務器的 update_player 消息構造而成

  1. Player position(玩家位置), player size(玩家大小尺寸), number of columns(列數), number of rows(行數), block width(塊寬度), block height(塊高度
  2. 到左,右,上,下到最近 block()的距離。此輸入是爲了不碰撞
  3. 玩家在二進制塊地圖(binary block map)中的位置。地圖是 012 維數組(0 爲空,1 爲塊)
  4. binary block map

獎勵是 1 / distance(目標的距離)。若是 agent 接近目標 100 點,那麼獎勵就是 1,情節結束。

NeuroEvolution(神經進化)

_train_ga.py 的實現_

神經網絡(Neural Network)經過使輸入(觀察空間)經過神經網絡來得到最佳動做。

NeuroEvolution(神經進化)是使用進化算法不斷改進人工神經網絡的AI。對於每次迭代(生成),程序將基於前一次迭代中的最佳設置生成一組新的神經網絡權重。 由先前的 NN(神經網絡) 生成一個 NN 的過程叫作 Mutate,它給神經網絡中的每一個參數添加隨機噪聲。

一個特別的改進是,咱們只存儲應用於神經網絡的噪聲種子列表,而不是存儲全部的代權值。由於在同一個種子下,全部的隨機化都是相同的,因此一個種子能夠表明一個網絡的突變算子。咱們不須要保留每一代的全部權值,咱們只須要存儲一組從開始到當前一代的種子,而後從這組種子中從新構造權值來獲得全部神經網絡的權值。

代碼是基於 Maxim Lapan"Deep Reinforcement Learning Hands-On"

我是爲少。
微信:uuhells123。
公衆號:黑客下午茶。
謝謝點贊支持👍👍👍!
相關文章
相關標籤/搜索