本文へスキップ

04 / 05 · 2023.07 — 2024.07

広州辰創科技発展有限公司

シミュレーション・推演の製品ラインでバックエンドとエージェント開発を担当。Go(Gin)で戦場シミュレーションの業務メインサービス・エンジンのライフサイクル管理・多人数共同編集を実装し、Python で C++ のゲーム推演基盤と連携して赤・青のエージェントとリアルタイム監視ツールを開発した。

職種
Python 開発エンジニア
業種
シミュレーション・推演(研究向けソフト)
所在地
北京
在籍
1年1ヶ月

主な成果

  • 約 100 本

    業務メインサービスの API。型式・エンティティ・装備・データ辞書・テンプレート・想定バージョンなど 17 モジュール

  • 38 本

    ZeroMQ + Protobuf でラップしたゲーム推演基盤との連携 API

  • 16 体

    配備・評価した参加エージェント(ルール/機械学習/深層学習)

この会社での案件

PROJECTS · 2

2023.07 – 2024.07(1年) · バックエンド開発(Go / Python)

戦場並行シミュレーションシステム

同社の中核製品で、研究機関向けの B/S 構成の戦場シミュレーションプラットフォーム。ユーザーは 3D デジタル地球上で作戦想定を編成し、ワンクリックでシミュレーションエンジンへ送って推演。態勢をリアルタイムに 3D 表示し、多人数での共同編集、録画再生、効果評価を行う。

  • 業務メインサービス(Gin + MongoDB)の設計・開発を担当。router / controller / service / model の階層構成で、型式・エンティティ・装備・データ辞書・テンプレート・想定バージョンなど 17 モジュール・約 100 本の API を実装
  • 推演エンジンのライフサイクル管理を設計:ポートの動的割り当て、想定のエンジン入力へのエクスポート、os/exec によるプロセス起動と登録、goroutine での終了監視と資源の自動回収により、複数推演の並行実行に対応
  • WebSocket Hub でタスク単位のルームによる想定の多人数共同編集を実装:読み書き 2 つのコルーチン+ハートビート、想定ツリーをフラット化したインデックスキャッシュ、差分コマンドのリアルタイム配信
  • オペレータサービスの開発:想定 JSON → 外部シミュレーションエンジン XML 変換(3,000 行超)、GeoJSON による領域・交差・和集合の空間演算。態勢のフレーム単位録画と、一時停止・倍速・タイムライン再生を実装
  • Go でエンジンコンソールを開発し、TCP でスケジューラと接続してエンジンコマンドを中継。推演の開始/停止/一時停止/再開の HTTP API を提供
  • Tornado + SciPy でレーダー信号生成サービス(線形 FM パルス、クラッタ、エコー)を開発。バックグラウンドスレッドで非同期生成し Docker で配備
  • Go
  • Gin
  • MongoDB
  • MySQL
  • Redis
  • NSQ
  • WebSocket
  • Python
  • Tornado
  • SciPy
  • Docker

システム構成

システム全体構成
L1 ブラウザ 想定編集 Vue 2 + Cesium の 3D デジタル地球 多人数の共同編集 推演制御 開始 / 一時停止 / 再開 倍速 · タイムライン 態勢表示 3D 表示 · 録画再生 効果評価 L2 業務サービス(Go) 業務メインサービス(Gin) 17 モジュール · 約 100 API router / controller / service / model WebSocket Hub タスク単位のルーム 読み書き 2 コルーチン + ハートビート オペレータサービス 想定 JSON → エンジン XML(3,000 行超) GeoJSON 空間演算 · 態勢録画 L3 推演制御 エンジンのライフサイクル管理 ポート動的割当 · os/exec で起動 goroutine で終了監視・回収 エンジンコンソール(Go) TCP でスケジューラ接続 · コマンド中継 開始・停止・一時停止・再開の HTTP API レーダー信号サービス Tornado + SciPy · Docker チャープパルス · クラッタ · エコー L4 エンジンと保存 シミュレーションエンジン(外部) 推演 · 態勢をリアルタイム返送 保存とメッセージ MongoDB · MySQL · Redis · NSQ
リアルタイム監視ツール(PyQt5):赤・青のユニットと損害をタブ別に表示。オフライン保存した対局データを再生して描画

