Question

I am making a program to simulate a flock of birds in python by means of boids. One of the tasks is to count the neighboring boids (distance <= 50). I tried to do it like this (see code) but I don't get good results. The 'print distance' gives 20x the same distance, so I assume that I am counting the same couple of boids 20x. I need all combinations though. I'm pretty new to programming, so every help is welcome!

WIDTH = 1000            # WIDTH OF SCREEN IN PIXELS
HEIGHT = 500            # HEIGHT OF SCREEN IN PIXELS
BOIDS = 20              # NUMBER OF BOIDS IN SIMULATION
SPEED_LIMIT = 500       # FOR BOID VELOCITY
BOID_EYESIGHT = 50      # HOW FAR A BOID CAN LOOK
WALL = 50               # FROM SIDE IN PIXELS
WALL_FORCE = 100        # ACCELERATION PER MOVE


################################################################################

import random
from math import sqrt

X = 0
Y = 1
VX = 2
VY = 3

boids = []

for i in range(BOIDS):
    b_pos_x = random.uniform(0,WIDTH)
    b_pos_y = random.uniform(0,HEIGHT)
    b_vel_x = random.uniform(-100,100)
    b_vel_y = random.uniform(-100,100)
    b = [b_pos_x, b_pos_y, b_vel_x, b_vel_y]

    boids.append(b)

# definition of functions:

def calculate_distance(a,b):                       # calculates distance between two boids
    distance = sqrt((a[X] - b[X])**2 + (a[Y] - b[Y])**2)
    return distance

def value_velocity(v):                             # calculates velocity of boids
    velocity = sqrt(v[VX]**2+v[VY]**2)
    return velocity

##############

for element_1 in range(len(boids)):             
    for element_2 in range(len(boids)):
        if element_1 != element_2:                    # for two different boids:
            distance = calculate_distance(boids[element_1],boids[element_2]) 
                 # calculate distance between boids

    velocity = value_velocity(boids[element_1])             # calculate velocity of boids

neighbors = 0                      # start neighbor counter

for element_1 in range(len(boids)):
    for element_2 in range(len(boids)):
        if element_1 != element_2:          # for diferent boids
            if distance <= 50:              # with a distance of <=50
                neighbors += 1              # add +1 to neighbor counter
    print distance

No correct solution

OTHER TIPS

You should either make distance into array or merge two loops. Because currently you always use the last value of distance calculated in the first pair of for loops.

So you code can be modified for example in the following way:

distance=[[calculate_distance(boids[i],boids[j]) for j in range(len(boids))] for i in range(len(boids))]

for element_1 in range(len(boids)):
    for element_2 in range(len(boids)):
        if element_1 != element_2:          # for diferent boids
            if distance[element_1][element_2] <= 50:              # with a distance of <=50
                neighbors += 1
                print distance[element_1][element_2]

You can as well just do all the neighbor calculations in the first loop:

neighbors =0
for element_1 in range(len(boids)):             
    for element_2 in range(len(boids)):
        if element_1 != element_2:                    # for two different boids:
            distance = calculate_distance(boids[element_1],boids[element_2]) 
            if distance <=50:
               neighbors += 1
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top