From 83a29152c9fe86615a0e95c4b104b1e015fa6331 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Fri, 14 Aug 2026 15:40:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B1=80=E9=83=A8=E6=94=B6?= =?UTF-8?q?=E6=95=9B=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 93972 -> 94621 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 12 +++ .../nmCalculation/nmCalculationAutoFitPSO.cpp | 90 ++++++++++++++++++ 3 files changed, 102 insertions(+) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index c9e8ed0c65c5f7422395fd6f64d2faf6de240c85..9df8a2617c56f2db44d2b2b5b16f5de42f89553d 100644 GIT binary patch delta 10049 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 delta 9504 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 nmCalculationAutoFitPSO + + Effective improvement threshold: max(%1, %2% of baseline error); %3 consecutive ineffective steps trigger convergence confirmation + 有效改善阈值:取 %1 与基准误差的 %2% 中较大值;连续 %3 次无有效改善后进行收敛确认 + + + No effective improvement for %1 consecutive steps; rebuilding sensitivity model for confirmation + 连续 %1 次无有效改善,正在重建灵敏度模型进行确认 + + + Sensitivity rebuild produced no effective improvement; local convergence detected + 灵敏度重建后仍无有效改善,判定为局部收敛 + === User Stop Request Received === === 用户停止请求已接收 === diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp index 79453f9..94497c7 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp @@ -4235,6 +4235,11 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() const double maximumTrustRadius = 0.30; const double columnCorrelationLimit = 0.995; const double diagnosisThreshold = 1.0e-5; + // 误差下降至少达到绝对 1e-5 且相对当前有效基准 0.2% 才算有效改善。 + // 更小的下降仍保留为最佳解,但不能反复清除停滞状态、延长拟合时间。 + const double effectiveRelativeImprovement = 2.0e-3; + const double effectiveAbsoluteImprovement = 1.0e-5; + const int maximumIneffectiveSteps = 3; // damping 是 LM 阻尼;拒绝或预测失准时增大,真实下降与预测一致时减小。 // 两组累计量控制 Jacobian 重建,避免长期使用已偏离当前工作点的局部模型。 @@ -4243,9 +4248,11 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() int consecutiveRejectedSteps = 0; int consecutiveSolverFailures = 0; int acceptedSinceRebuild = 0; + int consecutiveIneffectiveSteps = 0; double movementSinceRebuild = 0.0; bool rebuildRequested = true; bool modelRebuiltAtMinimumRadius = false; + bool stagnationConfirmationRequested = false; StopReasonPSO stopReason = PSO_MAX_ITERATIONS; // jacobian 的行对应固定 160 维残差,列对应用户勾选的参数。 @@ -4367,6 +4374,54 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() .arg(current.fitness, 0, 'e', 4) .arg(maximumEvaluations)); + // 有效改善始终相对“上一次有效改善后的误差”累计判断,避免一连串微小 + // 下降每次都清零计数;累计达到门槛后才开始新的有效改善基准。 + double effectiveImprovementBaseline = current.fitness; + auto registerEffectiveImprovement = [&](double fitness) -> bool { + const double requiredImprovement = qMax( + effectiveAbsoluteImprovement, + qAbs(effectiveImprovementBaseline) * + effectiveRelativeImprovement); + const double improvement = effectiveImprovementBaseline - fitness; + if(improvement < requiredImprovement) { + return false; + } + + effectiveImprovementBaseline = fitness; + consecutiveIneffectiveSteps = 0; + stagnationConfirmationRequested = false; + return true; + }; + + // 连续三次没有有效改善时只请求一次灵敏度重建。重建完成后由主循环 + // 直接检查累计改善,仍达不到门槛就判定局部收敛,不再继续微小试探。 + auto recordIneffectiveStep = [&]() -> bool { + ++consecutiveIneffectiveSteps; + if(consecutiveIneffectiveSteps < maximumIneffectiveSteps) { + return false; + } + + if(stagnationConfirmationRequested) { + return true; + } + + consecutiveIneffectiveSteps = 0; + stagnationConfirmationRequested = true; + rebuildRequested = true; + emit logMessageGenerated( + tr("No effective improvement for %1 consecutive steps; " + "rebuilding sensitivity model for confirmation") + .arg(maximumIneffectiveSteps)); + return false; + }; + + emit logMessageGenerated( + tr("Effective improvement threshold: max(%1, %2% of baseline error); " + "%3 consecutive ineffective steps trigger convergence confirmation") + .arg(effectiveAbsoluteImprovement, 0, 'e', 2) + .arg(effectiveRelativeImprovement * 100.0, 0, 'f', 2) + .arg(maximumIneffectiveSteps)); + if(current.fitness < m_targetError) { return PSO_TARGET_ACHIEVED; } @@ -4603,6 +4658,8 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() break; } if(rebuildRequested) { + const bool confirmingStagnation = + stagnationConfirmationRequested; if(!rebuildSensitivity()) { stopReason = m_shouldStop ? PSO_USER_STOPPED @@ -4617,6 +4674,15 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() stopReason = PSO_MAX_ITERATIONS; break; } + const bool rebuildEffective = + registerEffectiveImprovement(current.fitness); + if(confirmingStagnation && !rebuildEffective) { + emit logMessageGenerated( + tr("Sensitivity rebuild produced no effective improvement; " + "local convergence detected")); + stopReason = PSO_LOCAL_OPTIMUM; + break; + } } // 先确定当前最突出的可靠诊断误差,用其梯度回答“哪些参数最能改善 @@ -4748,6 +4814,10 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() trustRadius = qMax(minimumTrustRadius, trustRadius * 0.5); damping = qMin(1.0e8, damping * 4.0); rebuildRequested = true; + if(recordIneffectiveStep()) { + stopReason = PSO_LOCAL_OPTIMUM; + break; + } continue; } @@ -4865,6 +4935,10 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() } rebuildRequested = true; } + if(recordIneffectiveStep()) { + stopReason = PSO_LOCAL_OPTIMUM; + break; + } continue; } @@ -4905,6 +4979,10 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() stopReason = PSO_CONSECUTIVE_FAILURES; break; } + if(recordIneffectiveStep()) { + stopReason = PSO_LOCAL_OPTIMUM; + break; + } continue; } @@ -4994,6 +5072,14 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() } } + // 候选只要更优就继续作为 current 保存;是否足以解除停滞,则统一 + // 相对上一次有效改善基准判断。拒绝和微小改善都会累计无效次数。 + const bool effectiveImprovement = + registerEffectiveImprovement(current.fitness); + if(!effectiveImprovement && recordIneffectiveStep()) { + stopReason = PSO_LOCAL_OPTIMUM; + } + writeTraceRow(m_currentIteration, -1, "trust_region_candidate", @@ -5018,6 +5104,10 @@ StopReasonPSO nmCalculationAutoFitPSO::runTrustRegionFitting() .arg(accepted ? tr("accepted") : tr("rejected"))); emit progressUpdated(iteration + 1, m_globalBestFitness); + if(stopReason == PSO_LOCAL_OPTIMUM) { + break; + } + if(current.fitness < m_targetError) { stopReason = PSO_TARGET_ACHIEVED; break;