2016-11-24 78 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

相關問題