【发布时间】:2012-04-15 11:19:03
【问题描述】:
我正在调试优化程序。我生成一个日志文本文件,在其中跟踪优化例程中每次迭代的目标函数值。
这里是上下文:我处理曲线拟合问题,模型在四个参数中是线性的,在 X 数据中是多项式
Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4
然后我对从此模型生成的无噪声无偏数据运行优化例程,以测试算法。
在日志文件中,第一个优化步骤显示没有问题。函数评估具有双重价值。在每次迭代中,计算 5 个函数值(并显示在日志文件中)。从给定的迭代中,事情变得糟糕:一个函数评估变为-1#INF,尽管此时目标函数已经成功评估(!)。在接下来的迭代中,“坏点”继续评估为-1#INF,并且一个接一个地最终评估为 -1#INF。考虑到公式和之前已经正确评估过的事实,在这些点计算 Y 并不困难。
另外,我怀疑还有另一个原因,比如内存管理。您对此有什么想法,或者有什么建议可以更密切地跟踪问题吗?
编辑
我在日志文件中看到-1#INF 的第一次出现。每次迭代时,函数在 5 个点进行评估,但这 5 个点中只有一个是“新点”。当-1#INF 首次出现时,此时函数已成功求值。
看起来像
ITERATION N-1
f1 559.011
f2 560.034
f3 562.034
f4 560.342
f5 560.344
ITERATION N
f1 -1#INF
f2 560.034
f3 558.034
f4 560.342
f5 560.344
其中ITERATION N 仅f3 是新点的函数评估,f1 是与ITERATION N-1 中的f1 相同点的函数评估。
【问题讨论】:
-
“成功评估”到底是什么意思?您确定没有发生溢出或被零除吗?
-
内存管理无疑是个问题。你的迭代算法是发散的。尝试追踪产生 INF 的第一个计算。
-
使用调试器(或添加打印语句)来追踪导致错误的确切代码行。
-
除非您发布一些实际代码,否则几乎无法为您提供帮助。
-
@Potatoswatter 我看到了第一次出现。每次迭代时,函数在 5 个点进行评估,但这 5 个点中只有一个是“新点”。当 -1#INF 首次出现时,此时函数已成功求值。
标签: c++ algorithm debugging optimization nan