能否用数据框中的目标值替代目标函数运行MCO包的NSGA-II?
问题描述
我有如下样本数据框df.sample,包含A、B两列目标值:
df.sample <- data.frame("A" = c(10, 15, 13, 100, 1000, 75, 1, 0.6, 99, 64, 2, 123), "B" = c(12, 10000, 0.01, 99, 1, 2, 3, 47, 99, 1, 82, 1))
目前我用自定义函数识别该数据框的帕累托最优解,代码如下:
#Function to check Pareto optimality is_pareto_optimal <- function(row, data) { pareto <- TRUE for (i in 1:nrow(data)) { if (all(row >= data[i, 1:2]) && any(row > data[i, 1:2])) { pareto <- FALSE break } } return(pareto) } # Identify Pareto optimal solutions sample2_pareto_optimal <- apply(df.sample[, 1:2], 1, is_pareto_optimal, data = df.sample) # Extract Pareto optimal solutions sample2_pareto_solutions <- df.sample[sample2_pareto_optimal, ]
我知道NSGA-II(来自MCO包)通常需要指定目标函数,但我没有对应的目标函数,只有数据框里这两列目标值。想请教:是否可以直接用这些值运行NSGA-II?能不能得到相同结果?效率会不会更高?
解答
1. 能否直接用现有数据运行NSGA-II?
不行。NSGA-II本质是多目标优化算法,核心逻辑是通过迭代搜索,基于目标函数将参数空间的候选解映射到目标空间,最终逼近帕累托前沿。它的运行依赖“参数→目标值”的映射关系,而你只有现成的目标值数据,没有对应的参数和目标函数,无法驱动NSGA-II的迭代过程。
2. 能否得到和现有方法相同的结果?
既然无法直接用现有数据运行NSGA-II,自然谈不上得到相同结果。退一步说,就算强行构造一个“输入即输出”的假目标函数,NSGA-II也会去搜索新的候选解,而非筛选你已有的数据集——这和你“从现有数据中挑选帕累托最优解”的需求完全不符。
3. 效率对比:现有方法 vs NSGA-II
你的自定义函数是针对已有数据集的帕累托筛选,而NSGA-II是生成新解的优化算法,二者应用场景完全不同:
- 你的方法时间复杂度为O(n²),对于小数据集(比如你这12行)完全够用;如果数据集规模较大,可采用更高效的帕累托筛选逻辑优化。
- NSGA-II的效率取决于迭代次数、种群规模等参数,对于“筛选现有数据”这个需求来说属于冗余操作,效率反而更低。
优化现有代码的建议
如果想提升帕累托筛选的效率,可以使用现成R包的高效实现,比如emoa包的向量化判断逻辑,比循环函数速度更快:
library(emoa) # 判断每个样本是否被其他样本支配 is_dominated <- function(data) { apply(data, 1, function(row) any(apply(data, 1, function(other) all(other >= row) && any(other > row)))) } # 提取非支配解(帕累托最优解) sample_pareto_solutions <- df.sample[!is_dominated(df.sample[,1:2]), ]
内容的提问来源于stack exchange,提问作者hadi
相关产品推荐
相关产品推荐

