简单的背包类型,使用R中的GA包对1个约束进行二进制优化。
使用已知的总种群大小的5%的最优解,总是返回0个解集。由于某种原因,搜索空间似乎从未包含稀疏解(例如二进制10000000000000000000、01000000000000000000)。
此处,当最大成本设置为5时,最优解决方案是选择1项,但是除非我们提高最大成本约束以使总人口的约30%达到最优,否则始终返回0集。
library(GA)
options(scipen = 999)
set.seed(348821)
n <- 20
optim_n <- 1
a <- data.frame(item = c(1:n),
cost = c(rep(5, optim_n), sample(1000:5000, n - optim_n)),
value = sample(1:500, n))
a <- a[order(a$cost), ]
a$cum.cost <- cumsum(a$cost)
head(a)
item cost value cum.cost
1 1 5 208 5
19 19 1087 48 1092
20 20 1472 179 2564
5 5 1521 449 4085
15 15 1801 102 5886
13 13 2192 41 8078
# RHS Constraint
max_cost <- 5
# Fitness Function
fit_func <- function(x) {
iter_cost <- x %*% a$cost
iter_value <- x %*% a$value
if(iter_cost > max_cost) {
return(0)
} else {
return(iter_value)
}
}
# Run
select <- ga(type = "binary",
nBits = nrow(a),
maxiter = 1000,
run = 250,
fitness = fit_func,
popSize = 1000)
# Print Results
cat("\n","Fitness Value: ", select@fitnessValue, "\n",
"Items Selected: ", if(select@fitnessValue == 0) { 0 } else { sum(select@solution) }, "\n",
"Min Optimal Selection:", nrow(a[a$cum.cost <= max_cost, ]))
结果:
Fitness Value: 0
Items Selected: 0
Min Optimal Selection: 1
我尝试了足够多的参数组合,包括pmutation,pcrossover,popSize和运行迭代,但是没有运气。我还尝试了genalg :: rbga.bin()函数,结果相同。
无论如何,当最优解决方案稀疏时,我将无法返回任何解决方案。
我认为这是我的设计,适应度函数或与随机遗传算法有关。任何帮助是极大的赞赏。