2023.07 – 2024.07(8ヶ月) · Python 開発 · エージェントとプラットフォームの連携

知能ゲーム対抗推演

無人化の空海対抗シナリオ(島嶼防衛 vs 空母打撃群の侵攻)におけるエージェント指揮決定プロジェクト。C++ のゲーム推演プラットフォームが裁定を担い、Python 側でプラットフォーム連携、赤・青双方のエージェント、対抗過程のリアルタイム監視を実装した。

  • ZeroMQ(REQ + DEALER)と Protobuf でプラットフォーム連携層を実装。推演制御、ユニット/任務/損害の照会、航路、発艦、編成など 38 本の API をラップし、Runner が固定ステップで「観測 → 判断 → 指令」を回して勝敗を採点
  • 赤軍の防御エージェントを開発:知覚 — 情報融合 — ミサイル/火砲/レーザーの火力配分 — 攻撃検証という段階的な意思決定。青軍の侵攻エージェントも開発:複数の行動案、無人機部隊の発進と飽和攻撃
  • 参加 16 エージェント(ルール/機械学習/深層学習)の配備・評価を担当。依存関係や実行上の問題を切り分け、代表的な戦略を分解して技術共有を実施
  • エージェントの態勢を MQTT で配信し、PyQt5 でリアルタイム監視ツールを開発。タブごとに赤・青のユニットと損害を表示し、ラウンド単位でのオフライン保存と振り返りに対応
  • Python
  • ZeroMQ
  • Protobuf
  • MQTT
  • PyQt5
  • NumPy

システム構成

連携層とエージェントの構成
L1 ゲーム推演基盤(C++) ゲーム推演プラットフォーム シミュレーション裁定 · 損害判定 L2 連携層(Python) ZeroMQ(REQ + DEALER) 要求/応答チャネル Protobuf 電文 推演データのシリアライズ 38 本のラップ API 推演制御 · ユニット/任務/損害照会 航路 · 発艦 · 編成 L3 推演メインループ Runner 固定ステップ:観測 → 判断 → 指令 勝敗の採点 ラウンドごとに集計 L4 エージェント 赤軍防御エージェント 知覚 → 情報融合 火力配分 → 攻撃検証 青軍侵攻エージェント 複数の行動案 無人機部隊 · 飽和攻撃 参加エージェントの評価 16 体を配備 · 依存関係の切り分け 代表的な戦略を分解 L5 監視 MQTT 配信 エージェントの態勢 PyQt5 リアルタイム監視 タブ:赤・青のユニットと損害 オフライン保存と振り返り ラウンドごとに保存

システムデータフロー

抽象的な図示・内部の詳細は含みません
  1. 想定編集

    Vue + Cesium・WebSocket 共同編集

  2. Gin メインサービス

    17 モジュール・約 100 API

    ▲ 担当範囲

  3. オペレータサービス

    想定 JSON → エンジン XML

    ▲ 担当範囲

  4. エンジンコンソール

    Go・TCP でコマンド中継

    ▲ 担当範囲

  5. シミュレーションエンジン

    推演・態勢返送

  6. 3D 表示

    態勢・録画再生

写真は同僚の同意を得ているか、他の方の顔をぼかしています

ここで学んだこと

シミュレーション・推演の製品ラインで、初めて Go でサーバーサイドを書きました。goroutine と WebSocket Hub による多人数共同編集、os/exec によるシミュレーションエンジンのプロセス管理、router / controller / service / model の階層で約 100 本の API を整理する方法を身につけました。

もう一つの柱は、Python による C++ 推演基盤との連携です。ZeroMQ + Protobuf の上でエージェントとリアルタイム監視を作り、参加 16 エージェントを配備・評価する中で、ルール・機械学習・深層学習の代表的な戦略を分解し、技術共有も行いました。

TECH STACK

  • Go
  • Gin
  • Python
  • Tornado
  • MongoDB
  • MySQL
  • Redis
  • NSQ
  • WebSocket
  • ZeroMQ
  • Protobuf
  • MQTT
  • PyQt5
  • Vue 2
  • Cesium
  • Docker