2016-11-24 122 views
0

所以我试图编写一个代码来模拟捕食者和猎物数量很少的捕食者和猎物情况。随着时间的推移,捕食者的数量会不断增加,而猎物的数量会减少,直到猎物数量太少而无法维持捕食者的数量。捕食者人口消失,然后猎物种群能够重新繁殖。当两个种群中的一个达到0时,仿真应该停止,在这种情况下,捕食者群体将随着仿真时间划分两个群体,直到它停止。这是到目前为止我的代码:Python:Loop没有给出想要的结果

import matplotlib.pyplot as plt 

def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate): 
    preyCounts = [] 
    predatorCounts = [] 
    predatorI = initialPred 
    preyI = initialPrey 
    predator = predatorI 
    prey = preyI 



    while predator > 0 and prey > 0: 

      predator = predatorI * (1 - predShrink + predFedBirthRate * preyI) 
      prey = preyI * (1 + preyGrowth - predationRate * predatorI) 
      predatorCounts.append(predator) 
      preyCounts.append(prey) 
      predatorI = predator 
      preyI = prey 


    plt.plot(predatorCounts, 'r', preyCounts, 'b') 
    plt.show()  

    return preyCounts, predatorCounts 

simulate(50,1000,0.25,0.01,0.05,0.00002) 

它的输出是该 :enter image description here

但它应该出来是这样的: enter image description here

有人能帮助我吗?

*也除了这个,每当我把我的绘图代码的功能以外的功能线后的值里面是这样的:

simulate(50,1000,0.25,0.01,0.05,0.00002) 
plt.plot(predatorCounts, 'r', preyCounts, 'b') 
plt.show() 

它不会从绘制函数的值,并说predatorCountspreyCounts未定义。

+0

我没有看到在while循环中更新'prey'的代码?这是所需的行为? PS:我对“matplotlib”一无所知 –

+0

你可以在while循环的顶部放一个print语句来看看'''predatorI'''和'''preyI'''发生了什么 - 这可能会给你一个线索。 – wwii

+0

一个问题是,你的条件不起作用。有时候你的条件对待0.4只猎物是有效的,但我想象一只兔子的十分之四已经死了。 – wwii

回答

1

如果我与起始群体使用int()截断的人群初始化绘图数据,我给你说,你应该看到的情节:

import matplotlib.pyplot as plt 

def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate): 
    preyCounts = [initialPrey] 
    predatorCounts = [initialPred] 
    predator = initialPred 
    prey = initialPrey 

    while predator > 0 and prey > 0: 
     predatorScaleFactor = 1.0 - predShrink + predFedBirthRate * prey 
     preyScaleFactor = 1.0 + preyGrowth - predationRate * predator 
     predator = int(predator * predatorScaleFactor) 
     prey = int(prey * preyScaleFactor) 
     predatorCounts.append(predator) 
     preyCounts.append(prey) 

    plt.plot(predatorCounts, 'r', preyCounts, 'b') 
    plt.show() 

    return preyCounts, predatorCounts 

simulate(50, 1000, 0.25, 0.01, 0.05, 0.00002) 
+0

我刚刚有1个问题,你怎么做'preyCounts = [initialPrey]'和'predatorCounts = [initialPred]' – Langfao

+0

哦,其实没关系,我明白为什么它那里,谢谢你的帮助。 – Langfao

1

所以你看着你的过程/计算,它看起来是正确的,但你看看你的结果,这很有趣。当您打印计数您注意的一件事......

print predatorI, preyI 

是有捕食者和猎物其中,在现实世界中,没有意义的分数。你试图模拟现实世界。您所有的费率参数可能基于整体事物,而不是分数事物。所以你决定,有不能在你的模拟小数众生,你只应对人口增长的计算后,整个人类(整数)... enter image description here


你的函数返回的计数向量。如果要将绘图语句移到该函数之外,则需要将该函数的返回值分配给一个名称,然后将其用于绘图。

prey, predator, = simulate(50,1000,0.25,0.01,0.05,0.00002) 
plt.plot(predator, 'r', prey, 'b') 
plt.show() 

这里有一些东西从文档阅读有关的名称,范围,命名空间 https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects https://docs.python.org/3/reference/executionmodel.html#naming-and-binding

您可能需要为您使用的语言更定期阅读。

+0

那么我是否应该在将它们计算为整数后立即将当前的捕食者和猎物值舍入?另外,在绘制函数之外移动绘图语句时,我想我已经返回了用于绘图的变量的名称。 – Langfao

+0

@Langfao,1.6老虎会轮到两只老虎,我仍然会说,如果你有一个calc后的1.6个生命,你真的只有1个。 – wwii

+0

所以这会成为现在由while循环设置的标准问题? – Langfao

相关问题