# Flocking

## 鸟群模型

This model is an attempt to mimic the Flocking of birds. (The resulting motion also resembles schools of fish.) The flocks that appear in this model are not created or led in any way by special leader birds. Rather, each bird is following exactly the same set of rules, from which flocks emerge.

This model is inspired by the Boids simulation invented by Craig Reynolds. The algorithm we use here is roughly similar to the original Boids algorithm, but it is not the same. The exact details of the algorithm tend not to matter very much -- as long as you have alignment, separation, and cohesion, you will usually get flocking behavior resembling that produced by Reynolds' original model. Information on Boids is available at Boids.

## 运行规则

The birds follow three rules: "alignment", "separation", and "cohesion".

"Alignment" means that a bird tends to turn so that it is moving in the same direction that nearby birds are moving.

"Separation" means that a bird will turn to avoid another bird which gets too close.

"Cohesion" means that a bird will move towards other nearby birds (unless another bird is too close).

When two birds are too close, the "separation" rule overrides the other two, which are deactivated until the minimum separation is achieved.

The three rules affect only the bird's heading. Each bird always moves forward at the same constant speed.

• 对齐”指的是鸟会倾向于转向，这样它的移动方向与附近的鸟的移动方向相同。
• “分离”指的是如果另外一只鸟靠的太近，鸟会转身避开。
• “靠近”意味着一只鸟会向附近的其他鸟移动(除非另一只鸟离得太近)。

## 算法的实现

### NetLogo使用教程

First, determine the number of birds you want in the simulation and set the POPULATION slider to that value. Press SETUP to create the birds, and press GO to have them start flying around.

The default settings for the sliders will produce reasonably good flocking behavior. However, you can play with them to get variations:

Three TURN-ANGLE sliders control the maximum angle a bird can turn as a result of each rule.

VISION is the distance that each bird can see 360 degrees around it.

• 首先，确定您想要在模拟中的鸟群数量，并将POPULATION滑块设置为该值。
• 按SETUP键创建，然后按GO键让它们开始飞行。
• 滑动块的默认设置可以产生效果不错的群集行为。
• 不过你可以调整来改变其运动:
• 三个转角滑块TURN-ANGLE控制鸟的最大转弯角度。
• VISION 视力是每只鸟能360度看到的距离。

#### THINGS TO NOTICE（注意事项）

Central to the model is the observation that flocks form without a leader.

There are no random numbers used in this model, except to position the birds initially. The fluid, lifelike behavior of the birds is produced entirely by deterministic rules.

Also, notice that each flock is dynamic. A flock, once together, is not guaranteed to keep all of its members. Why do you think this is?

After running the model for a while, all of the birds have approximately the same heading. Why?

Sometimes a bird breaks away from its flock. How does this happen? You may need to slow down the model or run it step by step in order to observe this phenomenon.

#### 代码实现

Netlogo Web - Flocking中有算法实现的接口，可调节参数观察程序运行结果。

