マルコフ連鎖の概念を体験できる、高校生向けのインタラクティブなウェブゲームです。プレイヤーはグラフのエッジの重みを操作し、マルコフ過程の定常状態(固有ベクトル)に基づいてスコアを競います。
このゲームは、プレイヤーがグラフの構造に影響を与え、その結果として生じるマルコフ連鎖の定常状態を操作することを目指します。各ターンでプレイヤーは限られたポイントを消費してエッジの重みを変更し、最終的なスコアは定常状態におけるプレイヤーノードの成分によって決定されます。
- ルーム管理: 既存のゲームルームに参加するか、新しいルームを作成できます。
- カスタマイズ可能なルーム設定: 新規ルーム作成時に、プレイヤー数、非プレイヤーノード数、ラウンドごとのポイント、最大ターン数を設定できます。
- リアルタイムなゲーム進行: WebSocketを通じて、他のプレイヤーの動きやスコア計算の更新がリアルタイムで反映されます。
- インタラクティブなグラフ表示: 現在のグラフの状態(ノードとエッジ、重み)を視覚的に表示します。頂点位置はドラッグで自由に配置できます.
- スコア計算とランキング: 各ターンの終了時にマルコフ連鎖の定常状態を計算し、プレイヤーのスコアを更新します。ゲーム終了時には最終ランキングが表示されます。
- プレイヤー数: N人で対戦します。
- 初期盤面: N個のプレイヤーノードとM個の非プレイヤーノードが、対称的に適当に連結された重み付きグラフが初期盤面となります。
- ラウンドの進行: 各ラウンドで、それぞれのプレイヤーには K ポイントが割り振られます。
- ムーブの提出: プレイヤーは、Kポイント分の「ムーブ」を他のプレイヤーに伏せて提出します。1ポイントにつき,選んだ辺の重みを1増やすか減らすことができます.ポイントを使い切るまで,複数の辺の重みを変更できます.
- 盤面への反映: 全てのプレイヤーがムーブを提出した後、それらが盤面に反映されます。
- スコア計算: 盤面である重み付きグラフの、固有値1の固有ベクトル(マルコフ過程の定常状態)を計算します。固有ベクトルのプレイヤーノードの成分がそのプレイヤーの得点になります。(解の一意性を保証するために、全ての辺の重みに小さな正の値を加えます。)
- ターン: 上記のプロセスを S ターン繰り返します。
- ゲーム終了: ゲーム終了時に、得点の高い順にランキングが表示されます。
- フロントエンド: React (JavaScript)
- グラフ描画:
vis-network
- グラフ描画:
- バックエンド: Python (FastAPI)
- マルコフ連鎖計算:
numpy,scipy
- マルコフ連鎖計算:
- データベース: (現時点ではインメモリまたは簡易的なファイルベース)
- リアルタイム通信: WebSocket
このプロジェクトをローカル環境でセットアップし、実行するための手順です。
- Node.js (npm)
- Python 3.9+
- pip (Pythonのパッケージインストーラ)
git clone https://github.com/shizuo-kaji/markov-game.git
cd markov-gamecd backend
python3 -m venv venv
source venv/bin/activate # Windows: .\venv\Scripts\activate
pip install -r requirements.txt
uvicorn main:app --reloadバックエンドは http://localhost:8000 で起動します。
新しいターミナルを開き、プロジェクトのルートディレクトリに戻ってから実行します。
frontend/.env の内容を,backend の URL に合わせて適宜編集してください.コメントアウトすると local 環境で動きます.
cd ../frontend
mv .env .env.org
npm install
npm startフロントエンドは http://localhost:3000 で起動します。
ブラウザで以下のURLを開いてゲームを開始します。
http://localhost:3000/
このプロジェクトは、Render.com を利用して簡単にデプロイできます。フロントエンドは「Static Site」、バックエンドは「Web Service」としてデプロイすることを推奨します。GitHubリポジトリを連携させることで、自動デプロイも設定可能です。
- Renderダッシュボードで「New +」 > 「Web Service」を選択し、このGitHubリポジトリを選択します。
- 以下の設定を行います。
- Root Directory:
backend - Environment:
Python 3 - Build Command:
pip install -r requirements.txt - Start Command:
uvicorn main:app --host 0.0.0.0 --port $PORT
- Root Directory:
- 「Create Web Service」をクリックしてデプロイします。
- デプロイが完了したら、発行された
.onrender.comのURLを控えておきます。
- Renderダッシュボードで「New +」 > 「Static Site」を選択し、再度このGitHubリポジトリを選択します。
- 以下の設定を行います。
- Root Directory:
frontend - Build Command:
npm install && npm run build - Publish Directory:
build
- Root Directory:
- 「Advanced」を開き、環境変数を追加します。
- Key:
REACT_APP_BACKEND_URL - Value: 先ほど控えたバックエンドのURL
- Key:
- 「Create Static Site」をクリックしてデプロイします。
これで、フロントエンドとバックエンドが連携して動作します。
このプロジェクトは、AWS CloudShell を使用して簡単に AWS にデプロイできます。デプロイスクリプトは、フロントエンドを Amazon S3 + CloudFront に、バックエンドを AWS Elastic Beanstalk にデプロイします。
- AWS CloudShell 環境
- CloudShell を起動し、プロジェクトのルートディレクトリに移動します。
git clone https://github.com/shizuo-kaji/markov-game cd markov-game - 以下のコマンドでデプロイスクリプトに実行権限を付与します。
chmod +x deploy_aws.sh
- スクリプトを実行します。
./deploy_aws.sh
スクリプトは、デプロイの進行状況を表示し、完了後にフロントエンドとバックエンドのURLを出力します。デプロイには数分から十数分かかる場合があります。
デプロイしたAWSリソースを削除するには、クリーンアップスクリプトを使用します。これにより、不要な課金を防ぐことができます。
- プロジェクトのルートディレクトリにいることを確認します。
- 以下のコマンドでクリーンアップスクリプトに実行権限を付与します。
chmod +x cleanup_aws.sh
- スクリプトを実行します。
./cleanup_aws.sh
注意: このスクリプトは、deploy_aws.shで作成されたリソースを削除します。実行する際は、削除されるリソースをよく確認してください。