рассчитать расстояние между двумя точками, если <1: добавить в списки координаты x и y (программа заполнения) Python - PullRequest
0 голосов
/ 21 марта 2020

У меня есть два списка, position_rabbits_x (со всеми координатами x) и position_rabbits_y (со всеми координатами y). После запуска моей программы 200 se c .my "кроликов" воспроизводят, однако, когда я вызываю эту функцию, моя программа падает. (он не печатает ошибку, просто перегружает, потому что он добавляет слишком много «кроликов» в мой компьютер, поэтому он больше не отвечает) Большое спасибо !!

def reproducing_rabbits():
    global positions_rabbits_x, positions_rabbits_y
    global rabbits_angles


    angle = 2 * math.pi * random.random()
    index = 0

    for rabx in range(len(positions_rabbits_x)-1,-1,-1):
        for rabx2 in range(len(positions_rabbits_y)):    
            distance = math.sqrt((positions_rabbits_x[rabx] - positions_rabbits_x[rabx2])**2 + (positions_rabbits_y[rabx] - positions_rabbits_y[rabx2])**2) 
            if distance < 1:
                index += 1
                if index == 1:
                    positions_rabbits_x.append(random.randint(1, 100))
                    positions_rabbits_y.append(random.randint(1,100))
                    rabbits_angles.append(angle)
                    index = 0
                else:
                    pass
    return




Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Я бы предложил изменить способ итерации по координатам кролика.

В l oop также есть много лишнего кода, который я удалил. index не было необходимости.

def reproducing_rabbits(rabbits_x, rabbits_y, rabbits_angles):

    for n, (x1, y1) in enumerate(zip(rabbits_x, rabbits_y)):
        for m, (x2, y2) in enumerate(zip(rabbits_x, rabbits_y)):  
            if math.sqrt((x1-x2)**2 + (y1-y2)**2) < 1 and n != m: # No self-reproduction.
                rabbits_x.append(randint(1, 100))
                rabbits_y.append(randint(1, 100))
                rabbits_angles.append(2*pi*random())

    return rabbits_x, rabbits_y, rabbits_angles
0 голосов
/ 21 марта 2020

С предложенными изменениями, сделанными в комментариях, ваш код запускается.

from math import pi
from random import random, randint

def reproducing_rabbits(positions_rabbits_x, positions_rabbits_y):

    angle = 2 * pi * random()
    rabbits_angles = []

    index = 0

    for rabx in range(len(positions_rabbits_x)-1,-1,-1):
        for rabx2 in range(len(positions_rabbits_x)):  
            # change or to and since it seems this should be based upon
            # Manhattan distance (meaning if rabbit positions in x and y
            # are within 1
            if positions_rabbits_x[rabx] - positions_rabbits_x[rabx2] < 1 and positions_rabbits_y[rabx] - positions_rabbits_y[rabx2] < 1:
                index += 1
                if index == 1:
                    positions_rabbits_x.append(randint(1, 100))
                    positions_rabbits_y.append(randint(1,100))
                    rabbits_angles.append(angle)
                    index = 0
                else:
                    index= 0
                    continue

    return positions_rabbits_x, positions_rabbits_y, rabbits_angles

Тест

positions_rabbits_x = list(range(4))
positions_rabbits_y = list(range(4))

positions_rabbits_x, positions_rabbits_y, rabbits_angles = reproducing_rabbits(positions_rabbits_x, positions_rabbits_y)
print(f'Positions x {positions_rabbits_x}')
print(f'Positions y {positions_rabbits_y}')
print(f'Rabbits Angles {rabbits_angles}')

Выход

Positions x [0, 1, 2, 3, 67, 73, 29, 69, 99, 7, 11, 55, 18, 49, 81, 36, 79, 82, 87, 79, 16, 11, 62, 2, 49, 91, 15, 27, 47, 22]
Positions y [0, 1, 2, 3, 24, 85, 9, 19, 46, 34, 56, 25, 84, 24, 56, 86, 73, 71, 14, 68, 13, 62, 25, 83, 17, 90, 4, 41, 26, 20]
Rabbits Angles [6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789, 6.142160513085789]
...