LoginSignup
3
0

More than 3 years have passed since last update.

分散自律知性ネットワークを作ってみた

Last updated at Posted at 2019-12-14

これはSecHack365 修了生 Advent Calendar 2019の15日目の記事です。

TL;DR

:o:分散
:o:自律
:question:知性
:o:ネットワーク

動機

人間、脳が死んだら死ぬのやばくないですか?

公正的戦闘規範の第二内戦の「ライブラ」とか、ネタバレになっちゃうけどこれの敵とか、スタンド・アローン・コンプレックスみたいな、各ノードが分散して自律的に思考した結果全体として知性を持つように見えるやつ、かっこよくないですか?

植物みたいに各細胞が各々の役割を果たせば生きられる、コアのないネットワークこそ至高。
つまり、分散知性ネットワークの代表例である植物が知性を持っているように、コアが無くても各ノードがそれぞれ演算をすればそのネットワークは知性を持つはずで、それをコンピュータ上に再現出来たらかっこよくないですか?

人間

最初に人間をdisってしまったけど、人間(動物)も脳の中は分散ネットワークになっていて(ref: 意識はいつ生まれるのか)、その結果複雑性が生まれて人間には知性(意識?)があるともいえるらしい。
でも人間の体は脳だけじゃ働かないので、その点マクロに見ると分散していないコア有システムだと思ふ。

実装

分散を再現するには並列で思考するノードがあれば良さそう[要出典]。並列と言えば…Go言語かな[要出典]。
ソースはこちら→https://github.com/sudnonk/collective_intelligence

ノードの持つ情報と、思考体系は下図の通りで、だいぶシンプルかつ各ノードで完結しています。

ノードとパスが持つ情報

cell_info.png

ノードの思考フロー

cell_flow.png

パスの思考フロー

  1. 道幅を超えた容量の資源が入ってきたら、広げて欲しさを増やす
  2. 広げてもらえたら、広げて欲しさをリセットする

あとは

  • すでにノードがある場所にノードは置けないWorld.canPut()
  • ノード同士はある程度離れていけないといけないconfig.MinDist
  • 新しいノードの場所はパスの間隔が開いているところPaths.GetWidest()
  • 新しいノードは生成元ノードの性格から±10%の範囲で変動した性格になるPersona.calcMutation()

とかの処理を書きましたが、端折ります。
場所はXY座標で保存し、ノードの場所の管理は世界のサイズ分の行列をgonum/matで用意してそこにフラグを立てることで実現しました。

あとは、nステップの間各ノードの思考関数をgoroutineで並列に実行すればやりたかったことができます。

可視化

時間ごとに円グラフが動く図を作れたらエモいなと思ったのでそうしました。
最初はgithub.com/ajstarks/svgoを使ってGo言語側で可視化処理をしていたのですが、マウスオーバーで各ノードの状態が見れた方がエモくない?って思ったのでJSONに吐き出してブラウザでJavaScriptで見られるようにすることにしました。

結果

というわけで、ブラウザ上でインタラクティブにブラウズできるようにしたので皆さんも見てください。
https://sudnonk.net/ci/

GIFアニメにしてみたのがこれです。(![]()を使うとnot foundになる…?のでimgurへのリンクです。)
ちゃんと自律的にノードを増殖させていることがわかります。
gif @ imgur

結果2

でもなんか成長しきっちゃうと動きがなくてつまらないですね。適当にランダムでダメージを与えてみることにしました。
具体的には、ランダムに選んだ点から±5ぐらいの範囲にあるノードに最大体力の半分のダメージを与えます。

こちらもブラウザで見られます
https://sudnonk.net/ci2/

GIFアニメにしたのがこれです。黄色い範囲のノードにダメージが入ります。(GIFアニメの容量が大きいのでWifi環境推奨)
gif @ imgur

ちゃんとダメージが入ったノードに資源が移動したり、新しいノードが作られたりしていて見ていて面白くなりました。
爆撃で空いた空間に周りのノードが一気に新しいノードを作っているので、一部密度がヤバいことになってますね。あるステップで生成されたノードの情報は次のステップにならないと共有されないので、ノード間の距離制約が機能してないっぽい。

今後

  • 近くにノードがあればそことの間に道を作る関数を書いたのですが、動いてないっぽいので修正したい。
  • 道を作るコストを定数じゃなくて長さと比例させたい。
  • 爆撃の代わりに陣営を2つ作って、近くの対立陣営を攻撃する、みたいな動きも格好良さそうなので実装したい。
  • 意識と知性は何が違うんだろう…

結論

自分たちで勝手に動いてネットワーク形成してるの、かっこいい~~

でも知性ではないような気がする…どうやったら知性を持たせられるんだろう(神の領域)
遺伝的アルゴリズムとか強化学習とかでノードの思考フローも勝手に成長するようになれば知性があるのでしょうか。そこまでしなくても、最初にも紹介した意識はいつ生まれるのか によると、意識があると複雑性が十分に大きいそうです(逆が成り立つとは言っていない)。もし逆が成り立って、とても複雑なネットワークを作ったとして、もしそこに意識が生じたら、それは外部から観測できるのでしょうか。
あなたは私に知性があると思いますか?私はあなたの知性を確認できますか?

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0