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

使用rmoo求解多目标背包问题遇矩阵运算错误的技术问询

问题解决与概念解析

一、修复矩阵不匹配错误

你遇到的Error in x %*% data$profit : non-conformable arguments是矩阵乘法维度不兼容导致的,和适应度函数返回1×2向量无关——多目标遗传算法的适应度函数必须返回对应目标数量的向量/矩阵,所以返回1×2向量是正确的。

错误根源在于rmoo的适应度函数输入x是批量个体矩阵(每行代表一个个体,比如n个个体对应n×15的二进制矩阵),而非单个向量。直接用x %*% data$profit时,若data$profit是行向量(1×15),就会和n×15的x维度不匹配。

修正方案:

  1. 改用逐元素相乘后按行求和的方式,避开矩阵维度问题
  2. 加入重量约束的惩罚机制(超过容量的个体目标值设为极小值,确保被淘汰)

示例修正后的适应度函数:

fitness_knapsack <- function(x) {
  # x为n×15的二进制矩阵,每行对应一个个体的物品选择
  total_weight <- rowSums(x * data$weight)
  total_profit <- rowSums(x * data$profit)
  total_satisfaction <- rowSums(x * data$satisfaction)
  
  # 约束惩罚:重量超限时,目标值设为极小值(最大化问题下会被优先淘汰)
  penalty <- ifelse(total_weight > 50, -1e6, 0)
  
  # 返回n×2的矩阵,每列对应一个优化目标
  cbind(total_profit + penalty, total_satisfaction + penalty)
}

调用nsga2时需确保参数匹配:比如设置nobj=2(目标数)、nvars=15(变量数)、type="binary"(二进制编码)。

二、多目标GA与单目标GA的核心区别

如果把利润和满意度合并为单值(比如加权求和α*利润 + (1-α)*满意度),就退化为普通单目标GA,两者差异如下:

  • 目标维度:单目标GA仅优化1个合成目标;MOGA同时优化2个独立目标,不预设目标优先级
  • 解的集合:
    • 单目标GA得到唯一最优解(完全由你设定的权重α决定)
    • MOGA(如NSGA-II)得到帕累托最优解集:这些解无法在不降低一个目标的前提下提升另一个目标,比如有的解利润高但满意度稍低,有的解满意度高但利润稍低,可根据实际需求灵活选择
  • 选择逻辑:
    • 单目标GA直接按适应度值排序,选择最优个体
    • MOGA基于帕累托支配关系和拥挤度筛选个体,既保证解的最优性,又维持解集的多样性,避免收敛到单一局部最优

内容的提问来源于stack exchange,提问作者Bronwen Edge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:57:23