基于R语言Genetic Algorithm的m1/m2/m3最优时间选择技术问询
问题定义
输入数据
年份指标及对应目标值:
| 年份 | x | y | z | 目标值(x+y-z) |
|---|---|---|---|---|
| 2022 | 23 | 54 | 65 | 12 |
| 2023 | 59 | 12 | 3 | 68 |
| 2024 | 28 | 65 | 2 | 91 |
约束与目标
- 约束:每个选项(m1/m2/m3)必须且仅选择一个年份,即每个选项对应唯一年份(年份可被多个选项重复选择)
- 目标:最大化所有选项对应年份的目标值之和
R语言GA包解决方案
核心思路
将每个选项的年份选择编码为整数索引(1=2022,2=2023,3=2024),通过遗传算法搜索最优索引组合,直接计算总目标值作为适应度。
完整代码实现
library(GA) # 初始化年份数据 year_data <- data.frame( year = c(2022, 2023, 2024), x = c(23, 59, 28), y = c(54, 12, 65), z = c(65, 3, 2) ) # 预计算每个年份的目标值 year_data$objective <- year_data$x + year_data$y - year_data$z # 配置问题参数 n_options <- 3 # 选项数量m1/m2/m3 year_range <- 1:nrow(year_data) # 年份索引范围 # 定义适应度函数:输入选项的年份索引组合,返回总目标值 fitness <- function(individual) { sum(year_data$objective[individual]) } # 运行遗传算法 ga_result <- ga( type = "integer", fitness = fitness, lower = rep(min(year_range), n_options), upper = rep(max(year_range), n_options), popSize = 50, maxiter = 100, run = 10 # 连续10代无改进则提前终止 ) # 输出结果 summary(ga_result) cat("最优选项-年份对应索引:", ga_result@solution, "\n") cat("对应年份:", year_data$year[ga_result@solution], "\n") cat("最大总目标值:", ga_result@fitnessValue, "\n")
扩展场景适配
当后续增加选项数量或年份数据时,只需修改以下部分:
- 更新
year_data添加新的年份指标 - 将
n_options调整为新的选项总数 - 根据问题规模微调
popSize、maxiter等算法参数,保证搜索效率
可选约束扩展
如果需要添加「每个年份最多被k个选项选择」的约束,可在适应度函数中加入惩罚项:
fitness <- function(individual) { # 统计每个年份被选择的次数 selection_counts <- table(individual) # 假设每个年份最多被2个选项选择,超过则施加惩罚 penalty <- sum(pmax(selection_counts - 2, 0)) * 100 # 惩罚系数可按需调整 total_objective <- sum(year_data$objective[individual]) # 返回扣除惩罚后的适应度值(GA默认最大化适应度) return(total_objective - penalty) }
最优解验证
手动计算可知,2024年的目标值(91)为所有年份中最高,因此所有选项均选择2024时总目标值为91*3=273,这是理论最大值,GA算法可稳定搜索到该结果。
内容的提问来源于stack exchange,提问作者stuggling_grad
相关产品推荐
相关产品推荐

