gstabsearch.cpp
来自「一个由Mike Gashler完成的机器学习方面的includes neural」· C++ 代码 · 共 120 行
CPP
120 行
#include "GStabSearch.h"#include "GBits.h"#include <math.h>#include <stdio.h>GStabSearch::GStabSearch(GRealVectorCritic* pCritic, double dMin, double dRange): GRealVectorSearch(pCritic){ m_dMin = dMin; m_dRange = dRange; m_dTolerance = .00001; m_nDimensions = pCritic->GetVectorSize(); m_pMins = new double[m_nDimensions]; m_pRanges = new double[m_nDimensions]; m_pVector = new double[m_nDimensions]; m_nMask[0] = 0; m_nMask[1] = 0; m_nMask[2] = 0; m_nMask[3] = 0; Reset(); m_nMask[0] = 0; // undo the increment that Reset() does m_nStabs = 0;}/*virtual*/ GStabSearch::~GStabSearch(){ delete(m_pMins); delete(m_pRanges); delete(m_pVector);}void GStabSearch::Reset(){ m_nCurrentDim = 0; m_nMaskPos = 0; // Start at the global scope int i; for(i = 0; i < m_nDimensions; i++) { m_pMins[i] = m_dMin; m_pRanges[i] = m_dRange; } // Increment the mask i = 0; while(++(m_nMask[i]) == 0) i++; m_nStabs++;}/*virtual*/ void GStabSearch::Iterate(){ // Test the center of both halves int i; for(i = 0; i < m_nDimensions; i++) m_pVector[i] = m_pMins[i] + .5 * m_pRanges[i]; m_pVector[m_nCurrentDim] = m_pMins[m_nCurrentDim] + .25 * m_pRanges[m_nCurrentDim]; double dError1 = m_pCritic->Critique(m_pVector); m_pVector[m_nCurrentDim] = m_pMins[m_nCurrentDim] + .75 * m_pRanges[m_nCurrentDim]; double dError2 = m_pCritic->Critique(m_pVector); // If the mask bit is zero, pick the better half, otherwise pick the worse half m_pRanges[m_nCurrentDim] *= .5; if(m_nMask[m_nMaskPos / 32] & (1 << (m_nMaskPos % 32))) { if(dError2 >= dError1) m_pMins[m_nCurrentDim] += m_pRanges[m_nCurrentDim]; } else { if(dError2 < dError1) m_pMins[m_nCurrentDim] += m_pRanges[m_nCurrentDim]; } // Advance if(++m_nCurrentDim >= m_nDimensions) m_nCurrentDim = 0; if(++m_nMaskPos >= 128) m_nMaskPos = 127; if(m_pRanges[m_nCurrentDim] < m_dTolerance) Reset();}#ifndef NO_TEST_CODE#define TARGET_VALUE 3.14159class GStabSearchTestCritic: public GRealVectorCritic{public: GStabSearchTestCritic() : GRealVectorCritic(1) { } virtual ~GStabSearchTestCritic() { } virtual double ComputeError(double* pVector) { double d = TARGET_VALUE - pVector[0]; return d * d; }};// staticvoid GStabSearch::Test(){ GStabSearchTestCritic critic; GStabSearch search(&critic, 0, 4); int i; for(i = 0; i < 20; i++) search.Iterate(); double dBestYet = critic.GetBestYet()[0]; if(ABS(TARGET_VALUE - dBestYet) > .000001) throw "failed";}#endif // !NO_TEST_CODE
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?