使用正态分布优化预期收益

时间:2015-07-20 18:02:04

标签: c++ optimization normal-distribution

假设我生成一个平均值为50且标准差为1的正态分布。

boost::normal_distribution<> normal(50, 1);

然后我希望将这个正态分布乘以由下式给出的支付函数:

f(x)= 100 - x

然后求解[0,100]中的最大x \。

特别是,我想解决:

((max x / in [0,100])normal(x)*(100-x)

有人可以帮我编码,或者引导我朝正确的方向前进吗?

1 个答案:

答案 0 :(得分:1)

正态分布的PDF(概率分布函数)具有良好的封闭形式:

pdf(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

因此可以通过求解:

来分析找到最大值

\frac{d}{dx}\left(pdf(x)(100-x)\right)=0

这将为您的案件带来x=75-sqrt(626)x=49.98

但是,如果您想在代码中而不是在分析中执行此操作,则可以使用优化算法。在你的情况下,可能一个简单的算法,如黄金分割搜索(在一个维度)将工作得很好(here, for example):

using boost::math::normal;

normal ndist(50.0, 1.0);

double f(const double &x)
{
    return pdf(ndist, x) * (100.0 - x);
}

double max(double (*f)(const double &), double &a, double &b, const double tol = 1e-5)
{
    static double goldenratio = 0.618034;
    double c = b - goldenratio * (b - a);
    double d = a + goldenratio * (b - a);
    while(abs(c - d) > tol)
    {
        double fc = (*f)(c); double fd = (*f)(d);
        if (fc > fd)
        {
            b = d;
            d = c;
            c = b - goldenratio * (b - a);
        } else
        {
            a = c;
            c = d;
            d = a + goldenratio * (b - a);
        }
    }
    return 0.5 * (b + a);
}

一个好的起点是0100

double a = 0.0;
double b = 100.0;
maximum = max(f, a, b);