在Python类方法中传递参数
我有两个群体,一个是N1型药物的Pop1,另一个是N2型药物的Pop2。SIR感染动态发生在Pop1和Pop2内。现在,在每个时间步,从Pop1中移除随机选择的代理,并将其添加到Pop2,反之亦然。删除的代理可能处于S、I或R状态,并且在添加到另一个Pop时保留其状态。代码有点长,所以我把它粘贴到了pastebin中 在我的代码中,“oAgent”是随机选择的代理,它将从Pop1或Pop2中删除。现在oAgent的状态(S=0或I=1或R=2)由类方法set\u state(self,oAgent)返回 在我的代码类中,Pop1_SW和Pop2_SW分别是Pop1和Pop2的类对象。 Pop1的oAgent状态是添加到Pop2中的代理的状态,反之亦然。现在,Pop1_SW应该获取state2(Pop1的oAgent状态)作为输入参数,Pop2_SW应该获取state1(Pop2的oAgent状态) 因此,我的问题是如何为已删除和已添加的代理正确分配状态?问题是应该在类内部的何处定义oAgent,以及在类外部它的状态应该如何作为另一个类对象的输入 我的代码对单个群体的SIR dynamics运行良好。我为两个总体添加了三个方法set_state()、removingAgents()和addingAgents,这是导致错误的原因在Python类方法中传递参数,python,Python,我有两个群体,一个是N1型药物的Pop1,另一个是N2型药物的Pop2。SIR感染动态发生在Pop1和Pop2内。现在,在每个时间步,从Pop1中移除随机选择的代理,并将其添加到Pop2,反之亦然。删除的代理可能处于S、I或R状态,并且在添加到另一个Pop时保留其状态。代码有点长,所以我把它粘贴到了pastebin中 在我的代码中,“oAgent”是随机选择的代理,它将从Pop1或Pop2中删除。现在oAgent的状态(S=0或I=1或R=2)由类方法set\u state(self,oAgen
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)
您将遇到的另一个问题是,您使用一个整数作为使用range生成的代理的id。所以,在第一个总体N=20中,有id为0到19的代理,在第二个总体N=10中,有id为0到9的代理。如果将代理从一个群体移动到另一个群体,则会发生id冲突
因此,您需要创建具有唯一id的代理。为此,您可以使用计数器并从中获取N元素(替换init函数中的agents=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
你真的需要存储随机代理吗?我想你的逻辑是:
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)
你的问题会得到更多的关注,包括一个最小的例子来描述你遇到的问题。你需要更详细地解释你的代码到底出了什么问题:发生了什么,预期会发生什么,你想要什么行为,而你现在没有。要开始,粘贴箱粘贴中的缩进错误。您的类构造函数有一个不使用的必需参数
m
,并且您对oAgent
的随机选择应该在您的总体长度范围内。@BurhanKhalid我完全同意您的看法oAgent=random.choice(len(sAgent)+len(iAgent)+len(rAgent))。但是你能建议我在课堂上的什么地方定义它吗。我已经将它定义为一个类变量。我可以修复参数m和缩进,但我的问题仍然没有解决。您可以将oAgent定义为类的@property
:@property def oAgent(self):return…
在它的代码中,“代理”只是一个id。代理的状态取决于保留id的列表。但是,是的,带有状态的对象“代理”在某些方面更简单。@Cld非常感谢您的建议。这是一种更简单的方法。我对第三步有疑问。P和P'的每一个在它们的代理之间都有一定的连通性,遵循鄂尔多斯-仁义随机图。因此,当我从例如P中删除代理时,该代理的连接将丢失。当我在P中添加一个新的代理,这将是最后一个代理时,它会随机连接到P中的任何代理。所有这些都是在SIR动态发生之后。因此,如果我跟随你,这些连接改变将不会发生。我说得对吗?
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)