```  1 turtles-own [
2   flockmates         ;; agentset of nearby turtles
3   nearest-neighbor   ;; closest one of our flockmates
4 ]
5
6 to setup
7   clear-all
8   create-turtles population
9     [ set color yellow - 2 + random 7  ;; random shades look nice
10       set size 1.5  ;; easier to see
11       setxy random-xcor random-ycor
12       set flockmates no-turtles ]
13   reset-ticks
14 end
15
16 to go
17   ask turtles [ flock ]
18   ;; the following line is used to make the turtles
19   ;; animate more smoothly.
20   repeat 5 [ ask turtles [ fd 0.2 ] display ]
21   ;; for greater efficiency, at the expense of smooth
22   ;; animation, substitute the following line instead:
23   ;;   ask turtles [ fd 1 ]
24   tick
25 end
26
27 to flock  ;; turtle procedure
28   find-flockmates
29   if any? flockmates
30     [ find-nearest-neighbor
31       ifelse distance nearest-neighbor < minimum-separation
32         [ separate ]
33         [ align
34           cohere ] ]
35 end
36
37 to find-flockmates  ;; turtle procedure
38   set flockmates other turtles in-radius vision
39 end
40
41 to find-nearest-neighbor ;; turtle procedure
42   set nearest-neighbor min-one-of flockmates [distance myself]
43 end
44
45 ;;; SEPARATE
46
47 to separate  ;; turtle procedure
48   turn-away ([heading] of nearest-neighbor) max-separate-turn
49 end
50
51 ;;; ALIGN
52
53 to align  ;; turtle procedure
54   turn-towards average-flockmate-heading max-align-turn
55 end
56
57 to-report average-flockmate-heading  ;; turtle procedure
58   ;; We can't just average the heading variables here.
59   ;; For example, the average of 1 and 359 should be 0,
60   ;; not 180.  So we have to use trigonometry.
61   let x-component sum [dx] of flockmates
62   let y-component sum [dy] of flockmates
63   ifelse x-component = 0 and y-component = 0
64     [ report heading ]
65     [ report atan x-component y-component ]
66 end
67
68 ;;; COHERE
69
70 to cohere  ;; turtle procedure
71   turn-towards average-heading-towards-flockmates max-cohere-turn
72 end
73
74 to-report average-heading-towards-flockmates  ;; turtle procedure
75   ;; "towards myself" gives us the heading from the other turtle
76   ;; to me, but we want the heading from me to the other turtle,
77   ;; so we add 180
78   let x-component mean [sin (towards myself + 180)] of flockmates
79   let y-component mean [cos (towards myself + 180)] of flockmates
80   ifelse x-component = 0 and y-component = 0
81     [ report heading ]
82     [ report atan x-component y-component ]
83 end
84
85 ;;; HELPER PROCEDURES
86
87 to turn-towards [new-heading max-turn]  ;; turtle procedure
89 end
90
91 to turn-away [new-heading max-turn]  ;; turtle procedure
93 end
94
95 ;; turn right by "turn" degrees (or left if "turn" is negative),
96 ;; but never turn more than "max-turn" degrees
97 to turn-at-most [turn max-turn]  ;; turtle procedure
98   ifelse abs turn > max-turn
99     [ ifelse turn > 0
100         [ rt max-turn ]
101         [ lt max-turn ] ]
102     [ rt turn ]
103 end
104
105
106 ; Copyright 1998 Uri Wilensky.
107 ; See Info tab for full copyright and license.
```

#### THINGS TO TRY（你可以试一试）

Play with the sliders to see if you can get tighter flocks, looser flocks, fewer flocks, more flocks, more or less splitting and joining of flocks, more or less rearranging of birds within flocks, etc.

You can turn off a rule entirely by setting that rule's angle slider to zero. Is one rule by itself enough to produce at least some flocking? What about two rules? What's missing from the resulting behavior when you leave out each rule?

Will running the model for a long time produce a static flock? Or will the birds never settle down to an unchanging formation? Remember, there are no random numbers used in this model.

#### EXTENDING THE MODEL（模型的延伸）

Currently the birds can "see" all around them. What happens if birds can only see in front of them? The `in-cone` primitive can be used for this.

Is there some way to get V-shaped flocks, like migrating geese?

What happens if you put walls around the edges of the world that the birds can't fly into?

Can you get the birds to fly around obstacles in the middle of the world?

What would happen if you gave the birds different velocities? For example, you could make birds that are not near other birds fly faster to catch up to the flock. Or, you could simulate the diminished air resistance that birds experience when flying together by making them fly faster when in a group.

Are there other interesting ways you can make the birds different from each other? There could be random variation in the population, or you could have distinct "species" of bird.

#### NETLOGO FEATURES（NetLogo默认设定）

Notice the need for the `subtract-headings` primitive and special procedure for averaging groups of headings. Just subtracting the numbers, or averaging the numbers, doesn't give you the results you'd expect, because of the discontinuity where headings wrap back to 0 once they reach 360.

《复杂》封面

• 多主体模拟

## Reference

• Wilensky, U. (1998). NetLogo Flocking model. http://ccl.northwestern.edu/netlogo/models/Flocking. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
• Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.