r - R中的遗传算法

标签 r algorithm genetic-algorithm

我有这样的问题: 我需要找到不会超过最大重量的元素的最佳组合。 对于这个问题,我使用了遗传算法。

这是我的数据

dataset <- data.frame(name = paste0("x",1:11),
                  Weight = c(2.14083022,7.32592911,0.50945094,4.94405846,12.02631340,14.59102403,0.07583312,0.36318323,10.64413370,3.54882187,1.79507759),
                  stringsAsFactors = F)

这是我的成本函数:

max_weight = 10
fitness_function <- function(x){
   current_weight <- x %*% dataset$Weight
          if ( current_weight > max_weight){
      return(0)
   } else {
      return( -1* current_weight)
   }
}

然后我尝试了两个包中的 ga:genalgGA

生成

    ga_genalg <- rbga.bin(size = 11,
                          popSize = 100, 
                          mutationChance = .1,
                          evalFunc = fitness_function)

好的,这是结果:

cat(summary(ga_genalg))
GA Settings
  Type                  = binary chromosome
  Population size       = 100
  Number of Generations = 100
  Elitism               = 20
  Mutation Chance       = 0.1

Search Domain
  Var 1 = [,]
  Var 0 = [,]

GA Results
  Best Solution : 0 1 1 0 0 0 0 1 0 0 1 

我检查了最佳解决方案,看起来不错:

genalg_best_solution = c(0,1,1,0,0,0,0,1,0,0,1)
dataset$Weight %*% genalg_best_solution 
         [,1]
[1,] 9.993641

附言。有人知道如何在不输入和不使用正则表达式的情况下获得最佳解决方案向量吗?

GA

ga_GA <- ga(type = "binary", fitness = fitness_function, popSize = 100, pmutation = .1, nBits = 11)
ga_best_solution = ga_GA@solution 
dim(ga_best_solution)
[1] 73 11

解决方案是具有 73 行的矩阵。此外 ga_GA@bestSol 返回 list()

这个包中我最好的解决方案在哪里?或者我需要检查所有 73 行并找到最好的(我试过并得到 73 个零)?

聚苯硫醚。第二题解法:GA maximize function 和genalg minimize function =/. 有人知道如何从 genalg 包中提取最佳解决方案吗?

最佳答案

这里有很多问题。我的观点是 GA 可以为您提供更简单的输出:最佳解决方案和适应度分数。

你说得对,GA 最大化了适应度分数,而 genalg 最小化了 - 我创建了第二个适应度函数,它不返回乘以 -1 的适应度值。这导致两者的解决方案相同。

此外,我没有得到您为 ga() 的输出提供的维度。在我的例子中,这只是包含 11 个二进制值的一行:

library(GA)
library(genalg)

dataset <- data.frame(name = paste0("x",1:11),
  Weight = c(
    2.14083022,7.32592911,0.50945094,4.94405846,
    12.02631340,14.59102403,0.07583312,0.36318323,
    10.64413370,3.54882187,1.79507759
  ),
  stringsAsFactors = F
)

max_weight = 10


# genalg ------------------------------------------------------------------

# fitness function for genalg 
fitness_function <- function(x){
   current_weight <- x %*% dataset$Weight
   if ( current_weight > max_weight){
      return(0)
   } else {
      return(-current_weight)
   }
}


ga_genalg <- rbga.bin(size = 11,
  popSize = 100, 
  mutationChance = .1,
  evalFunc = fitness_function
)
tail(ga_genalg$best, 1) # best fitness
summary(ga_genalg, echo=TRUE)

plot(ga_genalg) # plot

# helper function from ?rbga.bin
monitor <- function(obj) {
    minEval = min(obj$evaluations);
    filter = obj$evaluations == minEval;
    bestObjectCount = sum(rep(1, obj$popSize)[filter]);
    # ok, deal with the situation that more than one object is best
    if (bestObjectCount > 1) {
        bestSolution = obj$population[filter,][1,];
    } else {
        bestSolution = obj$population[filter,];
    }
    outputBest = paste(obj$iter, " #selected=", sum(bestSolution),
                       " Best (Error=", minEval, "): ", sep="");
    for (var in 1:length(bestSolution)) {
        outputBest = paste(outputBest,
            bestSolution[var], " ",
            sep="");
    }
    outputBest = paste(outputBest, "\n", sep="");

    cat(outputBest);
}

monitor(ga_genalg)
# 100 #selected=4 Best (Error=-9.99364087): 0 1 1 0 0 0 0 1 0 0 1 



# GA ----------------------------------------------------------------------

# fitness function for GA (maximizes fitness)
fitness_function2 <- function(x){
   current_weight <- x %*% dataset$Weight
   if ( current_weight > max_weight){
      return(0)
   } else {
      return(current_weight)
   }
}

ga_GA <- ga(type = "binary", fitness = fitness_function2, popSize = 100, pmutation = .1, nBits = 11)
ga_GA@solution 
#     x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11
# [1,]  0  1  1  0  0  0  0  1  0   0   1
dim(ga_best_solution)
# [1]  1 11

ga_GA@fitnessValue
# [1] 9.993641

关于r - R中的遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41332331/

相关文章:

algorithm - 优化的 TSP 算法

c# - 从 table 上给一棵树浇水

带有全局常量变量的Python遗传优化多处理,如何加速?

artificial-intelligence - 人工智能领域有哪些令人印象深刻的算法或软件?

java - 不同模型(包括rf、glm)在h2o(R)中的堆叠

r - R中没有重复的组合

r - ggplot2:绘制具有不同截距但具有相同斜率的回归线

algorithm - 为什么链表的长度属性为 O(n)

algorithm - 遗传算法中交叉的效率

r - R中的特殊字符