particlefilt.cpp

来自「InnovLabSimu在vc++下实现」· C++ 代码 · 共 207 行

CPP
207
字号
#include "ParticleFilt.h"


CParticleFltInitState:: CParticleFltInitState(void)
{
}

CParticleFltInitState:: CParticleFltInitState(unsigned NumOfParticles,const PF_SPA::StateRange& StateRangeVal)
{
	m_NumOfParticle=NumOfParticles;
	m_vStateRangeVal=StateRangeVal.m_vStateRage;
	//unsigned StateDimension=StateRangeVal.QueryStateDimension();
	m_fInitWeight=1.0/m_NumOfParticle;
}

 CParticleFltInitState::~CParticleFltInitState(void)
{
}

bool  CParticleFltInitState::InitFlt(bool (CGlobalMap::*pCheckFun)(CParticle& ParticleTobeCheck))
{		
////////////////////////为状态的每一维产生一个平均分布的随机变量发生器//////////////////////////////////////////////////
	//std::vector<uniform_random_type> vUniRandom;///<每一维状态对应一个平均分布随机变量发生器
	for (unsigned i=0;i<m_vStateRangeVal.size();i++)
	{	
		base_generator_type generator(static_cast<unsigned int>(std::time(0))+i);///随即变量发生器
		distribution_type uni_dist(m_vStateRangeVal[i][0],m_vStateRangeVal[i][1]);///<每一维状态的分布范围设置好
		uniform_random_type UniRandom(generator, uni_dist);
		m_vUniRandomProducer.push_back(UniRandom);///<将产生的随机变量发生器按维数顺序存起来
	}
////////////////开始产生点//////////////////////////////////////////////////////////
	for(unsigned i=0;i<m_NumOfParticle;i++)
	{
		CParticle Particle;
		if (Generate1Particle(m_vUniRandomProducer,Particle,pCheckFun))
		{
			m_vParticleSet.push_back(Particle);
		}
		else
		{
			return false;//产生粒子失败
		}		
	}	
	return true;
}
bool  CParticleFltInitState::InitFlt(CParticle InitLoc)
{		
	////////////////////////为状态的每一维产生一个平均分布的随机变量发生器//////////////////////////////////////////////////
	//std::vector<uniform_random_type> vUniRandom;///<每一维状态对应一个平均分布随机变量发生器
	for (unsigned i=0;i<m_vStateRangeVal.size();i++)
	{	
		base_generator_type generator(static_cast<unsigned int>(std::time(0))+i);///随即变量发生器
		distribution_type uni_dist(m_vStateRangeVal[i][0],m_vStateRangeVal[i][1]);///<每一维状态的分布范围设置好
		uniform_random_type UniRandom(generator, uni_dist);
		m_vUniRandomProducer.push_back(UniRandom);///<将产生的随机变量发生器按维数顺序存起来
	}
	////////////////开始产生点//////////////////////////////////////////////////////////
	for (int i=0;i<m_NumOfParticle;i++)
	{
		m_vParticleSet.push_back(InitLoc);
	}
	return true;
}
bool  CParticleFltInitState::InitFlt(CGlobalMap& GlobalMap)
{		
	////////////////////////为状态的每一维产生一个平均分布的随机变量发生器//////////////////////////////////////////////////
	//std::vector<uniform_random_type> vUniRandom;///<每一维状态对应一个平均分布随机变量发生器
	//__asm int 3;
	m_vUniRandomProducer.clear();
	for (unsigned i=0;i<m_vStateRangeVal.size();i++)
	{	
		base_generator_type generator(static_cast<unsigned int>(std::time(0))+i);///随即变量发生器
		distribution_type uni_dist(m_vStateRangeVal[i][0],m_vStateRangeVal[i][1]);///<每一维状态的分布范围设置好
		uniform_random_type UniRandom(generator, uni_dist);
		m_vUniRandomProducer.push_back(UniRandom);///<将产生的随机变量发生器按维数顺序存起来
	}
	////////////////开始产生点//////////////////////////////////////////////////////////
	for(unsigned i=0;i<m_NumOfParticle;i++)
	{
		CParticle Particle;
		if (Generate1Particle(m_vUniRandomProducer,Particle,GlobalMap))
		{
			m_vParticleSet.push_back(Particle);
		}
		else
		{
			return false;//产生粒子失败
		}		
	}	
	return true;
}
bool  CParticleFltInitState::Generate1Particle(std::vector<uniform_random_type>&vUniRandom,CParticle& Particle,bool (CGlobalMap::*pCheckFun)(CParticle& ParticleTobeCheck))
{
	CParticle ParticleTmp;
	do
	{
		for (unsigned i=0;i<m_vStateRangeVal.size();i++)
		{	
			ParticleTmp.ChangeState(i,vUniRandom[i]());
		}
	}while(!IsParticlePossible(ParticleTmp,pCheckFun));//反复生成点直到生成了可行的粒子才结束
	return true;
}
bool  CParticleFltInitState::Generate1Particle(std::vector<uniform_random_type>&vUniRandom,CParticle& Particle,CGlobalMap& GlobalMap)
{
	//CParticle ParticleTmp;
	do
	{
		for (unsigned i=0;i<m_vStateRangeVal.size();i++)
		{	
			Particle.ChangeState(i,vUniRandom[i]());
		}
	}while(GlobalMap.IsAPossibleLocate(Particle));//反复生成点直到生成了可行的粒子才结束
	Particle.XCoord=Particle.TransferMapCoord2RealCoord(Particle.XCoord);
	Particle.YCoord=Particle.TransferMapCoord2RealCoord(Particle.YCoord);
	Particle.Weight=m_fInitWeight;///<赋初始权重
	return true;
}


