2014-08-30 2 views
0

두 개의 Population1 N1 에이전트 Pop2 및 N2 Agent Pop2 있습니다. SIR 감염 역학은 Pop1과 Pop2에서 일어나고 있습니다. 이제 각 시간 단계에서 무작위로 선택된 에이전트가 Pop1에서 제거되고 Pop2에 추가되고 반대의 경우도 마찬가지입니다. 제거 된 상담원은 S 또는 I 또는 R 상태 일 수 있으며 다른 Pop에 추가 될 때 상태를 유지합니다. 코드가 조금 길어서 붙여 넣기 상자에 붙여 넣습니다. http://pastebin.com/PdmJTUhs.Python 클래스 메서드에서 인수 전달

내 코드에서 'oAgent'는 Pop1 또는 Pop2에서 제거되는 무작위로 선택된 에이전트입니다. 현재 상태 (S = 0 또는 I = 1 또는 R = 2) oAgent의이 클래스 방법 set_state (자기, oAgent) 내 코드 클래스 Pop1_SW 및 Pop2_SW에서

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 및 POP2위한 클래스 개체 각기. PopA의 oAgent 상태는 Pop2에 추가되는 에이전트의 상태이며, 그 반대의 경우도 마찬가지입니다. 이제 Pop1_SW는 state2 (Pop1의 oAgent 상태)를 입력 매개 변수로 가져오고 Pop2_SW는 state1 (Pop2의 oAgent 상태)을 가져야합니다.

제 질문은 제거 된 에이전트와 추가 된 에이전트의 상태를 어떻게 올바르게 할당 할 수 있습니까? 문제는 클래스 oAgent 내부를 정의해야하고 클래스 외부에서 클래스의 상태가 다른 클래스 객체의 입력이되어야하는 위치입니다.

단일 인구에 대한 SIR 동역학을 위해 내 코드가 올바르게 실행됩니다. 나는 세 가지 메소드 set_state(), removAgents() 및 addingAgents를 오류의 원인 인 두 개의 모집단에 추가했습니다.

+2

당신의 코드 : 어떤 일이 일어나고, 어떤 일이 일어날 것이며, 당신이 현재 갖고 있지 않은 행동을 결정할 것입니다. – shx2

+1

문제가 발생하는 위치를 묘사하는 최소한의 예를 포함한다의 더 많은 관심을 얻을 것입니다 귀하의 질문은 훨씬 더 세부 정확히 무슨 문제입니다 –

+0

물건을 걷어차 기 위해서는 붙여 넣기 상자에 들여 쓰기가 잘못되었습니다. 당신은 당신의 클래스 생성자에 대해 당신이 사용하지 않는 인자'm'을 가지고 있습니다 - 당신의 무작위적인'oAgent' 선택은 당신의 인구의 어떤 길이의 범위 안에 있어야합니다. –

답변

1
  1. set_state는 정말 나쁜 이름입니다, 그것은 아무것도 설정 does'nt, 더 나은 get_state ... 모든 수익 매개 변수
  2. () 파이썬 프로그래머를위한 심지어 최악의, 어떤 목적이없는
  3. : 처음에 한 번 튜플을 반환 할 것 같지만 그렇지 않습니다.

난 당신이 아마 헌정 기능 선택 "에이전트를 선택"및 에이전트를 제거하고 직접 인덱스와 상태를 돌아를해야한다 생각합니다. 이 방법을 추가 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) 

다른 문제는 범위를 사용하여 생성 된 상담원의 ID로 정수를 사용한다는 것입니다. 따라서 첫 번째 인구 N = 20에서 당신은 0에서 19까지의 ID를 가진 에이전트를 가지고 있고 두 번째 인구 N = 10에서 당신은 0-9의 ID를 가진 에이전트를가집니다. 한 인구에서 다른 인구로 에이전트를 이동 시키면 id 충돌이 발생합니다!

고유 ID로 상담원을 만들어야합니다.

... 
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

당신이 정말 저장된 임의의 에이전트가 필요하십니까 : 그래서 당신은 추가

을 (당신의 init 함수에서 에이전트 = 범위 (N)을 대체)이 들어 당신은 카운터를 사용할 수 있으며에서 N 요소를 얻을 ?나는 당신의 논리가 가정 :

  1. 두 집단 PP 크기 N'을 만듭니다. S 중 하나에 회원의 임의의 상태로 설정 한 각 집단에 대한
  2. 는, I 또는 R.는
  3. 인구 PP '하고이를 교환에서 임의의 구성원을 선택합니다.
  4. 정해진 기간 동안 3 단계를 반복하십시오.
  5. 기간이 끝난 후 S, I 또는 R 상태에 대한 멤버를 분석하십시오.

이 모든 경우 임의의 에이전트를 어디에도 저장할 필요가 없습니다. 당신은 그것을 가져 와서 멤버들을 교환 할 필요가 있습니다.

  1. 는 인구 PP '을 가지는 클래스를 초기화합니다.

  2. 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

그것의 코드에서 "에이전트"는 단지 id이다. 에이전트의 상태는 ID가 유지하는 목록에 따라 결정됩니다. 그렇지만 상태를 가진 객체 '에이전트'는 어떤 점에서는 더 단순합니다. – Cld

+0

@Cld 제안에 감사드립니다. 훨씬 간단한 접근법입니다. # 3 단계에 대해서는 의구심이 있습니다. P와 P '의 각각은 Erdos_Renyi 무작위 그래프를 따르는 에이전트 들간에 일정한 연결성을 가지고 있습니다. 따라서 P를 말하면서 에이전트를 제거하면 해당 에이전트의 연결이 끊어집니다. 마지막 P가 될 P에 새로운 에이전트를 추가하면 PIR의 모든 에이전트에 무작위로 연결됩니다. 그 후 SIR 역학이 발생합니다. 그래서 내가 당신을 따라 간다면 그 변화는 일어나지 않을 것입니다. 내가 맞습니까? – ADK