точки моделирования на поверхности - PullRequest
1 голос
/ 31 января 2011

Моя имитационная модель содержит агентов на поверхности.Агенты представлены class Agent, их местоположения - class Point, а сама поверхность - class Surface.Каждая точка на самом деле представляет собой просто пару чисел.

Чтобы смоделировать движение агента, мне нужно знать, на какой поверхности он находится (например, на торе он никогда не достигнет края земли, кроме как на цилиндре,он будет.)

Мой вопрос заключается в том, должен ли я добавить к class Point в качестве атрибута экземпляра ссылку на объект Surface.

Если я это сделаю, class Point станетболее сложный, и эффективность страдает (вместо того, чтобы иметь дело с парами чисел, я буду иметь дело с парами чисел плюс ссылка).Это особенно раздражает, так как существует только один экземпляр class Surface, когда-либо созданный за один запуск программы.

Если я этого не сделаю, я не смог бы дать class Agent move метод.Вместо этого мне нужно смоделировать движение агентов из внешнего класса, который знает как поверхностных, так и отдельных агентов.Этот подход кажется логически менее привлекательным.

1 Ответ

1 голос
/ 31 января 2011

Я не уверен, почему добавление дополнительного атрибута является проблемой эффективности - это не повлияет на скорость и увеличит размер объекта только на 10 байт или около того. Поэтому, если вы не имеете дело с миллионами агентов (миссис Анндерссссонн), я бы не беспокоился об этом.

В качестве альтернативы вы можете иметь одну поверхность, которая создается в модуле как локальная и доступна через метод модуля (немного чище, чем глобальный). Так что-то вроде:

 import TheSurface
 class Agent:
  ...
   def Move(self,x,y):
     surface = TheSurface.getSurface()
     surface.canIMoveTo(x,y)
     ....

TheSurface.py будет иметь какой-то метод инициализации, который создает поверхность, который должен вызываться при запуске программы. @DesignPattern people: это шаблон «синглтон»?

Лучше всего создать агента с поверхностью и сохранить его в качестве атрибута. Я не понимаю, почему вы добавили его в Точку.

Структура выглядит примерно так:

  • Агент на поверхности
  • Агент в точке

Следовательно, вы можете сделать вывод, что точка находится на поверхности, и нет необходимости моделировать ее отдельно, если, возможно, вы не имеете дело с точками, которые каким-либо образом не связаны с агентами, но тогда у вас будет контекст поверхности в любом случае. Всегда будет «Хорошо, теперь я должен поместить несколько деревьев на эту поверхность - createTree (поверхность, точка)» и т. Д. Все на поверхности имеет поверхность и точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...