フィラデルフィア・エミュレータ脱線その一

応援団2が一通り落ち着いてきた(合計一億二千万点ぐらい)ので、またフィラデルフィアエミュレータの続きを作る事にした。
前回作ったバージョンはそれはそれとして置いておいて、以下の改善を行う予定。

  1. 攻撃対象選択アルゴリズムの洗練。
    • 選択肢(誰を攻撃するか)は、ポイント制にする。
    • その選択を行った後は、ずっと最適手を選択したとして、その結果、自チームが勝った場合は、自チームのHPの合計を取得ポイントとする。
    • 逆に自チームが負けた場合は、相手チームのHPの合計値をマイナスにしたものを取得ポイントとする。
    • これを全ての選択肢に対して適用し、最もポイントが高い選択肢を選ぶ、という方針にする。
    • また、この、各選択肢に対するポイントは、状況も含めて、memoizeを行うようにする(dbmに)。
      • これに伴い、戦闘状況自体のオブジェクト化(内部に戦闘中の2チームを含んでいる)と、そのシリアライズ手段も提供するようにするとベター。しかしそこまでするかは未定。
  2. 戦闘の実況をstdoutに出力する。
  3. ambをもう少し洗練させたい(が、可能かどうかちょっと微妙)。


で、このルールで実装を行っていて思ったのは、「実世界では、行動選択の主体はチームではなく、各個人である」という事。
例えば、敵も味方も全員武力が10であり、味方は五人、敵は四人だったとする。
普通に考えれば負ける事は無いが、こっちの五人全員が敵の一人を集中攻撃し、敵は分散攻撃した場合には、負けてしまう可能性がある。
攻撃対象選択アルゴリズム(または知性と言っても意味は通る)の主体がチームの場合は、まず、そういう選択(集中攻撃)は決定されない。
しかし、攻撃対象選択アルゴリズムの主体が各個人だった場合、他の仲間が誰を攻撃するか分からない為、たまたま集中攻撃になってしまう可能性がある。
これを防ぐには、二通りの方法があるように思える。

  1. 行動前に全員で相談して、攻撃相手がかぶらないようにする。つまり、攻撃対象選択アルゴリズムの主体を各個人からチーム全体へと移す。
  2. 自チームのメンバー及び敵チームのメンバーに数値(例えば並び順)を振っておき、攻撃対象がかぶる可能性がある場合、「番号が一番若いメンバーは、番号が一番若い敵メンバーを攻撃する」「二番目は、同様に二番目の敵を攻撃する」等のように、規約によって、攻撃相手がかぶらないようにする。

一番目の方法は個人主体でなくなるので、基本的には特に問題はない(現実問題として、例えば銃撃戦等で、そういう相談する時間があるのかといった問題はあるが)。
二番目の方法は、あらゆるパターンに対応する為には規約が膨大になってしまう可能性もあるが(例えば、敵がタフで、敵一人に対して二人ずつ攻撃した方が効率の良い場合、等々)、基本的にはそれなりに機能すると思われる。
で、二番目の方法は、極めていくとプログラムと同等の状態になってしまうように思える。
そして、そのルールは、事前(戦闘開始前)にメンバー全員と相談して、「こういう規約で行く」という事を全員に徹底しておく必要があり、その点で結局、一番目の方法の「攻撃対象選択アルゴリズムの主体をチーム全体(で決めたプログラム)に移す」という部分に似ている。


で、要するに、「知性の結合」のような事が起こっている訳で、何らかの真面目なシミュレータを書こうと思った場合、これを実現できるような構造が必要になるのでは?
と、思った。
まあ、(非戦闘員の見えない)ボスとかブレインとかが別に居て、その人がチーム全体を指揮しているというモデルでもいいとは思うし、実際、ゲームも現実も、そういうモデルで動いている事が多いようにも思える。


今回の結論は特に無し。