以最低分数查找列表排列

时间:2014-12-08 20:35:10

标签: r performance optimization permutation vectorization

我需要将一个函数应用于列表的所有排列,并得到结果最低的那个。

目前我有类似的东西(它使用library(combinat)):

scorePermutation <- function(permutation) {
  acc <- 0
  p <- 1
  for (x in permutation) {
    #very simplified version of the orginal for block
    acc <- acc + x/p
    p <- p*1.02^(x/p)
  }
  names(acc) <- paste(permutation, collapse=",")
  return (acc)
}

minScore <- function(items) {
  scores <- permn(items, scorePermutation)
  return (sort(unlist(scores))[1])
}

我改变了scorePermutation函数逻辑,以使问题更简单,我知道代码没有多大意义。

我正在尝试提高性能,特别是我试图以矢量化的方式进行permn(items, scorePermutation),但任何提示都会有所帮助。

更新

目前用法如下:

minScore(c(15,8,42,16,4,23))
#4,8,15,16,23,42 
#       62.42506 

但我只需要最低得分排列(例如“4,8,15,16,23,42”)

更新2

以下是原始逻辑的代码:

minScore <- function(items, p) {
  f = function(x) scorePermutation(x, p)
  scores <- permn(items, f)
  return (sort(unlist(scores))[1])
}

scorePermutation <- function(permutation, startp) {
  acc <- 0
  p <- startp
  for (x in permutation) {
    acc <- acc + x/p
    p <- updateP(x, p) 
  }
  names(acc) <- paste(permutation,collapse=",")
  return (acc)
}

updateP = function(value, p) {
  wh = ceiling(value/p)/ 60
  cd = wh %/% 24
  rh = wh %% 24
  ldsh = pmin(10, rh)
  lduh = pmax(0, rh-10)
  shf = 1.02^(cd*10+ldsh)
  uhf = 0.9 ^(cd*14+lduh)
  np = p*shf*uhf
  np = pmax(np, 0.25)
  np = pmin(np, 4)  
  return (np)    
}

0 个答案:

没有答案