在R中声明2000个函数以与遗传算法一起使用

时间:2019-05-06 17:43:34

标签: r

我正在为我的遗传算法(GA)实现设置约束。我的健身功能包括许多功能。

我目前正在这样做:

c1 <- function(x) as.numeric(case_cnts[1, ] %*% x - work_hrs[1])
c2 <- function(x) as.numeric(case_cnts[2, ] %*% x - work_hrs[2])
c3 <- function(x) as.numeric(case_cnts[3, ] %*% x - work_hrs[3])
c4 <- function(x) as.numeric(case_cnts[4, ] %*% x - work_hrs[4])
c5 <- function(x) as.numeric(case_cnts[5, ] %*% x - work_hrs[5])
.
.
.
c2000 <- function(x) as.numeric(case_cnts[2000, ] %*% x - work_hrs[2000])

x是12x1矩阵,case_cnts是2000x12矩阵,而work_hrs是2000x1矩阵,但这对我的问题并不是很重要。

使用Excel和“ concatenate”函数输入声明c1所需的2000行-c2000并不会花费很长时间,但是这会花费很长的代码。我该如何循环?

我尝试过:

for (g in 1:2000)
 {
 paste0("c",g) = function(x) as.numeric(case_cnts[g,] %*% x - work_hrs[g])
 }

并收到此错误:

Error in paste0("c", g) = function(x) as.numeric(case_cnts[g, ] %*% x  
-  : target of assignment expands to non-language object

我还需要对下面的代码行做同样的事情

if (abs(c1(x)) >= 10000 ) {penalty1 = 1000} else if (abs(c1(x)) >= 1000 & abs(c1(x)) < 10000) {penalty1 = 100} else if (abs(c1(x)) >= 100 & abs(c1(x)) < 1000) {penalty1 = 10} else if (abs(c1(x)) > 0 & abs(c1(x)) < 100 ) {penalty1 = 2}

2 个答案:

答案 0 :(得分:1)

我们可能需要assign

for(i in 1:2000){
   assign(paste0("c", i), eval(parse(text = paste0("function(x) 
        as.numeric(case_cnts[", i, ",] %*% x - work_hrs[", i, "])"))))

    }

c1
#function(x) as.numeric(case_cnts[1,] %*% x - work_hrs[1])

答案 1 :(得分:1)

不清楚您在问什么,但正如@dylanjm所述,您可能做错了什么。根据您的问题,您想要做什么看起来像

penalties <- numeric(2000)

for (i in 1:2000)
{
  y <- as.numeric(case_cnts[i,] %*% x - work_hrs[i])

  if (abs(y) >= 10000) 
    penalties[i] = 1000
  else if (abs(y) >= 1000 & abs(y) < 10000) 
    penalties[i] = 100
  else if (abs(y) >= 100 & abs(y) < 1000) 
    penalties[i] = 10
  else if (abs(y) > 0 & abs(y) < 100 ) 
    penalties[i] = 2
}