如何让R语言中遗传算法(GA)输出整数结果?
整数约束下的遗传算法(GA)优化解决方案
问题说明
使用genalg包的rbga函数实现遗传算法时,输出为浮点数解,但需求是获取整数形式的最优解,同时需满足成本总和d < 150000的约束条件。
解决方案
rbga默认采用实数编码遗传算法,要实现整数解,核心是在算法的评估阶段强制将个体转换为整数并约束在变量的上下限范围内,确保算法始终在整数空间中搜索。具体修改如下:
1. 修改评估函数逻辑
在evaluate函数开头添加整数转换与边界约束步骤:
- 将输入的浮点数个体
X转换为整数 - 确保转换后的整数不超过预设的上下限,避免超出变量合法范围
2. 修改后的完整代码
library(genalg) evaluate <- function(X=c()) { # 定义每个变量的上下限 lower_bounds <- c(0, 0, 0, 0, 0, 0, 0, 0) upper_bounds <- c(44, 63, 63, 107, 125, 44, 115, 60) # 将浮点数个体转换为整数,并约束在合法范围内 X <- as.integer(round(X)) X <- pmax(X, lower_bounds) # 保证不低于下限 X <- pmin(X, upper_bounds) # 保证不高于上限 a <- c(3400, 2400, 2400, 1400, 1200, 3400, 1300, 2500) b <- c(5600, 4600, 5100, 2400, 2200, 3400, 1300, 2500) returnVal <- NA d <- sum(ifelse(X >= 4, a, b) * X) if (d < 150000) { returnVal <- sum(c(-200000, -130000, -145000, -75000, -55000, -210000, -150000, -20000) * X) } else { returnVal <- 10000000000000 # 约束违反时给予极大惩罚 } return(returnVal) } # 运行遗传算法 rbga.results <- rbga( lower = c(0,0,0,0,0,0,0,0), upper = c(44,63,63,107,125,44,115,60), popSize = 3000, evalFunc = evaluate, iters = 15, verbose = TRUE, mutationChance = 0.01 ) # 查看结果 summary(rbga.results, echo=TRUE)
3. 效果说明
修改后,遗传算法的每一代个体都会被强制转换为整数并限制在合法范围内,最终输出的最优解将是整数形式,同时保证成本d < 150000的约束被严格遵守。
内容的提问来源于stack exchange,提问作者Milena Godlewska
相关产品推荐
相关产品推荐

