生成序列,同时最大程度地减少重叠

时间:2018-11-08 10:39:02

标签: r optimization

我正在尝试在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以检查其中有多少个元素sI中其他序列的所有其他元素的间隔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
}

现在我的问题:由于我想最小化sSI中所有序列{{1}}的重叠总数,我的猜测是可以使用非线性编程来实现,但是我不确定R中的公式和实现。非常感谢任何输入!

0 个答案:

没有答案