我最近一直在做一项作业,并且一直被困在一个超出范围误差的列表索引中。目的是模拟和操纵病毒。比如"CDTD","FDFD“。清单中的内容可以复制、删除、更改和添加。这取决于几个概率,比如mortalityProb是一个浮点数,它是一个元素被淘汰的概率,mutationProb是一个浮点数,它是一个元素发生变化/变异的概率,maxProductionProb是限制复制大小的maxProductionProb,maxPopulation是元素最大数量的整数。
我增加了一个检查,maxPopulation不应该超过病毒的长度,但它没有工作。
主函数(模拟)
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断言通过所有其他检查,但它不适用于以下断言:
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:
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的指导方针。如果您有任何意见,请告诉我!
发布于 2020-10-18 17:43:36
当产生病毒时,它是零索引。因此,您正在将viruses[0]生成为viruses[99]。viruses[100]不存在。
我真的不明白,为什么你想要基于时间步骤t的病毒?也许你想迭代你的病毒,而不是时间步骤?
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不应该超过病毒的长度,但它没有工作。
这张支票可能是:
if len(population_sizes) > len(viruses):
breakhttps://stackoverflow.com/questions/64416349
复制相似问题