Расчет расстояния между координатами в Python - PullRequest
0 голосов
/ 08 ноября 2018

Может ли кто-нибудь помочь мне рассчитать после каждой итерации самую дальнюю точку от точки, которая была создана?

Это агентная модель, которую я создал с помощью Netlogo и теперь пытаюсь перенести ее на Python

Относительно того, какое расстояние использовалось, я могу точно сказать, поскольку я использовал предопределенную функцию для его вычисления, извините за это.

import random

class Bug:
    def __init__(self, number, xPos, yPos, worldXSize = 80, worldYSize = 80):
    # the environment
        self.number = number
        self.worldXSize = worldXSize
        self.worldYSize = worldYSize
    # the bug
        self.xPos = xPos
        self.yPos = yPos
        print ("Bug number ", self.number, \
          " has been created at ", self.xPos, ", ", self.yPos)

    # the action
    def randomWalk(self):
        self.xPos += randomMove()
        self.yPos += randomMove()
        self.xPos = (self.xPos + self.worldXSize) % self.worldXSize
        self.yPos = (self.yPos + self.worldYSize) % self.worldYSize
    # report
    def reportPosition(self):
        print ("Bug number ", self.number, " moved to X = ", \
           self.xPos, " Y = ", self.yPos)

# returns -1, 0, 1  with equal probability
def randomMove():
    return random.randint(-1, 1)

nBugs = input("How many bugs? ")
#bugList = [0] * nBugs
bugList=[]
worldXSize= input("X Size of the world? ")
worldYSize= input("Y Size of the world? ")
length = input("Length of the simulation in cycles? ")


for i in range(nBugs):
    aBug = Bug(i, random.randint(0,worldXSize-1), \
                        random.randint(0,worldYSize-1),
                        worldXSize, worldYSize)
    bugList.append(aBug)

for t in range(length):
    for aBug in bugList:
        aBug.randomWalk()
        aBug.reportPosition()

Вот оригинальная модель на netlogo:

to setup
  clear-all
  create-turtles nBugs
  reset-ticks
end

to go
  tick
  if ticks >= nCycles [stop]
  ask turtles
   [ set xcor xcor + random 3 - 1
     set ycor ycor + random 3 - 1
     type "I'm agent " type who type " and the farthest turtle from me    is " print  max-one-of turtles [distance myself]

   ]

end

1 Ответ

0 голосов
/ 10 ноября 2018

Ниже моя оценка того, что вы после. Я импортировал Vec2D из черепахи, чтобы упростить вашу логику:

from random import randint, randrange
from turtle import Vec2D

class Bug:
    def __init__(self, number, worldXSize=80, worldYSize=80):
        # the environment
        self.number = number
        self.worldXSize = worldXSize
        self.worldYSize = worldYSize

        # the bug
        self.position = Vec2D(randrange(worldYSize), randrange(worldYSize))
        print("Bug number", self.number, "has been created at", self.position)

    # the action
    def randomWalk(self):
        self.position += randomMove()

    def distance(self, other):
        return abs(other.position - self.position)

    # report
    def reportPosition(self):
        print("Bug number", self.number, "is located at", self.position)
        distance, bug = max((self.distance(bug), bug.number) for bug in bugList if bug != self)
        print("the farthest bug from me is", bug, "at a distance of", distance)

# returns -1, 0, 1  with equal probability
def randomMove():
    return Vec2D(randint(-1, 1), randint(-1, 1))

nBugs = int(input("How many bugs? "))

worldXSize = int(input("X Size of the world? "))
worldYSize = int(input("Y Size of the world? "))

length = int(input("Length of the simulation in cycles? "))

bugList = [Bug(i + 1, worldXSize, worldYSize) for i in range(nBugs)]

for _ in range(length):
    for bug in bugList:
        bug.randomWalk()

    print()

    for bug in bugList:
        bug.reportPosition()

Хотя я использовал worldXSize и worldYSize для ограничения места создания ошибок, я не ограничивал, где они могут быть - измените, как считаете нужным. Эта логика в вашем коде не имеет смысла:

self.xPos = (self.xPos + self.worldXSize) % self.worldXSize

как кажется, просто следующее делает то, что вы хотите (то же самое для координаты Y):

self.xPos = self.xPos % self.worldXSize

И я вообще не вижу, как работает ваш код, так как вы не преобразовывали входные данные из строк в числа, прежде чем использовать их в математических ситуациях.

OUTPUT

% python3 test.py
How many bugs? 3
X Size of the world? 100
Y Size of the world? 100
Length of the simulation in cycles? 4
Bug number 1 has been created at (94.00,9.00)
Bug number 2 has been created at (91.00,40.00)
Bug number 3 has been created at (29.00,18.00)

Bug number 1 is located at (93.00,9.00)
the farthest bug from me is 3 at a distance of 64.77653896280658
Bug number 2 is located at (90.00,41.00)
the farthest bug from me is 3 at a distance of 64.8459713474939
Bug number 3 is located at (29.00,19.00)
the farthest bug from me is 2 at a distance of 64.8459713474939

Bug number 1 is located at (94.00,9.00)
the farthest bug from me is 3 at a distance of 66.91038783328041
Bug number 2 is located at (90.00,40.00)
the farthest bug from me is 3 at a distance of 65.14598989960932
Bug number 3 is located at (28.00,20.00)
the farthest bug from me is 1 at a distance of 66.91038783328041

Bug number 1 is located at (95.00,9.00)
the farthest bug from me is 3 at a distance of 66.75327707311455
Bug number 2 is located at (90.00,39.00)
the farthest bug from me is 3 at a distance of 64.19501538281614
Bug number 3 is located at (29.00,19.00)
the farthest bug from me is 1 at a distance of 66.75327707311455

Bug number 1 is located at (96.00,8.00)
the farthest bug from me is 3 at a distance of 68.06614430096654
Bug number 2 is located at (89.00,39.00)
the farthest bug from me is 3 at a distance of 62.93647591023825
Bug number 3 is located at (29.00,20.00)
the farthest bug from me is 1 at a distance of 68.06614430096654
%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...