我正在尝试在R
中提出一种算法,以根据n
个(全部为正整数)输入参数的向量X
生成n
个序列,而最小化所有序列元素的间隔I
中的重叠。所有ub
以及生成的序列都有上限x ⋹ X
。
示例:
ub = 100
n = 2
# initialise X with random values
X = sample(1:ub, n, replace=F)
# [1] 20 30
# generate sequences
S = sapply(X, function(x) cumsum(rep(x,floor(ub/x))))
# [[1]]
# [1] 20 40 60 80 100
# [[2]]
# [1] 30 60 90
我目前实现了一个函数eval.f
,该函数从S
生成X
,然后遍历s
中的所有序列S
以检查其中有多少个元素s
在I
中其他序列的所有其他元素的间隔S
中:
ub = 100
n = 2
X = sample(1:ub, n, replace=F)
I=10
eval.f<-function(X,
I,
ub){
S = sapply(X, function(x) cumsum(rep(x,floor(ub/x))))
return(sum(unlist(sapply(1:length(S), function(y){
sapply(1:y, function(z){
if(y!=z){
sapply(S[[y]],function(w) abs(w-S[[z]]))
}
})
}))<I))
}
对于I = 10
,上面的示例的重叠总数为5。但是,我想将其缩放为更大的n
值。目前,我实现了一个具有10.000次迭代的简单循环,并为X
随机采样了新值,每次迭代都计算所得序列的重叠次数,并保留X
重叠次数最少的>
# initialize
iterations<-10000
solutions<-X
overlaps<-eval.f(X,I,ub)
i<-1
while(i<iterations){
new_X<-sample(1:ub, n, replace=F)
new_overlaps<-eval.f(new_X,
I,
ub)
if (new_overlaps<overlaps){
overlaps<-new_overlaps
solutions<-new_X
}
if(overlaps==0) break
i<-i+1
}
现在我的问题:由于我想最小化s
中S
中I
中所有序列{{1}}的重叠总数,我的猜测是可以使用非线性编程来实现,但是我不确定R中的公式和实现。非常感谢任何输入!