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

使用DEoptimR包JDEoptim优化企业排名NDCG不收敛且不满足约束求助

问题原因分析
  • 目标函数方向错误:JDEoptim 默认执行最小化目标函数的逻辑,而你当前传入的otimizar返回值是越高越好的NDCG,相当于算法在往NDCG降低的方向迭代,自然无法得到高NDCG的结果。
  • 约束逻辑适配错误:JDEoptim的constr参数默认仅支持不等式约束,要求所有约束返回值≤0时才判定为可行解,你直接传入等式约束的残差,会导致几乎所有参数都被判定为不可行,自然无法满足你的约束要求。
  • 参数映射逻辑错误:你定义的lower和upper维度是32位,但约束函数restricao仅使用了pesos的前10位,剩余22个参数完全没有纳入约束校验;同时你将同一个pesos下标赋值给多个变量(比如nota_contratos和nota_contratos_at都取pesos[2]),除非你明确需要这两个权重强制相等,否则这个赋值逻辑会导致参数和指标的对应关系完全错乱。
  • 优化配置参数过小:差分进化算法的种群规模NP=10、最大迭代次数maxiter=10远低于32维参数的搜索需求,算法还未完成有效搜索就提前终止,无法逼近最优解。
解决方案
  1. 修正目标函数方向
    修改自定义函数otimizar的返回值,将原NDCG结果取负值后返回,适配JDEoptim的最小化逻辑,等价于最大化NDCG:
# 原otimizar返回逻辑修改示例
return(-Evaluation.NDCG(你的输入参数))
  1. 修正约束逻辑
    先梳理清楚32个参数和各指标的对应关系,修正restricao里的参数赋值错误,再将等式约束转换为带容差的不等式约束,或者添加软约束惩罚项到目标函数,示例(转不等式约束):
restricao <- function(pesos) {
  # 先修正所有参数的赋值逻辑,确保32个参数都对应到正确变量
  sum1 = 第一组变量求和结果
  sum2 = 第二组变量求和结果
  tol = 1e-4 # 可自行调整的约束容差
  # 返回4个不等式约束,所有值≤0时满足要求
  return(c(
    sum1 - 1 - tol,
    -(sum1 - 1) - tol,
    sum2 + 1 - tol,
    -(sum2 + 1) - tol
  ))
}

如果用软约束方案,可以直接在目标函数里添加惩罚项:

otimizar <- function(pesos) {
  ndcg = Evaluation.NDCG(你的计算逻辑)
  sum1 = 第一组变量求和
  sum2 = 第二组变量求和
  # 违反约束的惩罚,权重100可根据需要调整
  penalty = 100 * (abs(sum1 - 1) + abs(sum2 + 1))
  return(-ndcg + penalty)
}
  1. 调整优化参数配置
    根据参数维度调整种群和迭代次数,32维参数推荐配置:
otimzacao=JDEoptim(lower, upper,fn = otimizar, tol = 1e-4,
                   constr = restricao,trace = TRUE, NP = 160, maxiter = 500)
  1. 优化后校验
    得到最优参数后,单独调用约束函数和NDCG计算逻辑,校验约束满足度和实际NDCG值,若仍不满足要求可进一步调大惩罚权重、缩小参数上下限范围,或继续增加迭代次数。

内容的提问来源于stack exchange,提问作者Hernandes Matias Junior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:04