You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用数据框中的目标值替代目标函数运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:30:09