QList<Number> HookeJeeves::findMinimum() { QList<Number> currentPoint = m_sourcePoint; forever { for (int i = 0; i < currentPoint.size(); i++) { if (calculateFunction(increaseDirection(currentPoint, i)) < calculateFunction(currentPoint)) { currentPoint = increaseDirection(currentPoint, i); } else if (calculateFunction(decreaseDirection(currentPoint, i)) < calculateFunction(currentPoint)) { currentPoint = decreaseDirection(currentPoint, i); } } if (calculateFunction(currentPoint) < calculateFunction(m_sourcePoint)) { QList<Number> oldSourcePoint = m_sourcePoint; m_sourcePoint = currentPoint; for (int i = 0; i < currentPoint.size(); i++) { currentPoint[i] = m_sourcePoint[i] + m_accelerationCoefficient * (m_sourcePoint[i] - oldSourcePoint[i]); } } else { bool isFinish = true; for (int i = 0; i < m_stepSizes.size(); i++) { if (m_stepSizes[i] > m_stopValue) { isFinish = false; m_stepSizes[i] = m_stepSizes[i] / m_decreaseCoefficient; } } if (isFinish) { // Exit condition return m_sourcePoint; } else { currentPoint = m_sourcePoint; } } } }
inline void rotateRight() { increaseDirection(2.0d * M_PI / kDirectionSteps); }
inline void rotateLeft() { increaseDirection(-2.0d * M_PI / kDirectionSteps); }