我正在为我的遗传算法(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}
答案 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
}