我正在尝试在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必须大于不做任何事情,但我没有收到错误消息。
有人能告诉我出了什么问题吗?任何帮助都将不胜感激!
发布于 2013-01-17 23:53:14
不确定这是否是您唯一的问题,但是ReplacePart对P[]返回的结果进行操作,但不影响函数本身,即。
f[0]={1,2,3}
ReplacePart[f[0],2->42] -> {1,42,3}但你仍然会得到:
f[0] -> {1,2,3}也是
{_} -> 通知ReplacePart替换每一项。我不知道你的意图是什么..。第一个化身i->似乎是有意义的..
https://stackoverflow.com/questions/14379323
复制相似问题