Skip to content

[Step 4-1] Docker-based AI execution engine implementation #24

@takaokouji

Description

@takaokouji

概要

Issue #25 Step 4のsub issueとして、DockerベースのAI実行エンジンを実装します。

現在のAiEngineを完全に置き換え、AIコードを独立したDockerコンテナプロセスで実行し、標準入出力でのJSON通信により安全なAI実行環境を提供します。

背景

現在の実装では、AIコードが同一プロセス内で実行されるため、グローバル変数の定義や危険な操作によるセキュリティリスクがあります。Dockerコンテナによる独立プロセス実行により、これらの問題を解決します。

実装要件

Docker実行環境

  • ベースイメージ: 現在のsmalruby-koshienと同じ公式イメージ
  • Dockerfile更新: gui/smalruby-koshien/Dockerfileの更新でAIプロセスイメージも更新される構成
  • コンテナ実行単位: 1ラウンド単位でPlayer A/B独立実行
  • リソース制限:
    • メモリ: 256MB
    • 実行時間: 5秒(標準出力への出力がない場合タイムアウト)

標準入出力プロトコル(JSON形式)

// 入力例(AiEngine → AIプロセス)
{
  "type": "turn_start", 
  "map": [...], 
  "player": {...}, 
  "turn": 1
}

// 出力例(AIプロセス → AiEngine)
{
  "type": "action", 
  "command": "move_to", 
  "args": ["1:2"]
}

// デバッグログ出力例
{
  "type": "debug", 
  "message": "探索開始"
}

AI段階別テストケース実装

以下のテストケースをspec/fixtures/player_ai/に作成:

(1) 何もせずにタイムアウト

  • 成功条件:
    • 1ターンで終了
    • 得点が0のまま

(2) 最後までターンを進めるだけ

  • 成功条件:
    • 50ターンまで進行
    • プレイヤー位置が変化しない
    • 得点が0のまま

(3) 最後まで左右に往復

  • 成功条件:
    • 50ターンまで進行
    • x座標が+1, -1, +1, -1と変化
    • 移動得点が加算される

(4) 最後まで上下に往復

  • 成功条件:
    • 50ターンまで進行
    • y座標が+1, -1, +1, -1と変化
    • 移動得点が加算される

(5) 同じ場所を探索するだけ

  • 成功条件:
    • 50ターンまで進行
    • プレイヤー位置が変化しない
    • マップ探索情報の受け渡しが正常動作

(6) 全領域を順に探索するだけ

  • 成功条件:
    • 50ターンまで進行
    • プレイヤー位置が変化しない
    • 全領域探索情報の受け渡しが正常動作

(7) 最後まで全領域を順に探索後、ゴールに向かう

  • 成功条件:
    • 最初の8ターンで全領域を探索し終えること
    • 最短経路でゴールまで向かうこと
    • ゴール後にAiプロセスが停止すること
    • 途中に加点アイテムがあっても避けないこと
    • 途中に減点アイテムがあっても避けないこと
    • 途中に妨害キャラクターがいても避けないこと
    • 移動した分の得点が加算されること (5回移動するごとに3点)
    • enemyと接触した回数だけ減点されること (1回接触するごとに-10点)

(8) 最後まで全領域を順に探索後、減点アイテムを避けてゴールに向かう

  • 成功条件:
    • 最初の8ターンで全領域を探索し終えること
    • 減点アイテムを避けたうえで、最短経路でゴールまで向かうこと
    • このコード自体は無限ループだが、ゴール後にAiプロセスが停止すること
    • 途中に加点アイテムがあっても避けないこと
    • 途中に減点アイテムがあると避けること
    • 途中に妨害キャラクターがいても避けないこと
    • 移動した分の得点が加算されること (5回移動するごとに3点)
    • enemyと接触した回数だけ減点されること (1回接触するごとに-10点)

実装タスク

1. アーキテクチャ設計

  • Docker-based AI execution engine の詳細設計
  • JSON通信プロトコルの仕様策定
  • エラーハンドリング・タイムアウト処理の設計

2. AIテストケース作成

  • spec/fixtures/player_ai/stage_01_timeout.rb - 何もせずタイムアウト
  • spec/fixtures/player_ai/stage_02_wait_only.rb - ターンを進めるだけ
  • spec/fixtures/player_ai/stage_03_horizontal_move.rb - 左右往復
  • spec/fixtures/player_ai/stage_04_vertical_move.rb - 上下往復
  • spec/fixtures/player_ai/stage_05_explore_local.rb - 同じ場所探索
  • spec/fixtures/player_ai/stage_06_explore_all.rb - 全領域探索

3. Docker環境構築

  • gui/smalruby-koshien/Dockerfileの更新
  • AIプロセス実行用のDockerコンテナ設定
  • リソース制限(256MB memory, 5sec timeout)の実装

4. DockerAiEngine実装

  • 現在のAiEngineクラスを置き換え
  • Dockerコンテナの起動・管理
  • JSON形式での標準入出力通信
  • タイムアウト・エラーハンドリング
  • デバッグログの処理

5. テスト・検証

  • 各段階(1-6)のAIコードの動作確認
  • リソース制限の動作確認
  • エラー・タイムアウト処理の確認
  • パフォーマンステスト

参考資料

  • /gui/smalruby-koshien/GAME_LOGIC_DOCUMENTATION.md#136 - AIコードサンプル
  • Stage.new、list使用方法の参考実装

完了条件

  • 段階(1)-(6)のAIコードが想定通りに動作する
  • Dockerコンテナでの独立実行が正常動作する
  • JSON通信プロトコルが正しく機能する
  • リソース制限・タイムアウト処理が正常動作する
  • 全てのテストケースがパスする

関連Issue

注意事項

  • 段階(7)以降は本Issue完了後に成功条件を明確化予定
  • 既存スモウルビー甲子園の競技プログラムとの結果一致確認は次段階で実施

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions