交配

準拠: industrialcraft-2-2.2.517-experimental

概要

IC2のCropが持つシステムの目玉の一つであり、交配用支柱に一定以上に成長した作物が複数隣接している場合に交配用支柱が作物で覆われるというものである。

交配の元となる作物のことを、本記事群では下地と呼ぶ。

処理の全貌(TileEntityCrop#tick)

交配のきっかけとなる記述は全コード内で唯一、CropTickにおいて環境値のキャッシュを更新したあとに存在する。

支柱が交配を試みる(TileEntityCrop#attemptCrossing)条件は作物が空の支柱であり(id < 0)、交配用支柱である(upgraded)場合である。


交配とは直接関係ない処理であるが、支柱が交配用支柱でない若しくは交配が失敗した場合、1%の確率で且つ除草剤がない(あった場合はこの際ついでに除草剤の残量を5減少させる)場合「雑草にする」、そうでない場合に10%の確率でWeedEXの残量を1減らすという空の支柱に雑草をはやす処理を行う。

この処理は除草剤を十分にかけていれば雑草化の可能性がないうえ、WeedEXが減らされる量も5や1と小さい。しかしWeedEXは時間による減少がないため、WeedEXの定期散布を行っておらず、Resistanceを強化し雑草の発生を抑えたうえで、しばらくチャンクをアンロードしない場合は脅威となり得る場合がある。

この雑草の出現はResistanceによって抑制することはできない(作物のスロットがそもそもカラッポなため)。

交配の試み(TileEntityCrop#attemptCrossing)

交配用支柱(TileEntityCrop)では、以下のようなアルゴリズムで交配を試みる。

66.66%の確率で無条件で失敗する。
隣接支柱に交配に参加できるかを問いかけ(TileEntityCrop#askCropJoinCross)、参加できる場合は参加支柱リストに追加する。
参加支柱が1以下なら、交配は失敗する

(この時点で交配成功が確定する)
要素数256の整数配列ratios(比重値)を作る。
雑草を除く全作物種のうち、この支柱で成長可能(CropCard#canGrow)な作物種それぞれについて、
  
すべての参加支柱との交配レートを計算し、ratiosに加算する。
ratiosの比重に基づいた確率でランダムに作物種を選択する。

交配用の支柱を消去し、持っている作物を選択された作物種にする。サイズは1で、GGR値は次の通りである
  
GGRそれぞれについて、すべての参加支柱での平均値(整数型)を計算する。この際int型除算により小数部が切り捨てられる。
  
この値に、「-支柱の参加数」から「支柱の参加数」までの乱数(4つ参加なら-4~4)を加算する。
  
0~31の範囲からはみ出た場合は範囲に収まるように丸める。

交配の際のGGR値の増減については、大きな変化量が欲しい場合は周囲4マスに作物を並べるとよい(作物側で高くても30%の確率でしか参加できないため、4つの作物が交配に参加する確率は9%程度になる)。逆に、小さな変化量が欲しい場合は常に2つの作物で交配を行うとよい(-2から+2の変化量)。

トリビア

  • GGR値はそれぞれ独立しており、他の値に成長が阻害や促進されることはない。
  • GGR値の異なる作物を交配させた場合、確率で片方の遺伝子だけを強く引き継ぐなどではなく、単に平均される
  • GGR値は平均の計算の際に小数点以下を切り捨てされる。たとえばGainが24と23の作物の交配の場合、21から25までの範囲でGain値が出現する。
  • Growth20の作物で4隣接を取り囲むと、非常に低い確率でGrowth24の作物が発生する可能性がある。逆に、取り囲む作物が2つならGrowth21同士、もしくはGrowth21と22(平均値は21.5であるが、切り捨てにより21扱いとなる)の作物を設置してもよい。

交配に参加できるかどうか(TileEntityCrop#askCropJoinCross)

座標を与えると、交配に参加できると判断した場合にリストに追加する。判断基準は、以下のようなものである。

座標のTileEntityを調べ、支柱(TileEntityCrop)でない場合参加不能である
その支柱が作物なし若しくは雑草であった場合(id <= 0)参加不能である
その支柱の作物種が、対象の交配用支柱の座標において成長可能(CropCard#canGrow)でない場合参加不能である
その支柱の作物が、交配可能でない(CropCard#canCross)場合交配不能である

base値(0~6)を計算する。0から19の整数乱数値がbase値よりも小さい場合なら、参加可能である

ここで、処理が①を通過する場合、その支柱は交配の準備ができているということとする。

base値(TileEntityCrop#askCropJoinCross)

交配参加の可能性がある作物が与えられたときに、交配参加の確率を決める要素となる値である。以下のアルゴリズムに従って値を決定する。

baseの初期値は4である。
Growthが16以上であった場合、baseに1加える。
Growthが30以上であった場合、baseに1加える。
Resistanceが28以上であった場合、27を超過した分(最大で4)をbaseに減算する。

base値はGGR値により0から6までの値を取る(0以下は参加の可能性が0%になる。最大の6では30%)。

この値は成長に関するbase値とは何も関係は無い。また、単にbase値と言った場合、あちらを指す。

交配成功確率

a, b, c, dをそれぞれ隣接する4マスの支柱が交配に参加できるかどうかとすると、交配が実際に成立するか否かをカルノー図みたいに書くと、

  a=, b=真 a=真, b=偽 a=偽, b=偽 a=偽, b=真
c=真, d=真
c=真, d=偽
c=偽, d=偽
c=偽, d=真

となる。ここで、A, B, C, Dを各隣接マスの支柱が交配に参加する確率base / 20)とおくと、それぞれのケースの発生確率は、

  a=, b=真 a=真, b=偽 a=偽, b=偽 a=偽, b=真
c=真, d=真 ABCD A(1-B)CD (1-A)(1-B)CD (1-A)BCD
c=真, d=偽 ABC(1-D) A(1-B)C(1-D) (1-A)(1-B)C(1-D) (1-A)BC(1-D)
c=偽, d=偽 AB(1-C)(1-D) A(1-B)(1-C)(1-D) (1-A)(1-B)(1-C)(1-D) (1-A)B(1-C)(1-D)
c=偽, d=真 AB(1-C)D A(1-B)(1-C)D (1-A)(1-B)(1-C)D (1-A)B(1-C)D

となる。すなわち、交配が成立する確率は、

1 - { A(1-B)(1-C)(1-D) + (1-A)B(1-C)(1-D) + (1-A)(1-B)C(1-D) + (1-A)(1-B)(1-C)D + (1-A)(1-B)(1-C)(1-D) }

となる。

隣接した交配の準備ができている支柱の個数に応じて、この式は次のように変わり、

0個 A=B=C=D=0: 0
1個 B=C=D=0: 1 - { A + (1-A) } = 0
2個 C=D=0: 1 - { A(1-B) + (1-A)B + (1-A)(1-B) } = AB
3個 D=0: 1 - { A(1-B)(1-C) + (1-A)B(1-C) + (1-A)(1-B)C + (1-A)(1-B)(1-C) }
       = ABC + AB(1-C)
        + A(1-B)C + (1-A)BC
4個 : 1 - { A(1-B)(1-C)(1-D) + (1-A)B(1-C)(1-D) + (1-A)(1-B)C(1-D) + (1-A)(1-B)(1-C)D + (1-A)(1-B)(1-C)(1-D) }
    = ABCD + AB(1-C)D + A(1-B)CD + (1-A)BCD + ABC(1-D) + AB(1-C)(1-D) + A(1-B)C(1-D) + (1-A)BC(1-D)
     + A(1-B)(1-C)D + (1-A)B(1-C)D + (1-A)(1-B
)CD

のようになる。

仮に非0の変数が同じ値だった場合、この式は

2個: A^2
3個: A^3 + 3*A^2(1-A)
4個: 
A^4 + 4*A^3(1-A) + 6*A^2(1-A)^2

となる。このbase値がxで、n個の交配準備のできた支柱と隣接する支柱の交配が成功する確率yの関数をグラフに表示すると以下のようになる。

交配確率,base,2隣接,3隣接,4隣接
0.00,0,0.0000,0.0000,0.0000
0.05,1,0.0025,0.0073,0.0140
0.10,2,0.0100,0.0280,0.0523
0.15,3,0.0225,0.0608,0.1095
0.20,4,0.0400,0.1040,0.1808
0.25,5,0.0625,0.1563,0.2617
0.30,6,0.0900,0.2160,0.3483

このように、手早く交配作業を終了させたい場合は、4隣接の全てを作物で埋めるのが望ましい。4隣接で行う交配は2隣接で行う交配の3倍以上の成功率となる。

また、実際の交配成功率は交配側のアルゴリズムにより無条件で1/3倍になるので、256tick毎の交配成功率は上のグラフの1/3倍となる。

最終更新:2014年10月28日 04:32
添付ファイル