processing.jsで流れに従う自律エージェントを作る-プログラミングはYouTubeで学ぶ-
今回は簡単に人工知能(AI)っぽいものが作れてしまう自律エージェントというシステム作りました。
小さな自律式ロボがちょろちょろ動き回るのは見ていて可愛いものがあります。
自律エージェントのベースとなる考え方も、私たちの何気ない意思決定行動の原理と近いため難しくないです。
ぜひ、制作物と自律エージェントの概念だけでも見ていってください。
制作物ー流れを読む自律ロボー
英語ではFlowField Followingというプログラムです。日本語すると難しく聞こえてしまいますね。ロボたちを見ていると誰についていくわけでもないのに、帯のような流れができることが分かります。
重くなったら</>を押して再生を止めてください。
線を消してみると、より不思議に見えますよ!(スマホでは操作できません)
本当は流場も変更できたのですが、コードの共有サイトがその操作を扱えませんでしたorz
自律エージェントのポイント
自律エージェントの定義は次の3つです。
- ・限られた環境しか認識できないこと
- ・環境を調査し、自らのルールに基づき次の行動を決めること
- ・リーダーや全体のまとめ役がいないこと
具体的にタクシーに当てはめて考えると、次のようになるでしょう。
- ・運転手は自分の視界に入るものしか認識できない
- ・客をのせて目的地にいくときには、自分の経験に基づいて通るルートを決める
- ・配車オペレータがいない、カーナビを使わない
この3つのルールをプログラムに翻訳して、自律ロボをつくっていきます。
自律ロボのプログラムを読み解く
今回のプログラムの柱となるクラスが2つあります。
- FlowFieldクラス --- 場の流れを作る
- Vehicleクラス --- 自律ロボの設計図
その中でも、Vehicleクラスのfollow()が重要な部分です。
今の運動状態から、目指す場所に行きたいときにどんな力をくわえてやればよいか?ということがPVector.sub()のところで求めることができます。
void follow(FlowField flow){
//現在地の場の流れをlookup()で受け取り、そのベクトルがdesireになる
PVector desired = flow.lookup(location);
//各ロボには最高速度がランダムに設定されている。
desired.mult(maxspeed);
//必要なベクトル = 行きたい方向のベクトル - 今の速度ベクトル
PVector steer = PVector.sub(desired, velocity);
//各ロボにはくわえることができる力が決められている
steer.limit(maxforce);
applyForce(steer);
}
前述の自律エージェントに対応させると環境は場の流れ。ロボの認知は現在地の場の流れに限られており、次の行動決定も場の流れと、自分の最高速度、最高加速力の範囲で行います。リーダー存在しません。
自律エージェントの教材
チャンネル登録者数20万人を超えるチャンネル【The Coding Train】のThe Nature of Codeの第6章が今回の教材です。6.1章に自律エージェントの基礎、6.4章にflowfieldの説明が出てきます。見本となるコードはThe-Nature-of-Code-Examples/chp06_agents · GitHubにあります。
ひとことコメント
簡単なルールで複雑な動きをシミュレーションできるのが、自律エージェントの面白いところだと思います。次も、自律エージェントを使ってなにか作ろうと思います!
関連記事