標高+1m

An access point for the Internet of Lives

場を使った相対論的オブジェクト間コミュニケーション

アクターやオブジェクトにおいて採用されているメッセージング機構(つまり宛先アドレスを持ったメッセージ)は、自然界のシミュレーションやIoTデバイス間コミュニケーションに適さないのではないか、という仮説のもと、メッセージングに依らないオブジェクト間コミュニケーションについて考えています。ここまでの経緯は、以下2つの記事を参照してください。

VOC (Vision Oriented Communication)の中心にあるコミュニケーション機構は、以下の2点に集約できる。

  • 情報は自身を中心に波状に拡散する
  • だれでも視野の中にある情報は読める

f:id:ympbyc:20151113195651p:plain

前回は、場(場 - Wikipedia)を使った機構を紹介し、同時にこの方法のパフォーマンス上の問題点について示唆した。現状の問題点は以下の3点。

  • 全てのオブジェクトが絶対座標を持っていてかっこ悪い。
  • 場を愚直にグリッドとして実装すると、大量の無駄な計算が生じる。
  • 情報が1フレームで場全体に拡散されるのは、光速を超えた情報伝達であり、相対論に違反している。

今回はこの3点を解決する実装を紹介する。

座標を廃止し、各オブジェクト間の距離を表明するグラフを導入する。

(make-graph
  (list sun cat1 100)
  (list sun cat2 200)
  (list cat1 cat2 150))

'(オブジェクト オブジェクト 距離) でエッジを作っていって、逆引きできるデータ構造を組み立てておく。

2点の絶対座標の差から距離を出すのはコストがかかる上に、絶対座標を持つモノのネットワークは回転について余分な情報を持っている。グラフを使った地図表現に変更することで、計算コストと、不要な情報を削減できた。

真空(オブジェクトがないところ)では場は値をもたないものとし、オブジェクトの周りの小さな領域だけ計算する。

オブジェクトとオブジェクトのコミュニケーションのために、巨大なグリッド(マトリクス)を計算するのは効果対計算コストが高すぎる。物理シミュレーションをしているわけではないので、伝播方法の詳細は無視する。後述の参考実装では、field−value(場の値)として各オブジェクトにスロットを持たせ、物理が情報をそこに書き込むようになっている。

距離と伝播速度から遅れを計算し、正しい順序で情報を伝播させる。

;;例 - 光速の1/3の速度の犬の鳴き声:
`(sound "bow-wow" ,inverse-square ,(/ 1 3))
;;-> 1m以内にネズミ、3m以内にネコがいた場合
`((,cat  :sound "bow-wow" 9)
  (,mice :sound "bow-wow" 3))
;;猫には9フレーム後、ネズミには3フレーム後に鳴き声が届く.

オブジェクトが場を振動させると、前述のグラフから近くのオブジェクトをそれぞれ取り出し、しかるべき時間の遅れののちにターゲットオブジェクトが監視しているローカルな場に、波の減衰曲線を距離に適用して得た値を書き込む。

[場の振動命令]は、減衰曲線(典型的な例は距離の逆2乗)と、光速(=1)に対する比率の形の伝播速度を付与されている。

参考実装

静止系のVOCネットワークを実装してみた。プロトタイピングでリストを乱用していて読みづらいのが恐縮ですが、コンセプトは大体表現できたと思う。

場を使った相対論的オブジェクト間コミュニケーション · GitHub

前回の記事と同じく、一つの太陽と2匹のネコの静止系で実験してみる。

f:id:ympbyc:20151113211141p:plain

(define (main . args)
  (let ([cat1 (make <cat> :fields '(sound temperature)
                    :body-temperature 34)]
        [cat2 (make <cat> :fields '(sound temperature)
                    :body-temperature 34)]
        [sun  (make <sun> :fields '(temperature electromagnetic)
                    :temperature 1000000)])
    (run-space (list cat1 cat2 sun)
               (make-graph
                (list sun cat1 100)
                (list sun cat2 200)
                (list cat1 cat2 150))
               800)))

結果:

f:id:ympbyc:20151114134200p:plain

時刻100: まず、太陽からの電磁ノイズがピンクの猫に到達する。ここでは光速を1として計算しているため、距離がすなわち時間の遅れとなる。同時刻に1000000℃あった太陽熱が、距離の逆2乗(100℃)まで下がってピンクの猫に到達し、猫は "too hot meow!" と鳴く。

時刻200: 100フレーム後には、太陽からの電磁ノイズと熱が緑の猫に伝わる。熱は減衰して25℃になっていて、気持ちよいポカポカ陽気なので、猫は "nice and warm meow!" と鳴く。

時刻400: 時刻100に発信され、光速の1/3で伝わる音波"too hot meow!"は、300フレーム後に太陽に到達し、太陽の周りの音場を揺らす。ここでは音については厳密に減衰を考慮していない。

時刻550: ピンクの猫が発した鳴き声が緑の猫の耳に届く。

時刻650: 緑の猫の鳴き声がピンクの猫の耳に届く。

まとめ

場を使ったオブジェクト間コミュニケーションというややこしそうな仕組みの割に、簡単に宣言的にオブジェクトを記述できるフレームワークを作れそうだ。