1
我有這樣的問題: 我需要找到不超過最大重量的項目的最佳組合。 對於這個問題我使用遺傳算法。遺傳算法在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)
}
}
然後我試圖從兩個包GA: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 <- 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包中提取最佳解決方案?
嗨馬克,偉大的答案在那裏!你能解釋'fitness_function2(x)'採用的參數'x'嗎? x是染色體嗎?在'ga()'函數中,爲什麼不需要傳遞'x'作爲參數,即'fitness = fitness_function2'? –
@jacky_learns_to_code - 是的,這是由nBits參數定義的基因向量(在本例中爲二進制)。 –
有沒有辦法控制基因的行爲,這樣我的nBits' = 5000,但是'1'的數量總是= 10? –