[英]Passing arguments in Python Class method
我有两个人口N1代理人Pop1和N2代理人Pop2。 SIR感染动态发生在Pop1和Pop2中。 现在,在每个时间步骤中,都会从Pop1中删除随机选择的代理,并将其添加到Pop2中,反之亦然。 删除的代理可能处于S或I或R状态,并且在添加到另一个Pop时会保留其状态。 代码有点长,所以我将其粘贴到pastebin http://pastebin.com/PdmJTUhs中 。
在我的代码中,“ oAgent”是从Pop1或Pop2中删除的随机选择的代理。 现在,通过类方法set_state(self,oAgent)返回oAgent的状态(S = 0或I = 1或R = 2)
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的oAgent状态是正在Pop2中添加的代理的状态,反之亦然。 现在Pop1_SW应该获取state2(它是Pop1的oAgent的状态)作为输入参数,而Pop2_SW应该获取state1(它是Pop2的oAgent的状态)。
所以我的问题是如何为已删除和已添加代理正确分配状态? 问题是应该在类oAgent的内部定义什么地方,以及在其外部的状态应如何作为另一个类对象的输入?
对于单个“人口”的SIR动态,我的代码运行良好。 我为两个填充添加了三个方法set_state(),removeingAgents()和addingAgents,这是导致错误的原因。
我认为您可能应该执行一个专用功能“选择一个代理”,该功能选择并删除一个代理,然后直接向您返回索引和状态。
例如,您添加以下方法:
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中,您的ID为0到19,在第二个种群N = 10中,您的ID为0到9。
因此,您需要创建具有唯一ID的代理。 为此,您可以使用计数器并从中获取N元素(在init函数中替换agent = range(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
您是否真的需要存储随机代理? 我认为您的逻辑是:
总之,您无需将随机代理存储在任何地方。 您只需要获取它,然后交换成员即可。
用种群P和P '初始化班级。
随机以S,I或R状态“感染”您的成员。
创建一个交换成员的方法。 它不返回任何内容,只是随机排列列表,从一个列表弹出,然后追加到另一个列表。 您只需在时间间隔的每个“滴答”中调用此函数。 此方法可能类似于:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.