首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模拟中列出超出范围的范围

在模拟中列出超出范围的范围
EN

Stack Overflow用户
提问于 2020-10-18 17:36:51
回答 1查看 52关注 0票数 0

我最近一直在做一项作业,并且一直被困在一个超出范围误差的列表索引中。目的是模拟和操纵病毒。比如"CDTD","FDFD“。清单中的内容可以复制、删除、更改和添加。这取决于几个概率,比如mortalityProb是一个浮点数,它是一个元素被淘汰的概率,mutationProb是一个浮点数,它是一个元素发生变化/变异的概率,maxProductionProb是限制复制大小的maxProductionProb,maxPopulation是元素最大数量的整数。

我增加了一个检查,maxPopulation不应该超过病毒的长度,但它没有工作。

主函数(模拟)

代码语言:javascript
复制
import random
import string

def simulate(viruses, mortalityProb, mutationProb, maxReproductionProb, maxPopulation, timesteps = 500):
    population_sizes = []
    population_sizes.append(len(viruses))

    for t in range(timesteps):
        kill(viruses, mortalityProb)
        reproductionProb = reproductionProbability(viruses, maxReproductionProb, maxPopulation)

        if t >= 100:
            if isResistent(viruses[t]) == True:
                viruses = reproduce(viruses, mutationProb, reproductionProb)
                population_sizes.append(len(viruses[t]))
        else:
            viruses = reproduce(viruses, mutationProb, reproductionProb)
            population_sizes.append(len(viruses))

    return population_sizes

断言通过所有其他检查,但它不适用于以下断言:

代码语言:javascript
复制
viruses = [generateVirus(4) for _ in range(100)]
assert 501 == len(simulate(viruses, 1, 0, 0, 0))

sims = []
n = 100
for i in range(n):
    viruses = [generateVirus(4) for _ in range(100)]
    sims.append(simulate(viruses, 0.1, 0.1, 0.5, 100, timesteps = 1000)[-1])
average = sum(sims) / n

assert 25 < average < 30

运行此代码的 error 将导致列表索引超出范围错误:

if t >= 100和isResistent(virusest) == True and len(viruses) <= maxPopulation:

代码语言:javascript
复制
IndexError                                Traceback (most recent call last)
<ipython-input-23-ed2d36f37334> in <module>
      1 # test 1
      2 viruses = [generateVirus(4) for _ in range(100)]
----> 3 assert 501 == len(simulate(viruses, 1, 0, 0, 0))
      4 
      5 # test 2

<ipython-input-22-c07b7cec9184> in simulate(viruses, mortalityProb, mutationProb, maxReproductionProb, maxPopulation, timesteps)
      7         reproductionProb = reproductionProbability(viruses, maxReproductionProb, maxPopulation)
      8 
----> 9         if t >= 100 and isResistent(viruses[t]) == True and len(viruses) <= maxPopulation:
     10             print(viruses)
     11             viruses = reproduce(viruses, mutationProb, reproductionProb)

IndexError: list index out of range

谢谢你的帮助!我希望这个问题符合StackOverflow的指导方针。如果您有任何意见,请告诉我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-18 17:43:36

当产生病毒时,它是零索引。因此,您正在将viruses[0]生成为viruses[99]viruses[100]不存在。

我真的不明白,为什么你想要基于时间步骤t的病毒?也许你想迭代你的病毒,而不是时间步骤?

代码语言:javascript
复制
for v in range(len(viruses)-1):
    if isResistent(viruses[v]) == True:
            viruses = reproduce(viruses, mutationProb, reproductionProb)
            population_sizes.append(len(viruses[v]))
    else:
        viruses = reproduce(viruses, mutationProb, reproductionProb)
        population_sizes.append(len(viruses))

我已经添加了一个检查,maxPopulation不应该超过病毒的长度,但它没有工作。

这张支票可能是:

代码语言:javascript
复制
if len(population_sizes) > len(viruses):
    break
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64416349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档