我有一个环形网络,其中代理应该根据其迭代的左侧和右侧最接近的“邻居伙伴”按顺序进行交互。
我需要为每个代理 i 创建一个向量(即它们的“交互序列”),例如 1:100。
对于 i = 1,向量应如下所示: c(2,100,3,99,4,98,...) 意味着 i=1 最接近 2,然后是 100,然后是 3,然后是 99 ...
对于 i = 2,向量应如下所示: c(1,3,100,4,99,...) 意味着 i=2 最接近 1,然后是 3,然后是 100,然后是 4 ...
对于 i = 50,向量应如下所示: c(49,51,48,52,47,...) 意味着 i=50 最接近 49,然后是 51,然后是 48,然后是 52 ...
[...]
对于 i = 100,向量应如下所示: c(99,1,98,2,97,...) 意味着 i=100 最接近 99,然后是 1,然后是 100,然后是 4 ...
不均匀的代理(即 i %% 2 == 1)从最右边的邻居开始,然后是最左边的邻居,依此类推。 即使代理(即 i %% 2 == 0)也从最左边的邻居开始,然后是最右边的邻居,依此类推。
我努力并需要帮助寻找一种有效的算法,可以为给定的 i 生成向量(或所有向量的矩阵),最好避免循环。
foo <- function(i, x) {
if (i == 1L) x <- x[-1L]
else x <- x[c((i+1):length(x), 1L:(i-1L))]
# Right should come before left
x[order(pmin(abs(x - i), abs(x - n - i)))]
}
x <- 1:100
foo(1, x)
# [1] 2 100 3 99 4 98 5 ...