boid
Last-modified: 2019-01-27 (日) 01:45:37 (1518d)
boid = birdid = 鳥もどき ( 1987年-グレイグ・レイノルズ )のサンプルプロジェクト。 目次 プロジェクト概要 †このプロジェクトは「人工生命」や「複雑系」の分野では有名な「boid(ボイド)」と 呼ばれるシミュレーション・プログラムです。 このシミュレーションは飛行する鳥が群をなして行動する、という現象が、 個々の鳥たちがある単純な規則に則って行動していれば自然に起こるとい う事を示している様に見えます。 この「規則」は次の3つです。
もしそれが本当にそうだとすれば、その鳥たちの中に「リーダ」がいるはずだという、 一般的な通念を覆すものです。 この様なことは、一般的には「自己組織化(self-organization)」や、 創発(emergence)という概念で捕らえることができます。 このStarLogoサンプル・プロジェクトはその様なboidをパッチ上を飛び回るタートル で表現しています。 ユーザインターフェース †3つのボタンが用意されています。各ボタンの意味は次の通り。
プログラムの実行ボタンがforeverでない事に注意。 実行 †スライダでboidの数を適当に決め、setupボタンを押すと、 指定した数だけのboidがパッチに配置されます。 次に、startボタンを押すと、シミュレーションが始まります。 規則にしたがって鳥が羽ばたきながら、だんだん集団を形成して 行くところが観察できると思います。 スタート時 †一定時間経過後 †変数 †turtles-own †
patches-own †
手続き †このプロジェクト内の手続きは次の様なものです。
オブザーバ手続き †setup †ここでは、パッチ、タートル(boids)全体の初期化を行います。 to setup ca ask-patches [ setair random 10 ;; パッチに0~10の間の乱数を割り振る ] repeat 5 [ diffuse air 0.9 ;; 上で設定した値を「拡散」させる ] ask-patches [ scale-pc blue air 0 20 ;; 上で拡散した値の分布に対して白~青の色を割り当てる ] create-and-do numbirds [ ;; numbirdsの数だけタートル(boid)を生成 setshape bird1-shape ;;生成しがてら・・カモメの様な図形を割り当てる setc white ;; 色は白 setxy ;; パッチの範囲にこのboidを乱数で位置づける random screen-width random screen-height setflap random 100 ;; 各boidsのflap変数に100以内の乱数を割り当てる ] end タートル手続き †bird-flap †この手続きは、シミュレーションの本質的な部分というよりは、いかにも鳥が 羽ばたいて飛んでいる様な雰囲気を出すためのものです。2つのイメージを 交互に割り当てて、羽ばたきを表現しています。 タートル変数のflapを一ステップごとに1増やし、50の時と100の時に絵を切り替え ています。 to bird-flap if flap = 50 [ setshape bird1-shape ;; 羽ばたき「羽をあげている図」をセット ] if flap = 100 [ setshape bird2-shape ;; 羽ばたき「羽を振り下ろしている図」をセット ] setflap flap + 1 if flap > 100 [ setflap 0 ] end move †boidが実際に飛行するための手続きです。 to move wait 0.01 let [ :findclosest who-min-of-turtles [distance xcor-of myself ycor-of myself] ] setclosest first :findclosest ;;自分に一番近いboid setclosest-dist last :findclosest ;;自分に一番近いboidまでの距離 ifelse closest-dist < 3 [ ;; (規則①) turn (180 + towards xcor-of closest ycor-of closest ) 5 ] [ ifelse closest-dist > 5 [ ;; (規則②) turn ( towards xcor-of closest ycor-of closest ) 5 ] [ ;;(規則③) turn (heading-of closest) 5 ] ] fd 0.3 ;; 方向制限+歩幅増減型ランダムウォーク rt 1.0 * (-1 + random 3) end turn †boidの方向を決めるための手続きです。 to turn :other-heading :degrees ifelse ((:other-heading >= heading) and ((:other-heading - heading) <= :degrees)) or ((:other-heading <= heading) and ((heading - :other-heading) <= :degrees)) [ seth :other-heading ] [ ifelse ((:other-heading - heading) mod 360) < 180 [ rt :degrees ] [ lt :degrees ] ] end まとめ・補足 †まだ、ちょっと途中です・・ |