はじめに
何を思ったのか、「ねずみ算的に増えるってどんな感じに増えるんやろ」と暇な正月休みに思い、
適当に条件与えて計算してみたので、その記録を書きます。
ただの記録です。
計算をする前に、「ねずみ算って数式で書けるかな?」って少々考えてみたのですが、僕にそんな頭はありませんでした。
Pythonでコード書いた方が早いわ、ってなりました。
結論
指数関数的に増える。
そりゃ前提条件やら初期条件にも依存しますが、オス・メス1匹ずつから1年間で2万匹弱まで増えた(笑)。
計算
仮定
ネットで調べて、下記のようなパラメータ、仮定を置きました。
- 「ハツカネズミ」に近いパラメータを想定
- 妊娠期間:3週間
- 1度の出産で生まれる子の数:6匹
- 性成熟期間(子が繁殖活動が可能になるまでの期間):8週間(2ヶ月)
- 計算条件
- 初期状態として、大人のオス・メスが1匹ずつから繁殖していく。
- 大人のオス・メスは必ずつがいを作り、1度の出産でオス3匹、メス3匹を産む。
- 子を産んだら、すぐにまたメスは妊娠するとする。
- 性成熟期間を過ごした子ネズミは、大人になって子を出産していく。
- 計算対象期間は1年間(4*12=48週間)。ネズミの寿命は1年以上とする(1年未満ではネズミは死なない)。
- 計算の簡略化のため、ねずみのオス・メスつがいの数を週単位で求め、ねずみの合計数を出す。
計算の流れ
大人のネズミつがいは妊娠週を、子供のネズミつがいは性成熟するまでの週を、それぞれ別々の配列で管理するようにしました。
1週間経つごとに、矢印の方向へセルの数が移動していきます。これを繰り返します。
コード
割と短く書けて良かった。
multiplying_like_rats.py
import numpy
# constants
number_of_birth_pairs = 3
period = 48 # weeks
pregnancy_weeks = 3
sexual_maturation_weeks = 8
# variables
parent_pairs = numpy.zeros(pregnancy_weeks, dtype=numpy.float)
child_pairs = numpy.zeros(sexual_maturation_weeks, dtype=numpy.float)
# Initial condition
parent_pairs[0] = 1
# calculate
for i in range(1, period+1):
child_pairs_to_be_born = parent_pairs[-1] * number_of_birth_pairs
child_pairs_to_be_parents = child_pairs[-1]
# update parent pairs
parent_pairs = numpy.roll(parent_pairs, 1)
parent_pairs[0] += child_pairs_to_be_parents
# update child pairs
child_pairs = numpy.roll(child_pairs, 1)
child_pairs[0] = child_pairs_to_be_born
rats_sum = (parent_pairs.sum() + child_pairs.sum()) * 2
print(f"{i} week(s): {rats_sum}")
結果
計算結果をグラフ化してみました。
まずは縦軸が線形の場合。
次に縦軸が対数の場合。
指数関数的に増えた。
感想
ねずみの繁殖力ってすごいんですねー。
(ゴブリンの場合はどうなんだろうか)