更改

跳到导航 跳到搜索
添加3,157字节 、 2022年4月15日 (五) 18:05
第76行: 第76行:  
有时鸟儿会从鸟群中飞走。这是怎么发生的?为了观察这种现象,您可能需要放慢模型的速度或一步一步地运行它。
 
有时鸟儿会从鸟群中飞走。这是怎么发生的?为了观察这种现象,您可能需要放慢模型的速度或一步一步地运行它。
    +
== 代码实现 ==
 +
[http://www.netlogoweb.org/launch#http://ccl.northwestern.edu/netlogo/models/models/Sample%20Models/Biology/Flocking.nlogo Netlogo Web - Flocking]<syntaxhighlight line="1">
 +
turtles-own [
 +
  flockmates        ;; agentset of nearby turtles
 +
  nearest-neighbor  ;; closest one of our flockmates
 +
]
 +
 +
to setup
 +
  clear-all
 +
  create-turtles population
 +
    [ set color yellow - 2 + random 7  ;; random shades look nice
 +
      set size 1.5  ;; easier to see
 +
      setxy random-xcor random-ycor
 +
      set flockmates no-turtles ]
 +
  reset-ticks
 +
end
 +
 +
to go
 +
  ask turtles [ flock ]
 +
  ;; the following line is used to make the turtles
 +
  ;; animate more smoothly.
 +
  repeat 5 [ ask turtles [ fd 0.2 ] display ]
 +
  ;; for greater efficiency, at the expense of smooth
 +
  ;; animation, substitute the following line instead:
 +
  ;;  ask turtles [ fd 1 ]
 +
  tick
 +
end
 +
 +
to flock  ;; turtle procedure
 +
  find-flockmates
 +
  if any? flockmates
 +
    [ find-nearest-neighbor
 +
      ifelse distance nearest-neighbor < minimum-separation
 +
        [ separate ]
 +
        [ align
 +
          cohere ] ]
 +
end
 +
 +
to find-flockmates  ;; turtle procedure
 +
  set flockmates other turtles in-radius vision
 +
end
 +
 +
to find-nearest-neighbor ;; turtle procedure
 +
  set nearest-neighbor min-one-of flockmates [distance myself]
 +
end
 +
 +
;;; SEPARATE
 +
 +
to separate  ;; turtle procedure
 +
  turn-away ([heading] of nearest-neighbor) max-separate-turn
 +
end
 +
 +
;;; ALIGN
 +
 +
to align  ;; turtle procedure
 +
  turn-towards average-flockmate-heading max-align-turn
 +
end
 +
 +
to-report average-flockmate-heading  ;; turtle procedure
 +
  ;; We can't just average the heading variables here.
 +
  ;; For example, the average of 1 and 359 should be 0,
 +
  ;; not 180.  So we have to use trigonometry.
 +
  let x-component sum [dx] of flockmates
 +
  let y-component sum [dy] of flockmates
 +
  ifelse x-component = 0 and y-component = 0
 +
    [ report heading ]
 +
    [ report atan x-component y-component ]
 +
end
 +
 +
;;; COHERE
 +
 +
to cohere  ;; turtle procedure
 +
  turn-towards average-heading-towards-flockmates max-cohere-turn
 +
end
 +
 +
to-report average-heading-towards-flockmates  ;; turtle procedure
 +
  ;; "towards myself" gives us the heading from the other turtle
 +
  ;; to me, but we want the heading from me to the other turtle,
 +
  ;; so we add 180
 +
  let x-component mean [sin (towards myself + 180)] of flockmates
 +
  let y-component mean [cos (towards myself + 180)] of flockmates
 +
  ifelse x-component = 0 and y-component = 0
 +
    [ report heading ]
 +
    [ report atan x-component y-component ]
 +
end
 +
 +
;;; HELPER PROCEDURES
 +
 +
to turn-towards [new-heading max-turn]  ;; turtle procedure
 +
  turn-at-most (subtract-headings new-heading heading) max-turn
 +
end
 +
 +
to turn-away [new-heading max-turn]  ;; turtle procedure
 +
  turn-at-most (subtract-headings heading new-heading) max-turn
 +
end
 +
 +
;; turn right by "turn" degrees (or left if "turn" is negative),
 +
;; but never turn more than "max-turn" degrees
 +
to turn-at-most [turn max-turn]  ;; turtle procedure
 +
  ifelse abs turn > max-turn
 +
    [ ifelse turn > 0
 +
        [ rt max-turn ]
 +
        [ lt max-turn ] ]
 +
    [ rt turn ]
 +
end
 +
 +
 +
; Copyright 1998 Uri Wilensky.
 +
; See Info tab for full copyright and license.
 +
</syntaxhighlight>
    
== THINGS TO TRY(你可以试一试) ==
 
== THINGS TO TRY(你可以试一试) ==
567

个编辑

导航菜单