1

我正在尝试在 Mathematica 中模拟 a 和 b 两部分的突变。我通过以下方式输入遗传漂移(完全随机元素):

p[sim_, 0] = Join[Table[a, {15}], Table[b, {15}]]
p[sim_, t_] := p[sim, t] = RandomChoice[p[sim, t - 1], 30]

这创建了两个由 a 和 b 部分随机组成的表。

我想添加突变,以给定的概率发生,所以我尝试将以下内容附加到我上面的代码中

Do[ReplacePart[p, i -> b] && If[RandomReal[] > .2, t], {t, 1, 15}]

因此,如果在 0 和 1 之间随机抽取的数字大于 0.2,则它应该替换原始两个表中的元素 i。

所以我的最终代码看起来像

p[sim_, 0] = Join[Table[a, {15}], Table[b, {15}]]
p[sim_, t_] := p[sim, t] = RandomChoice[p[sim, t - 1], 30];
Do[If[RandomReal[] < .2, 
  ReplacePart[p[sim, t], {_} -> RandomChoice[{a, b}]], 
  p[sim, t]], {t, 1, 15}]

但我可以说它不起作用,因为更改 RandomReal 的值必须大于不做任何事情,但我没有收到错误消息。

谁能告诉我出了什么问题?任何帮助将不胜感激!!

4

1 回答 1

2

不确定这是否是您唯一的问题,但 ReplacePart 对 P[] 返回的结果进行操作,但不影响函数本身,即。

f[0]={1,2,3}
ReplacePart[f[0],2->42] -> {1,42,3}

但你仍然得到:

f[0] -> {1,2,3}

{_} -> 

告诉 ReplacePart 替换每个项目。我不确定你的意图是什么......第一个化身i->似乎是有道理的......

于 2013-01-17T15:53:14.433 回答