我正在尝试模拟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之间随机抽取的数字大于.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值必须大于没有做任何事情,但我没有收到错误信息。
谁能告诉我出了什么问题?任何帮助将不胜感激!!
答案 0 :(得分:2)
不确定这是否是您唯一的问题,但是ReplacePart对P []返回的结果进行操作,但不会影响函数本身, 即
f[0]={1,2,3}
ReplacePart[f[0],2->42] -> {1,42,3}
但你仍然得到:
f[0] -> {1,2,3}
另外
{_} ->
告诉ReplacePart替换每个项目。我不确定你的意图是什么......
第一个化身i->
似乎有道理..