R语言GA包遗传算法绘图仅显示直线的原因咨询
问题原因与修复方案
你的遗传算法运行后绘图显示直线属于不合理现象,完全由自定义适应度函数的逻辑错误导致,具体问题和修正方法如下:
核心错误点
- GA包要求适应度函数的输入参数
x为当前待评估的个体向量,函数返回值必须是单个数值,代表该个体对应的适应度得分,得分越高代表个体质量越好。 - 你编写的
setup函数存在两处逻辑错误:- 函数全程未使用输入参数
x,适应度计算完全依赖提前计算好的固定向量sum_fu,和种群迭代过程中生成的个体参数完全无关 - 函数返回的是长度为350的向量,不符合GA包对适应度函数返回值的要求
- 函数全程未使用输入参数
导致直线的原理
由于你的适应度和迭代生成的个体没有关联,每一代种群的最大、最小、平均适应度都固定不变,所以最终绘制的迭代曲线就是三条平行直线,没有优化迭代的上升趋势。
修正方案
你需要按照你要优化的适应度公式,把个体参数x代入计算逻辑,让适应度和x的取值挂钩,同时保证函数每次调用返回单个数值。参考修正后的代码结构如下:
library(GA) frame_uji <- data.matrix(data_uji) # 修正后的适应度函数,假设你要优化的目标是用x作为权重计算frame_uji的加权和,再代入公式 setup <- function(x) { # 此处加入x参与的计算逻辑,示例为x作为列权重计算行加权和的均值,代入你的公式 weighted_row_sum <- frame_uji %*% x mean_sum <- mean(weighted_row_sum) return(1/(1 + mean_sum)) } gann <- ga(type = "real-valued", fitness = setup, # 注意:lower/upper的长度要和x的长度一致,即你要优化的参数个数 lower = rep(1, ncol(frame_uji)), upper = rep(5, ncol(frame_uji)), selection = gareal_rwSelection, crossover = gareal_spCrossover, mutation = gareal_rsMutation, popSize = 350, maxiter = 350, pcrossover = 0.6 , pmutation = 0.1, run = 30) summary(gann) plot(gann)
额外注意事项
- 你原代码中
ga函数的population参数留空,若没有自定义种群生成需求可以直接删除该参数即可 lower和upper的长度必须和你要优化的参数个数(即x的长度)完全一致,否则会报错
内容的提问来源于stack exchange,提问作者Noval
相关产品推荐
相关产品推荐

