I have such problem: i need to find best combination of items which will not exceed max weight. For this problem i used genetic algorithm.
Here is my data
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)
Here is my cost function:
max_weight = 10
fitness_function <- function(x){
current_weight <- x %*% dataset$Weight
if ( current_weight > max_weight){
return(0)
} else {
return( -1* current_weight)
}
}
Then i tried ga from two packages: genalg
and GA
genalg
ga_genalg <- rbga.bin(size = 11,
popSize = 100,
mutationChance = .1,
evalFunc = fitness_function)
Okay, here is result:
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
I checked best solution, looks nice:
genalg_best_solution = c(0,1,1,0,0,0,0,1,0,0,1)
dataset$Weight %*% genalg_best_solution
[,1]
[1,] 9.993641
PS. Anybody knows how to get this best solution vector without typing and regular expressions?
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
Solutions are matrix with 73 rows. Also ga_GA@bestSol
returns list()
Where is my best solution in this package? Or i need to check all 73 rows and find best(I've tried and got 73 zeros)?
PPS. Second question solution: GA maximize function and genalg minimize function =/. Anybody knows how to extract best solution from genalg package?
There's lots of questions here. My opinion is that GA provides as easier output for what you want: the best solution and the fitness score.
You're right that GA maximized fitness score, while genalg minimizes - I created a second fitness function that does not return the fitness value multiplied by -1. This results in the same solution for both.
Also, I don't get the dimensions that you present for the output of ga(). In my case, this is simply a single row with the 11 binary values: