生物の遺伝をモデルにした因子の存在割合の変化
概要
C#を用い、遺伝による因子の存在割合の変化をシミュレーションしました。
今回は因子Aと因子Bを用い、Aが優性遺伝Bが劣性遺伝としてシミュレーションしました。
これががどこまで生物の進化のモデルとして正しいか分かりませんが、面白い結果になりました。
ゲームにおいて、プレイヤーの行動のクセに応じ敵の挙動を変化させる機能の実装などに応用できると思います。
詳しくはこちら
解析結果
因子の存在割合が徐々に変化していくのではなく、ある世代から急激に変化することが分かりました。
また優性遺伝か劣性遺伝かでどのタイミングで急激な存在比の変化が起こるか変わることも分かりました。
各因子の存在比を縦軸に、世代を横軸にプロットしたもの。
因子Aが生存に有利な時(左)と因子Bが生存に有利な時(右)で比較している。
コード (C#)
因子の存在割合を求めるプログラムです
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Evolution
{
internal class Simurator
{
double pA, pB;
double rateA, rateB;
double stopRate;
public enum E_Gene
{
A,
B
}
E_Gene gene;
public bool NextGeneration()//次の世代の各因子の存在割合を求める
{
double px;
if(gene == E_Gene.A)
{
px = pA;
}else
{
px=pB;
}
if ( px>=stopRate)
{
return false;
}
double nextPA, nextPB;
double nextGene = (rateA * (Math.Pow(pA, 2) + (2*pA * pB)) + rateB * (Math.Pow(pB, 2))) * 2;
nextPA = (rateA * (2 * (Math.Pow(pA, 2)) + ( 2*pA * pB)))/nextGene;
nextPB = 1 - nextPA;
pA = nextPA;
pB= nextPB;
return true;
}
public void DrawInitialConditions(StreamWriter sw)
{
sw.WriteLine("----因子A----\n" + "存在比" + pA.ToString() + "\n" + "生存率" + rateA.ToString() + "\n");
sw.WriteLine("----因子B----\n" + "存在比" + pB.ToString() + "\n" + "生存率" + rateB.ToString() + "\n");
}
public double PA
{
get { return pA; }
set { pA = value; }
}
public double PB
{
get { return pB; }
set { pB = value; }
}
public double RateA
{
set {
rateA = value;
}
}
public double RateB
{
set { rateB = value; }
}
public double StopRate
{
set { stopRate = value; }
}
public E_Gene Gene
{
set { gene = value; }
}
}
}