我一直在尝试在R中的n循环算法上实现随机游走。
n循环是指整数Zn或模n的集合。基本上,它是来自Levin,Peres和Wilmer的书“马尔可夫链和混合时间”的例子5.3.1。目的如下:考虑两个链模拟Zn上的两个粒子X和Y的运动,起点X1和Y1。通过翻转一个公平的硬币,我们决定哪个粒子会移动(粒子不能同时移动,除非它们已经耦合);方向是由另一个公平的硬币翻转决定的。 一旦两个粒子碰撞,它们就会在此后一起移动。它是实施CFTP算法的研究项目的一部分,因此链的长度应该具有预定义的值,比如T.
代码未运行,并显示错误消息。错误是“找不到对象'res'”。但是,我之前已将“res”定义为存储函数输出的列表。为什么会发生这种情况?如何解决?
我有两个脚本:在第一个脚本中,代码被拆分为较小的辅助函数;第二个可能比较麻烦,因为我试图将所有辅助函数放在一个函数中。 任何帮助都感激不尽。
这是剧本2.
# X1 - initial state of chain X
# Y1 - initial state of chain Y
# T - "length" of a chain, number of steps the chains will run for.
# n - length of the n-cycle, i.e., Zn.
Main_Function <- function (X1 = 8, Y1 = 4 , T = 20, n = 6){
X <- rep( X1, T) %% n # X, Y and res will store the results
Y <- rep( Y1, T) %% n
res <- list(X,Y) # Here I defined the object res. Later on R encounters an error "object 'res' not found".
ps <- TakeOneStep() # TakeOneStep is a function defined below
return(ps)
}
TakeOneStep <- function(){
incr_same <- sample(c(-1, 0, 1), size = 1, prob = c(1/4, 1/2, 1/4)) #direction of the particles after they have coupled
incr_dif <- sample(c(-1,1), size = 1, prob = c(1/2, 1/2)) # direction of the particles before coupling occurred.
choice <- runif(T) # determines which chain moves, before coupling occurred.
for(t in 2:T){
if(res[[1]][t-1]%%n == res[[2]][t-1]%%n){
res[[1]][t] <- (res[[1]][t-1] + incr_same) %% n
res[[2]][t] <- (res[[2]][t-1] + incr_same) %% n
}else{ if(choice[t] < 0.5) {
res[[1]][t] <- (res[[1]][t-1] + incr_dif) %% n
}else{res[[2]][t] <- (res[[2]][t-1] + incr_dif)%%n}
}
}
return(res)
}