繁体   English   中英

在Python类方法中传递参数

[英]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,这是导致错误的原因。

  1. set_state是一个非常糟糕的名字,它什么也没设置,get_state更好...
  2. 在所有的return参数中,()毫无用处,对于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)

您将遇到的另一个问题是,您使用整数作为使用范围生成的代理的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

您是否真的需要存储随机代理? 我认为您的逻辑是:

  1. 创建大小为n的两个总体PP '
  2. 对于每个种群,将成员的随机状态设置为S,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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM