在Python类方法中传递参数

在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

我有两个群体,一个是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程序员来说,这甚至是最糟糕的:乍一看,似乎您将返回一个元组,但实际上并非如此
  • 我认为您可能应该执行一个专门的函数“选择一个代理”,该函数选择并删除一个代理,然后直接返回索引和状态

    例如,添加此方法:

    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
    

    你真的需要存储随机代理吗?我想你的逻辑是:

  • 创建两个大小为n的群体P和P'
  • 对于每个总体,将成员的随机状态设置为S、I或R中的一个
  • 从总体P和P'中选择随机成员并交换它们
  • 在确定的时间段内重复步骤#3
  • 周期结束后,分析成员的S、I或R状态
  • 在所有这些中,您不需要将随机代理存储在任何地方。您只需要获取它,然后交换成员

  • 用总体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)
    

  • 你的问题会得到更多的关注,包括一个最小的例子来描述你遇到的问题。你需要更详细地解释你的代码到底出了什么问题:发生了什么,预期会发生什么,你想要什么行为,而你现在没有。要开始,粘贴箱粘贴中的缩进错误。您的类构造函数有一个不使用的必需参数
    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)