2

年齢に応じてウサギの繁殖力を変えるために、フィボナッチ死のウサギのpythonコードを変更しようとしています。例を挙げましょう。

私のウサギは 3 か月で成熟し、6 か月で死亡します。繁殖期の4か月の間に、年齢に応じて異なる数の子孫を産みます。生後3ヶ月で2組、4ヶ月で3組というように6ヶ月まで続きます。うさぎの各ペアは、雌と雄によって形成されます。結局、個人の数ではなくペアの数を数えます。誕生から死までの繁殖力の値:

fecundity = [0, 0, 2, 3, 3, 1]

私が使用している python コード ( https://github.com/jschendel/Rosalind/blob/master/011_FIBD.py ) は次のとおりです。

n = 12
m = 6
#n = months to run
#m = how many months the rabbits live

# Populate the initial rabbits.
Rabbits = [1]+[0]*(m-1)

# Calculate the new rabbits (bunnies), in a given month.
# Start at use range(1,n) since our initial population is 0 month old.
for month in range(1, n):
    Bunnies = 0
    # Get the number of Rabbits able to old enough to give birth.
    for j in range(1,m):
        Bunnies += Rabbits[(month-j-1)%m]
    # Bunnies replace the old rabbits who died.
    Rabbits[(month)%m] = Bunnies

# Total rabbits is the sum of the living rabbits.
Total_Rabbits = sum(Rabbits)

繁殖力のバリエーションを実装する方法がわかりません。どんな助けでも大歓迎です!

ありがとう、ヴァレンティーナ

4

2 に答える 2

2

ウサギが死んだときに停止するように繁殖力配列を定義します。

fecundity = [0, 0, 2, 3, 3, 1]

うさぎが生後7ヶ月で死ぬことを意味します。その後、再帰関数を記述して、特定のステップでの new_borns の数を計算します。ステップ 0 の場合は 1 ペア、ステップ < 0 の場合は 0 ペアとしてステップを初期化します。もちろん、ケースに合わせて変更できます。(私がステップと呼んでいるのは、時間の 1 単位、ここでは月です)。関数は次のとおりです。

def new_borns(step):
    if step < 0:
        return 0
    if step == 0:
        return 1
    nb_newborns = 0
    # We create a loop on living pairs
    for old_step in range(1, len(fecondity) +1):
        nb_newborns += (fecundity[old_step -1]) * new_borns(step - old_step)
    return nb_newborns

特定のステップの総人口は、前のステップの new_borns の合計であり、まだ生きています (つまり、繁殖力配列の長さ)。

def FIBD(step):
    population = 0
    for i in range(len(fecundity)):
        population += new_borns(step - i)
    return population

ステップ 7 でいくつのつがいがあるかを知るには、次のように呼び出しますFIBD(7)。うさぎが生きられる月数は、繁殖力配列の長さです。

もちろん、この再帰関数は非常に遅く、悪いものです。同じステップを複数回計算しないようにするには、キャッシュ システムが必要です。書き込むファイル全体は次のとおりです。

#!/usr/bin/env python

fecundity = [0, 0, 2, 3, 3, 1]
new_borns_cache = [1]

def new_borns(step):
    if step < 0:
        return 0
    try :
        return new_borns_cache[step]
    except IndexError:
        if step == 0:
            return 1
        sum = 0
        for old_step in range(1, len(fecundity) +1):
            sum += (fecundity[old_step -1]) * new_borns(step - old_step)
        return sum

def fibd(step):
    population = 0
    for i in range(len(fecundity)):
        population += new_borns(step - i)
    return population

それを使用するには、インポートして呼び出すだけですfibd(7)

于 2016-03-10T12:23:05.433 に答える