NetLogo – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 L-system ../../../20180904886/ Tue, 04 Sep 2018 09:30:41 +0000 ../../../?p=886 「形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズムである。自然物の他にも、反復関数系(Iterated Function System; IFS)のようないわゆる自己相似図形やフラクタル図形を生成する場合にも用いられる。L-System は1968年、ハンガリーユトレヒト大学の理論生物学者にして植物学者であったアリステッド・リンデンマイヤー(Aristid Lindenmayer)により提唱され、発展した。」
https://ja.wikipedia.org/wiki/L-system
説明が難しいのでウィキペデアをそのまま引用させていただきました。

NetLogoの実装がとてもわかりやすかったので、以下サイトのコードを使わせてもらいました。

globals [string rules stack]

to setup
  clear-all
  reset-ticks

  ; 初期文字列(axiom)で初期化
  set string initial-string

  ; 書き換えルール
  ; 空のルールは無視する
  set rules []
  if not empty? rule1 [ set rules lput rule1 rules ]

  ; スタックを初期化
  set stack (list)

  create-turtles 1 [
    hide-turtle
    set color sky
    init
    draw
  ]
end

to step
  set string rewrite string
  clear-output
  output-print string
  clear-drawing
  ask turtles [
    init
    draw
  ]
  tick
end

to init
  ; エージェントのコンテキスト
  pen-up
  set heading 0
  set xcor initial-x
  set ycor initial-y
end

to-report rewrite [old-string]
  let new-string ""
  repeat length old-string [
    ; old-stringの先頭から1文字ずつルールを適用する
    set new-string word new-string apply-rule first old-string
    set old-string but-first old-string
  ]
  report new-string
end

; 1文字に対してルールを適用する
; 適用できるルールがない場合は定数なのでそのまま返す
to-report apply-rule [ch]
  let str ch
  foreach rules [ ?1 ->
    let rule ?1
    let left-side first rule
    if ch = left-side [
      set str get-right-side rule
    ]
  ]
  report str
end

; A -> Bのフォーマットを仮定
; ->の両側に空白が入る
to-report get-right-side [rule]
  let p position "->" rule
  report substring rule (p + 3) length rule
end

; stringに従って描画
; エージェントコンテキスト
to draw
  let local-string string
  repeat length local-string [
    let action first local-string
    set local-string but-first local-string
    ; 線を描画しながら移動
    if action = "F" [
      pen-down
      forward 0.5
    ]
    ; 左折
    if action = "+" [
      left 90
    ]
    ; 右折
    if action = "-" [
      right 90
    ]
  ]
end

これを試してみようと思ったきっかけは、フラクタル図形というものがタートルグラフのコマンド(文字)の置き換えで実現できる点が、とても興味深かったからです。(他にも応用がききそうです)
オリジナルコードは角度を変更したりルールが二つありましたが、それがなくても十分複雑図形を得られるので、初期文字列の変更もなしで、まずは慣れるためにいろいろと触ってみました。

これだけシンプルなルールでも、このようなバリエーションが得られます。
ルールを増やしていけば、いろいろな発見ができそうです。

]]>
NetLogo ../../../20170402697/ Sun, 02 Apr 2017 07:36:49 +0000 ../../../?p=697 LOGO言語は約50年前の教育用プログラム言語ですが、これが発展したNetLogoがシミュレーション等でよく使われているようです。最近、教育用プログラミング環境について調査をしている過程で知りました。
つい最近もアップデートされているようで、モデルライブラリが豊富で、かなり実用的と感じました。ちょっとはまりそうです。
ユーザマニュアルにあるチュートリアルを参考に、内容を理解するために、できるだけシンプルにして動かしてみました。

初期状態(setup後)

実行後

setupとgoはボタンイベントで起動します。(toはプロシージャ)

turtles-own [energy]

to setup
  clear-all
  setup-patches
  setup-turtles
  reset-ticks
end

to setup-patches
  ask patches [ set pcolor green ]
end

to setup-turtles
  create-turtles 10
  ask turtles [ setxy random-xcor random-ycor ]
end

to go
  if ticks >= 140 [ stop ]
  move-turtles
  eat-grass
  reproduce
  check-death
  regrow-grass
  tick
  go
end

to move-turtles
  ask turtles [
    right random 360
    forward 1
    set energy energy - 1
  ]
end

to eat-grass
  ask turtles [
    if pcolor = green [
      set pcolor black
      set energy energy + 8
    ]
  ]
end

to reproduce
  ask turtles [
    if energy > 50 [
      set energy energy - 50
      hatch 1 [ set energy 50 ]
    ]
  ]
end

to check-death
  ask turtles [
    if energy <= 0 [ die ]
  ]
end

to regrow-grass
  ask patches [
    if random 100 < 3 [ set pcolor green ]
  ]
end

タートルが草を食べて増殖していく様子をシミュレーションしています。
草は食べられればなくなりますが、また生えてきます。
タートルは草を食べれば、エネルギーが増えますが、移動することでエネルギーを消費します。
エネルギーがなくなれば死にます。

どれが予約語でどれが定義なのかわかりにくいですが、言葉の意味を追っていけば理解できます。
ギリシャ語のLogos(言葉)を由来にしており、他の言語が数値を処理することに対して言葉を処理することを強調している(ウィキペデアより)からでしょうか。

重要なキーワードを以下に挙げておきます。
hatch: 生成
die: 死
energy: エネルギー
turtle: タートル(移動する実体。よく使われますね)
patch: ここでは草を表現(緑で生成、黒で食べられた後を意味する:pcolor)
ask: 処理対象を表現(for-eachっぽい)
tick: 処理単位(1tick進む)

結果は、タートルの増殖が草がなくなってくると抑制されていることがよくわかります。

最近、プログラミング教育について掘り下げて考えていくと、昔のコンピュータ言語、コンピュータサイエンスの勉強に行き着くことがよくあります。(LISP, BASICなど。また今はやりのDeepLearningもそうです。)
NetLogoもまさにこれです。最新テクノロジーだけでなく、膨大な過去の資産からももっと学びたいと思っています。

参考: https://ccl.northwestern.edu/netlogo/index.shtml

]]>