ParticleSet_type CResampler::Low_Variance_Sampler(ParticleSet_type & ParticleSet)
{
	ParticleSet_type NewParticleSet;
	if (ParticleSet.size()>0)
	{
		srand(std::time(0));
		double r=(float)rand()/(RAND_MAX*ParticleSet.size());
		ResampleEverySample(ParticleSet,r,NewParticleSet);
		return NewParticleSet;
	}
	else
	{
		NewParticleSet.push_back(CParticle(0));
		return NewParticleSet;
	}

}
void CResampler::ResampleEverySample(ParticleSet_type & OldParticleSet,double& Random_r,ParticleSet_type & NewParticleSet)
{
	size_t ParticleSetSize=OldParticleSet.size();
	WEIGHT_TYPE c=OldParticleSet[0].Weight;//第一个权重
	size_t IndexOfOldParticleSet=0;
	for (unsigned m=1;m<ParticleSetSize;m++)
	{
		double U=Random_r+(double)(m-1)/ParticleSetSize;
		while (U>c)
		{
			IndexOfOldParticleSet++;
			c=c+OldParticleSet[IndexOfOldParticleSet].Weight;
		}
		NewParticleSet.push_back(OldParticleSet[IndexOfOldParticleSet]);
	}
}

//template<class particle_type, class control_type,class CPredictMod,class CMeasureMod>
//bool CParticleFilt<particle_type,control_type,CPredictMod,CMeasureMod>::AddRandomParticleToParticleSet(std::vector<uniform_random_type>&vUniRandom,ParticleSet_type ParticleSetTobeAdd,
//									size_t NumOfParticleTobeAdd,bool (*pCheckFun)(particle_type& StateTobeCheck))
//{
//	
//}


//template<class state_type, class control_type,class CSampleForwardMod,class CMeasureMod>
//CParticleFilt<state_type,control_type,CSampleForwardMod,CMeasureMod>::~CParticleFilt(void)
//{
//}
//template<class state_type, class control_type,class CSampleForwardMod,class CMeasureMod>
//bool CParticleFilt<state_type,control_type,CSampleForwardMod,CMeasureMod>::InitFlt(bool (*pCheckFun)(CParticle& ParticleTobeCheck))
//{		
//	////////////////////////为状态的每一维产生一个平均分布的随机变量发生器//////////////////////////////////////////////////
//	std::vector<uniform_random_type> vUniRandom;///<每一维状态对应一个平均分布随机变量发生器
//	for (unsigned i=0;i<m_vStateRangeVal.size();i++)
//	{	
//		base_generator_type generator(static_cast<unsigned int>(std::time(0))+i);///随即变量发生器
//		distribution_type uni_dist(m_vStateRangeVal[i][0],m_vStateRangeVal[i][1]);///<每一维状态的分布范围设置好
//		uniform_random_type UniRandom(generator, uni_dist);
//		vUniRandom.push_back(UniRandom);///<将产生的随机变量发生器按维数顺序存起来
//	}
//	////////////////开始产生点//////////////////////////////////////////////////////////
//	for(unsigned i=0;i<m_NumOfParticle;i++)
//	{
//		CParticle Particle;
//		if (Generate1Particle(vUniRandom,Particle,pCheckFun))
//		{
//			m_vParticleSet.push_back(Particle);
//		}
//		else
//		{
//			return false;//产生粒子失败
//		}		
//	}	
//	return true;
//}
//template<class state_type, class control_type,class CSampleForwardMod,class CMeasureMod>
//bool CParticleFilt<state_type,control_type,CSampleForwardMod,CMeasureMod>::Generate1Particle(std::vector<uniform_random_type>&vUniRandom,CParticle& Particle,bool (*pCheckFun)(CParticle& ParticleTobeCheck))
//{
//	CParticle ParticleTmp;
//	do
//	{
//		for (unsigned i=0;i<m_vStateRangeVal.size();i++)
//		{	
//			ParticleTmp.ChangeState(i,vUniRandom[i]());
//		}
//	}while(!IsParticlePossible(ParticleTmp,pCheckFun));//反复生成点直到生成了可行的粒子才结束
//	return true;
//}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?