Имитация муравья: лучше создать процесс / поток для каждого муравья или что-то еще? - PullRequest
6 голосов
/ 31 мая 2011

Простое исследование: Имитация жизни муравья

Я создаю ОО-структуру, которая видит класс для муравейника, класс для муравья и класс для всего симулятора.

Теперь я думаю о том, "как" заставить муравьев "жить" ...

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

С уважением, я должен сделать несколько тестов, чтобы понять, что лучше, AFAIK Threadsв Python используйте меньше памяти, чем процессы.

То, что «муравьи» должны делать при запуске симуляции, это просто: перемещаться в произвольном направлении, если они находят еду -> есть / приносить муравейнику,если они нашли другого муравья из другого муравейника, который перевозит еду -> атаковать -> собирать еду -> делать то, что должен делать .... и так далее ... это означает, что я должен "делиться" информацией между муравьями и междувся окружающая среда.

поэтому я переписываю: лучше создать Process / Тема для каждого муравья или что-то еще?

РЕДАКТИРОВАТЬ: В связи с моим вопросом "что лучше", я проголосовал за все умные ответы, которые я получил, и я также оставил комментарий к ним.После моих тестов я приму лучший ответ.

Ответы [ 5 ]

4 голосов
/ 31 мая 2011

Я бы порекомендовал взглянуть на без стека . Stackless представляет тасклеты, похожие на микропотоки, которые позволяют получить преимущества потокового программирования без проблем с производительностью и сложностью, связанных с обычными потоками

Возможная проблема со стеком состоит в том, что, насколько я знаю, вам нужно использовать модифицированный интерпретатор или pypy для использования микропотоков. Однако это может стоить того, поскольку есть некоторые компании, которые используют стек без больших успехов (например, потому что он используется для EVE Online)

Также взгляните на greenlet , который также предлагает вам разновидность микропотоков без замены переводчика. Тем не менее, по сравнению с без стека гринлет предлагает только ограниченный набор функций.

3 голосов
/ 01 июня 2011

Если вы не возражаете против GPL, я предлагаю вам использовать Khronos среду моделирования, которая позволяет вам определять каждого муравья как генератор, чтобы вам не нужно было создавать потоки.Механизм Khronos заботится о планировании.

Я на самом деле разрабатываю конкурирующий проект под названием GarlicSim , который вы также можете использовать для симуляции, но для вашего случая Khronos будет лучше.(Если у вас нет проблем с GPL.)

2 голосов
/ 31 мая 2011

Я написал имитацию муравья (для нахождения хорошего TSP-решения) и не рекомендую Thread-Solution.Я использую цикл для вычисления для каждого муравья следующего шага, поэтому мои муравьи не ведут себя одновременно (но синхронизируются после каждого шага).

Я не вижу смысла моделировать этих муравьев с помощью Threads.Это не является преимуществом с точки зрения поведения во время выполнения и не является преимуществом с точки зрения элегантности (кода)!

Возможно, было бы немного более реалистично использовать потоки, поскольку реальные муравьи являются параллельными, нодля целей моделирования это ИМХО пренебрежимо.

1 голос
/ 31 мая 2011

Я думаю, что решение потока является лучшим. Даже если муравьи являются индивидуумами, они разделяют окружение, в точности то, что разрешено при использовании потоков. Процесс решения соответствует действительности, было бы нелегко реализовать систему связи с окружающей средой.

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

Например:

import time
...
while True:
    for ant in ants:
        ant.act()
    time.sleep(tickwait)

Между тем, это решение проще в реализации.

1 голос
/ 31 мая 2011

Я согласен с @delan - кажется чрезмерным выделять целую нить для каждого муравья, особенно если вы хотите масштабировать ее до целого муравейника с тысячами бегающих вокруг тварей.

Вместо этого вы можетерассмотрите возможность использования потока для обновления многих муравьев в одном «цикле».В зависимости от того, как вы это пишете - вам нужно тщательно обдумать, какие данные должны быть переданы - вы можете даже использовать пул этих потоков для масштабирования моделирования.

Также имейте в виду, что в CPythonGIL не позволяет нескольким собственным потокам выполнять код одновременно.

...