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 + -
显示快捷键?