2016-11-24 4 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() 

Он не печатает значения из функции и говорит predatorCounts и preyCounts не определены.

+0

Я не вижу код для обновления значения 'prey' во время цикла? Это желаемое поведение? PS: Я ничего не знаю о 'matplotlib' –

+0

Вы можете поместить оператор печати в начало цикла while, чтобы увидеть, что происходит с' '' 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 

, что есть фракции хищников и жертв, которые в реальном мире, не имеет смысла. Вы пытаетесь имитировать реальный мир. Все ваши параметры , вероятно, основаны на целых вещах, а не на дробных вещах. Таким образом, вы решили, что не может быть каких-либо дробные существа в симуляции и вы имеете дело только с целыми существами (INTS) после расчетов роста населения ... 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 тигры обойдутся до двух тигров, я все равно скажу, что если у вас есть 1.6 существа после calc, у вас действительно есть только 1. – wwii

+0

, так будет ли это проблемой с критериями, заданными циклом while, а теперь ? – Langfao

Смежные вопросы