Language agnostic 将数学问题转化为离散事件模拟

Language agnostic 将数学问题转化为离散事件模拟,language-agnostic,math,model,simulation,Language Agnostic,Math,Model,Simulation,我正在努力实现这一目标。基本上,我理解模型的方式是,在每个时间步,它告诉我们有多少节点被感染,有多少节点被恢复。我现在正试图将其转换为离散事件模拟,但在某一点上我感到困惑 该模型一般采用欧拉法求解。现在,当我将其转换为离散事件模拟时,我正在做类似的事情(为了清晰起见,使用了数字): 我想知道上述方法是否正确。有什么建议吗?我在这里看到了至少两个问题,它们都来自同一个根本原因 1) 如果你引入了某种邻域结构,那么beta*(感染/总数)应该是beta 2) 有gamma*infected的行只适用

我正在努力实现这一目标。基本上,我理解模型的方式是,在每个时间步,它告诉我们有多少节点被感染,有多少节点被恢复。我现在正试图将其转换为离散事件模拟,但在某一点上我感到困惑

该模型一般采用欧拉法求解。现在,当我将其转换为离散事件模拟时,我正在做类似的事情(为了清晰起见,使用了数字):


我想知道上述方法是否正确。有什么建议吗?

我在这里看到了至少两个问题,它们都来自同一个根本原因

1) 如果你引入了某种邻域结构,那么
beta*(感染/总数)
应该是
beta

2) 有
gamma*infected
的行只适用于受感染的个体,您不需要
gamma*infected
——它应该是
gamma


也许还有更多的问题——很难从伪代码中看出。欢迎您稍加改进,我再看一看。

作为一个开始看起来不错,除了第一个循环,您需要记住,只有易受感染的个体才能感染,第二个循环,只有受感染的个体才能恢复。我还认为每个事件的转移概率(易受感染的邻居收到消息,受感染的可能正在恢复)不是当前受感染个体数量的函数——它们是常数(我认为你误导了“质量效应”概率是指在一个时间步中应用于每一个单独事件的概率——它们不是)

更微妙的是如何执行第一个循环(在SIR模型中我不太清楚):我认为您需要首先确定所有“消息”,然后确定哪些消息会导致转换敏感->感染,即。,两个循环而不是一个循环——因为一个在这个时间步刚刚被感染的个体不能在这个时间步感染其他人,但只能在将来;另外,对于在这个时间点刚刚感染病毒的人来说,转换infected->recovered是不可能的,所以你必须以不同的方式安排你的循环

考虑使用两个“状态”属性对每个个体进行建模:

-- nummsgs, number of "messages" received this time step
-- compartment (susceptible, infected or recovered)
以及一组固定的邻居。然后:

for each individual:
    if individual.compartment != infected:
        continue
    for each neighbor of the individual:
        neighbor.nummsgs += 1
    if (random number says so):
        individual.compartment = recovered

for each individual:
    if individual.compartment != susceptible:
        continue
    maybe (depending on random number & nummsgs):
        individual.compartment = infected

for each individual:
    individual.nummsgs = 0

这似乎可以更好地捕获总体流程(收集和记录总体计数的净额,您可以在概念上将其作为最后一个循环的一部分来完成)。

首先,这种方法通常不是称为离散事件模拟,而是称为时间步模拟。严格来说,这并不是不正确的,但实际上,“离散事件”一词用于事件间隔时间可变的模拟。例如,如果每个受感染的节点在随机时间向随机邻居生成一条“感染”消息

其次,您的代码忽略了消息的优先级或权重。如果节点同时收到“感染”和“恢复”消息,该怎么办?隔离节点和节点在感染团块中间的恢复概率是否真的相同?这将导致感染状态和健康状态之间的内部节点出现一种抖动

事实上,我不认为有理由在这里使用消息。每个节点的感染概率只是其受感染邻居数量的函数-为什么不使用它呢?根据你的目标,用数学期望代替概率可能更好


最后,这个问题与著名的“生命游戏”密切相关。请看一下各种实现。

谢谢您的解释。我会再仔细考虑一下,很快就会发回修订版。编辑:刚刚看到你修改过的帖子。我现在会调查这件事。。。非常感谢…谢谢。。。我很快就会发回修订版。我希望stackoverflow有办法ping成员:)再次感谢。@Legend:ping!(只是个测试)。@白痴:哈哈。。我不知道你为什么要在我身上这样做:P无论如何,我猜你的ping成功了。。!我知道这已经晚了,但有没有理由不使用Gillespie算法?您正在使用的那个并不是等同于ODE公式的离散事件(至少我认为)。
for each individual:
    if individual.compartment != infected:
        continue
    for each neighbor of the individual:
        neighbor.nummsgs += 1
    if (random number says so):
        individual.compartment = recovered

for each individual:
    if individual.compartment != susceptible:
        continue
    maybe (depending on random number & nummsgs):
        individual.compartment = infected

for each individual:
    individual.nummsgs = 0