0

我正在实施一种优化算法,并且对于解决方案的下限和上限不知道或不知道或不知道的情况有不同的启发式方法。

要检查,我的第一种方法是简单地采取

if(abs(floor(log10(abs(LBD))) - floor(log10(abs(UBD)))) < 1 )
{ //(<1 e.g. for 6, 13)
  //Bounds are sufficiently close for the serious stuff 
}
else {
  //We need some more black magic
}

但这需要将先前的检查概括为 NAN,±INFINITY。此外,在 LBD 为负而 UBD 为正的情况下,我们不能假设仅凭上述检查就可以确保它们接近相同数量级。

有没有专门的方法来解决这个问题,还是我坚持这个黑客?

4

1 回答 1

0

感谢 geza,我意识到整个事情都可以在没有以下内容的情况下完成log10:一个工作解决方案发布在下面,一个 MWE 包括发布在ideone上的日志变体。

template <typename T> double sgn(T val) {
    return double((T(0) < val) - (val < T(0)))/(val == val);
}
bool closeEnough(double LBD, double UBD, uint maxOrderDiff = 1, uint cutoffOrder = 1) {
  double sgn_LBD = sgn(LBD);
  double sgn_UBD = sgn(UBD);
  double cutoff = pow(10, cutoffOrder);
  double maxDiff = pow(10, maxOrderDiff);
  if(sgn_LBD == sgn_UBD) {
     if(abs(LBD)<cutoff && abs(UBD)<cutoff) return true;
     return LBD<UBD && abs(UBD)<abs(LBD)*maxDiff;
  }
  else if(sgn_UBD > 0) {
    return -LBD<cutoff && UBD<cutoff;
  }
  // if none of the above matches LBD >= UBD or any of the two is NAN
}

作为奖励,它可以截断,因此如果两个边界都在其中,[-10^cutoffOrder,+10^cutoffOrder]则它们被认为足够接近!pow 计算也可能是不必要的,但至少在我的情况下,此检查不在关键代码部分中。如果是这样,我想你可以硬编码cutoffand maxDiff

于 2017-08-11T10:46:28.043 回答