我找不到很多关于discrete_distribution的Boost版本的文档。经过大量的Google搜索,我仍然找不到这个类的方法列表,以及它们中的任何一个是否可以重新分配概率。
就我而言,我正在编写一个进化动力学算法。在每个时间步骤,可以随机选择群体成员以死亡或繁殖。因此,我的离散分布中的条目总数几乎每次迭代都会发生变化。
我想在模拟开始之前定义一个我定义的对象,称为gillespie_dist
(管理此Gillespie算法的离散分布)。但是我希望,在每次迭代结束时,可能会更改特定值和/或向gillespie_dist
添加新值,特别是不希望每次迭代都创建离散分布的新实例。
这是一个很好的方法。是否存在将新值推送到discrete_distribution
对象的方法,用于更改特定索引处的分布值的方法,或者更好的方法是,使用向量迭代器提到的方法“重新初始化”整个分布{{3 }}?
答案 0 :(得分:1)
我查看了std :: discrete_distribution的gcc libstdc ++ 4.7实现的代码。
权重在私有成员中存储为vector<double>
。在公共接口中无法访问其resize方法。
我会尝试挖掘它的operator()的实现(它在cpp中看起来像),滚动你自己应该没问题。
以下是主要操作,以及我的解释:
template<typename _IntType>
void
discrete_distribution<_IntType>::param_type::
_M_initialize()
{
if (_M_prob.size() < 2)
{
_M_prob.clear();
return;
}
const double __sum = std::accumulate(_M_prob.begin(),
_M_prob.end(), 0.0);
// Now normalize the probabilites.
__detail::__transform(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
std::bind2nd(std::divides<double>(), __sum));
// Accumulate partial sums.
_M_cp.reserve(_M_prob.size());
std::partial_sum(_M_prob.begin(), _M_prob.end(),
std::back_inserter(_M_cp));
// Make sure the last cumulative probability is one.
_M_cp[_M_cp.size() - 1] = 1.0;
}
template<typename _IntType>
template<typename _UniformRandomNumberGenerator>
typename discrete_distribution<_IntType>::result_type
discrete_distribution<_IntType>::
operator()(_UniformRandomNumberGenerator& __urng,
const param_type& __param)
{
if (__param._M_cp.empty())
return result_type(0);
__detail::_Adaptor<_UniformRandomNumberGenerator, double>
__aurng(__urng);
const double __p = __aurng();
auto __pos = std::lower_bound(__param._M_cp.begin(),
__param._M_cp.end(), __p);
return __pos - __param._M_cp.begin();
}
所以基本上它在初始化时计算辅助矢量_M_cp
,它实质上是权重的一个分离的累积密度函数。因此,生成样本只意味着生成一个统一的随机变量,并在累积分布中搜索第一个出现的变量(这是上面的 lower_bound 调用),返回其索引。
例如,如果权重向量是:
{ 1, 2, 1, 3 }
然后将cp计算为:
{ 1, 1+2, 1+2+1, 1+2+1+3 }
=
{ 1, 3, 4, 7 }
所以我从0..6统一选择并获得4,所以我选择第三个。
答案 1 :(得分:0)
经过大量的Google搜索,我仍然无法找到方法列表 这个类有,以及它们中的任何一个是否可以重新分配 概率。
http://www.boost.org/doc/html/boost/random/discrete_distribution.html
和
void param(const param_type & param);
设置分布的参数。