Esempio n. 1
0
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;
			}
		}
	}
}
Esempio n. 2
0
 inline void rotateRight() { increaseDirection(2.0d * M_PI / kDirectionSteps); }
Esempio n. 3
0
 inline void rotateLeft() { increaseDirection(-2.0d * M_PI / kDirectionSteps); }