2014-08-30 4 views
0

У меня есть две популяции Pop1 из агентов N1 и Pop2 из агентов N2. Динамика SIR Infection происходит в Pop1 и Pop2. Теперь на каждом временном шаге случайно выбранный агент удаляется из Pop1 и добавляется в Pop2 и наоборот. Удаленный агент может находиться в состоянии S или I или R и сохраняет свое состояние при добавлении в другой Pop. Код длинный, поэтому я вставлял его в pastebin http://pastebin.com/PdmJTUhs.Передача аргументов в методе класса Python

В моем коде 'oAgent' - случайно выбранный агент, который удаляется из Pop1 или Pop2. Теперь состояние (S = 0 или = 1, или R = 2) oAgent возвращается методом класса set_state (сам, oAgent)

def set_state(self, oAgent): 
    if SW_SIR.oAgent in self.sAgent: 
     return (0) 
    if SW_SIR.oAgent in self.iAgent: 
     return (1) 
    if SW_SIR.oAgent in self.rAgent: 
     return (2) 

В моем коде класса Pop1_SW и Pop2_SW являются объектами класса для POP1 и POP2 соответственно. Состояние объекта Pop1 - это состояние агента, которое добавляется в Pop2, и наоборот. Теперь Pop1_SW должен получить state2 (который является состоянием oAgent of Pop1) в качестве входного параметра, а Pop2_SW должен получить state1 (который является состоянием oAgent из Pop2).

Итак, мой вопрос в том, как правильно назначить состояние для удаленных и добавленных агентов? Проблема в том, где внутри класса должен быть определен аагент и как вне класса его состояние должно быть входом для другого объекта класса?

Мой код отлично подходит для динамики SIR для одного населения. Я добавил три метода set_state(), removeAgents() и addAgents для двух групп населения, которые являются причиной ошибки.

+2

Ваш вопрос будет получить большее внимание включить минимальный пример с изображением, где у вас возникли проблемы – shx2

+1

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

+0

Чтобы отбросить вещи, отпечаток неправильный в вашей пастообразной пасте. У вас есть необходимый аргумент 'm' для вашего конструктора классов, который вы не используете, и ваш случайный выбор' oAgent' должен находиться в пределах любой длины вашей популяции. –

ответ

1
  1. set_state действительно плохое имя, оно does'nt установить что-нибудь, get_state лучше ...
  2. во все вашем возвращаемом параметре в() не имеет никакого смысла, для программиста питона это еще хуже: в первом взгляните, кажется, вы вернете кортеж, но это не так.

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

Для Exemple добавить этот метод:

def pick_an_agent(self): 
    """Randomly choose an agent, remove it from population and return it 
    with it's state.""" 

    agent_id = random.choice(self.sAgent + self.iAgent + self.rAgent) # Choose directly an existing agent, doesn't care about population size and id range. 
    state = self.get_state(agent_id) 
    self.removeAgent(agent_id) 
    return (agent_id, state) 

Эта функция возвращает непосредственно номер агента и состояние. Таким образом, вы

agent_id, state = Pop1.pick_an_agent() 
Pop2.addingAgent(agent_id, state) 

Другая проблема у вас будет тот факт, вы используете целое число в качестве идентификатора для вашего агента генерируется с использованием диапазона. Итак, у вас первое население N = 20 у вас есть агент с id от 0 до 19, а у вас вторая популяция N = 10 у вас есть агент с id от 0 до 9. Если вы перемещаете агента из одной популяции в другую, у вас есть столкновение с идентификатором!

Для этого вам нужно создать агента с уникальным идентификатором. Для этого вы можете использовать счетчик и получить N элемент из него (заменить агент = диапазон (N) в функции инициализации)

Так вы добавите:

... 
import itertools 
... 

class SW_SIR: 
    agent_id_generator = itertools.count() # Create a counter starting at 0. It's a class attribute, so all SW_SIR will use the same 

    def __init__(self, beta, gamma, S, I, m): 
     ... 
     agents = list(itertools.islice(self.agent_id_generator, N)) # It's get the next N elements of the counter, so you get unique id between agent in using the class SW_SIR 
+0

Спасибо, я попробую и посмотрю, как это работает от меня – ADK

1

вам действительно нужен случайный агент, хранящийся ли ?Я предполагаю, что ваша логика:

  1. Создание двух популяций P и P ' размера п.
  2. Для каждой популяции, устанавливается в произвольном положении члена к одному из S, я или R.
  3. Pick случайного члена из популяции P и P ' и поменять их местами.
  4. Повторите шаг №3 в течение определенного периода времени.
  5. Анализ элементов состояния S, I или R после окончания периода.

Во всех случаях вам не нужно хранить случайный агент в любом месте. Вам просто нужно получить его, а затем поменять членов.

  1. Инициализировать класс с населением P и P '.

  2. «Infect» ваши члены с состоянием S, I или R в случайном порядке.

  3. Создайте метод, который меняет членов. Он ничего не возвращает, просто перетасовывает списки, выскакивает из одного и присоединяется к другому. Вы просто вызываете эту функцию на каждом «тике» вашего временного интервала. Этот метод может выглядеть следующим образом:

    def cross_pollinate(self): 
        random.shuffle(self.pop_a) 
        random.shuffle(self.pop_b) 
        a = self.pop_a.pop() 
        b = self.pop_b.pop() 
        self.pop_a.append(b) 
        self.pop_b.append(a) 
    
+0

В этом коде «агент» - это всего лишь идентификатор. Состояние агента определяет, по какому списку сохраняется идентификатор. Но да, объект «Агент» с состоянием более прост в некоторых моментах. – Cld

+0

@Cld Большое спасибо за предложение. Это гораздо более простой подход. Я сомневаюсь в шаге №3. Каждый из P и P 'имеет определенную связность между их агентами после случайного графа Erdos_Renyi. Поэтому, когда я удаляю агента из P, соединения этого агента теряются. И когда я добавлю нового агента в P, который будет последним, он случайным образом подключается к любым агентам в P. Все после этого происходит динамика SIR. Поэтому, если я последую за вами, эти изменения в связности не будут иметь места. Я прав ? – ADK

Смежные вопросы