2

我有一个函数,我想基于整数向量进行优化。本质上,我试图通过更改输入的顺序来找到最大值。请参阅下面的示例。我的数据要大得多,所以我想知道是否有一个包比随机更改“vec”输入直到我找到最大值更好?任何帮助是极大的赞赏!

library(dplyr)
df<-data.frame(id=c(1:5),Revenue=sample(201:205))

#Start with random set of numbers to arrange dataframe
vec=c(1,2,5,3,4)

function_1<-function(vec){
  
  df$new_col <- vec 
  df<-df%>%arrange(new_col)
  df2 <-
    df %>% mutate(nearest = transform(., close_prev = id[apply(`diag<-`(m <-
                                                                          as.matrix(dist(id)), Inf) / upper.tri(m), 2, which.min)])) %>% as_tibble()
  df2 <- as_tibble(df2$nearest)
  df2 <-
    ##This is my penalty function which penalizes the revenue if any previous ##row id is less than 5 away from the row id.
    df2 %>% ungroup() %>% mutate(Penalty = ifelse(row_number() == 1, 1, if_else(abs(id- close_prev) > 1, 1, .6))) %>%
    mutate(Revenue_Penalized = Revenue * Penalty)
  df3<<-df2
  df2<- sum(df2$Revenue_Penalized)
  
print(df2)
  
}

function_1(df)

GenSA 尝试

x=GenSA(vec,function_1,lower=c(1,1,1,1,1),upper=c(5,5,5,5,5),control=list(maxit=100))

参数度量不是整数。此外,输出应使用“vec”的所有输入。我确定我做错了什么。

认为我找到了解决方案!谢谢。

ga(type='permutation',fitness=function_1,lower=1,upper=5, maxiter=5)
4

1 回答 1

1

以下使用 GA 包解决了我的问题。

ga(type='permutation',fitness=function_1,lower=1,upper=5)
于 2021-10-11T15:20:51.860 回答