[StarLogo/fujim2]
[ トップ ]   [ 差分 | バックアップ | リロード ]   [ 一覧 | 単語検索 | 最終更新 | ヘルプ ]

CONTENTS

  • FrontPage
  • StarLogoについて
  • こんな人におすすめ
  • StarLogoのインストール
  • StarLogoの簡単な入門
  • StarLogo TIPS
  • StarLogoのサンプル解説
  • StarLogo関連リンク集
  • OpenStarLogo
  • StarLogoTNG
  • StarLogoNova
  • 実験・研究
  • Petit-Hack
  • 文献
  • ご意見ご感想など
  • このページについて

最新の10件
2019-12-28
  • タートルグラフィックス
2019-01-27
  • FrontPage
  • StarLogo日本語化
  • Petit-Hack
  • このページについて
  • コメント/ご意見ご感想など
  • ご意見ご感想など
  • 文献
  • 実験・研究
  • こんな人におすすめ

boid

Last-modified: 2019-01-27 (日) 01:45:37 (1518d)

StarLogoのサンプル解説

StarLogo-Sample-Boid-TitlePicture.PNG

boid = birdid = 鳥もどき ( 1987年-グレイグ・レイノルズ )のサンプルプロジェクト。


目次

  • プロジェクト概要
  • ユーザインターフェース
  • 実行
    • スタート時
    • 一定時間経過後
  • 変数
    • turtles-own
    • patches-own
  • 手続き
  • オブザーバ手続き
    • setup
  • タートル手続き
    • bird-flap
    • move
    • turn
  • まとめ・補足

プロジェクト概要 †

このプロジェクトは「人工生命」や「複雑系」の分野では有名な「boid(ボイド)」と 呼ばれるシミュレーション・プログラムです。

このシミュレーションは飛行する鳥が群をなして行動する、という現象が、 個々の鳥たちがある単純な規則に則って行動していれば自然に起こるとい う事を示している様に見えます。

この「規則」は次の3つです。

  • (規則①)自分以外の鳥に衝突する寸前に、方向転換する(ぶつからない様にする)
  • (規則②)他の鳥から比較的距離がある場合、最も近い鳥に向かって飛行する
  • (規則③)他の鳥に比較的近ければ、それらと同じ方向に向かって飛行する

もしそれが本当にそうだとすれば、その鳥たちの中に「リーダ」がいるはずだという、 一般的な通念を覆すものです。

この様なことは、一般的には「自己組織化(self-organization)」や、 創発(emergence)という概念で捕らえることができます。

このStarLogoサンプル・プロジェクトはその様なboidをパッチ上を飛び回るタートル で表現しています。

↑

ユーザインターフェース †

3つのボタンが用意されています。各ボタンの意味は次の通り。

setupボタンパッチの初期化とboidの初期位置の設定
startボタンシミュレーション実行
startボタンシミュレーション停止
numboidsスライダboidの数指定
StarLogo-Sample-Boid-GUI.PNG

プログラムの実行ボタンがforeverでない事に注意。

↑

実行 †

スライダでboidの数を適当に決め、setupボタンを押すと、 指定した数だけのboidがパッチに配置されます。 次に、startボタンを押すと、シミュレーションが始まります。

規則にしたがって鳥が羽ばたきながら、だんだん集団を形成して 行くところが観察できると思います。

↑

スタート時 †

StarLogo-Sample-Boid-Init.PNG
↑

一定時間経過後 †

StarLogo-Sample-Boid-Init.PNG
↑

変数 †

↑

turtles-own †

変数名意味
closest近いタートルを保存
closest-dist近いタートルまでの距離を保存
flap羽ばたきのためのカウンタ
↑

patches-own †

変数名意味
airパッチの色
↑

手続き †

このプロジェクト内の手続きは次の様なものです。

手続き名説明パッチ/オブザーバ
setup全体の初期設定オブザーバ
bird-flapboidの「羽ばたき」を表現タートル
moveboidの飛行タートル
turnboidの方向転換タートル
↑

オブザーバ手続き †

↑

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
↑

まとめ・補足 †

まだ、ちょっと途中です・・



Link: StarLogoのサンプル解説(1518d)

添付ファイル: fileStarLogo-Sample-Boid-after.PNG 644件 [詳細] fileStarLogo-Sample-Boid-TitlePicture.PNG 1481件 [詳細] fileStarLogo-Sample-Boid-Init.PNG 1191件 [詳細] fileStarLogo-Sample-Boid-GUI.PNG 1125件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-27 (日) 01:45:37 (1518d)
Link: StarLogoのサンプル解説(1518d)
Site admin: anonymous

PukiWiki 1.5.0 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji. Powered by PHP 5.6.40. HTML convert time: 0.020 sec.