我需要将一个函数应用于列表的所有排列,并得到结果最低的那个。
目前我有类似的东西(它使用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)
}