У меня есть такая проблема: Мне нужно найти лучшее сочетание предметов, которое не будет превышать максимальный вес. Для этой проблемы я использовал генетический алгоритм.Генетический алгоритм в R
Вот мои данные
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)
}
}
Тогда я попробовал га из двух пакетов: genalg
и GA
genalg
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
PS. Кто-нибудь знает, как получить этот лучший вектор решения без ввода и регулярных выражений?
Г.А.
ga_GA <- ga(type = "binary", fitness = fitness_function, popSize = 100, pmutation = .1, nBits = 11)
ga_best_solution = [email protected]
dim(ga_best_solution)
[1] 73 11
Решения матрица с 73 строк. Также [email protected]
list()
Где мое лучшее решение в этом пакете? Или мне нужно проверить все 73 строки и найти лучшее (я пробовал и получил 73 нулей)?
PPS. Второе решение вопроса: GA максимизирует функцию и genalg минимизирует функцию = /. Кто-нибудь знает, как извлечь лучшее решение из пакета genalg?
Привет, Марк, отличный ответ там! Можете ли вы объяснить аргумент 'x', который принимает' fitness_function2 (x) '? Является ли 'х' хромосомой? И в функции 'ga()', почему нет необходимости передавать 'x' в качестве аргумента, т. Е.' Fitness = fitness_function2'? –
@jacky_learns_to_code - да, это вектор генов (в данном случае двоичный), как определено аргументом nBits. –
есть способ контролировать поведение генов, так что мой 'nBits' = 5000, но число' 1' всегда = 10? –