偶做过的一道题:
报童问题:
报童购进报纸价格B,零售价A,卖不完退回价C.A>B>C.
当B=0.15 A=0.20 C=0.12 需求量均值500份,均方差50份正态分布,求报童每天要购进多少报纸才能使平均收入最高?最高收入是多少?如何用计算机实现?
分析:
报童在具有最大利润的份数外,再多购入一份报纸或者少购入一份报纸,所获得的利润(a-b)的概率与卖不出去赔钱(b-c)的概率都相等.
假设需要的份数为f(x),则跟据概论关系,f(x)从0到n的积分应该等于(a-b)/(b-c).
取一定的精度,累计相加从0到n,取到最大值就可以了。
笔算结果:
购进515.5份时收入最高。
最高收入的数学期望是:24.535元。
计算机模拟程序:
/*
Author: dcyu
Date: 2003-06-01
IDE:Visual C++6.0
*/
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#define M_PI 3.14159265359
using namespace std;
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00001)/32767.00;
return r;
}
double _sta2(double mu,double sigma)
{
double r1,r2;
r1=_random();
r2=_random();
return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ;
}
int main()
{
const double A = 0.20, B = 0.15, C =0.12;
const int cnt = 10000;
int Num, iCount, buy, left, sale, index;
double Money, Max;
srand( (unsigned)time( NULL ) );
Max = -1000000.0;
for(buy = 450; buy < 550; buy++)
{
Money = 0.0;
for(iCount = 0; iCount < cnt; iCount++)
{
Num = (int)( _sta2(500, 50) );
sale = buy > Num ? Num : buy;
left = buy > Num ? buy - Num : 0;
Money = Money + sale * ( A - B) - left * (B - C);
}
Money = Money / (cnt + 0.0);
Max = Max > Money ? Max : Money;
index = Max > Money ? index : buy;
}
cout<<"Optimum: "<<index<<endl;
cout<<"Best sale: "<<Max<<endl;
return 0;
}
|