R中的遗传算法优化未考虑稀疏解

时间:2019-03-08 20:19:10

标签: r optimization sparse-matrix genetic-algorithm knapsack-problem

简单的背包类型,使用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()函数,结果相同。

无论如何,当最优解决方案稀疏时,我将无法返回任何解决方案。

我认为这是我的设计,适应度函数或与随机遗传算法有关。任何帮助是极大的赞赏。

0 个答案:

没有答案