计算机模拟 ] 经典报童问题 By EmilMatthew 06/03/31 1 问题的提出 : 经典的报童问题可描述如下 : 一报童从报刊发行处订报后零售,每卖出一分可获利 a" name="description" />

[计算机模拟]经典报童问题

发表于:2007-06-22来源:作者:点击数: 标签:
[ MI LY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">计算机模拟 ] 经典报童问题 By EmilMatthew 06/03/31 1 问题的提出 : 经典的报童问题可描述如下 : 一报童从报刊发行处订报后零售,每卖出一分可获利 a

   

[MILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">计算机模拟]经典报童问题

                                                                                                                By EmilMatthew

                                                                                                                       06/03/31

1问题的提出:

       经典的报童问题可描述如下:

       一报童从报刊发行处订报后零售,每卖出一分可获利a,若订报后卖不出去,则退回发行处,每分将要赔钱b.:报童如何根据以往的卖报情况(每天卖出k份的概率pk)来推算出每天收益达到最大的订报量Z*.

      

2思考:

       要使每天收益达到最大,也就是要使每天的亏损达到最小,考虑供过于求和供不于求的两种情况.

       设报童每天订报z,而报纸每天卖出y份,则y应有分布列:

       P(y=k)=pk          k=0,1,2…,     

      

a)       供过于求时,则退货期望数E(x1)=sigma((z-k)*pk) (0=<k<=z),平均损失为c1=b*E(x1).

b)      供不应求时,则缺货数量的期望值为:E(x2)=sigma((k-z)*pk) (k>=z+1),平均损失为:

c2=a*E(x2)

 

       有了以上分析,再加上适当的随机数生成,可以采用多次模拟,每次摸拟若干天,求出平均损失.再取其中的较小值即可.

 

3摸拟程序设计:

              MinKuiVal=MaxData;//最小亏损额

              Z=0;//摸拟的次数

              While(Z<ZMax)

              {

                            T=0;//每次摸拟的天数累计

SCount=0;//每次摸拟的总亏损量累计

SAvg=0;// 每次摸拟的平均亏损量

While(T<StimDays)

{

根据正态分布,成生各天卖出报的分数的概率值.(并规格化到0-1区间上)

根据供求关系选择计算亏损值adder.

SCount累加adder

T++       

}

                            SAvg=SCount/STimDays;

                            If(SAvg <MinKuiVal)

                                   MinKuiVal=SAvg

                     Z++

}

             

 

 

 

 

 

4代码[matlab]:

MinKuiVal=10000;

 

ZMax=15;

Z=0;

 

StimuDays=15;

 

T=0;

SCount=0;

SAvg=0;

 

a=0.2;

b=0.4;

 

ArrDay=[1:1:15];

KuiArr=[1:15];

 

while(Z<ZMax)

       T=0;SCount=0;SAvg=0;

      

       while(T<StimuDays)

              p=normrnd(4.5,2,1,15);

%normrnd(miu,fi,m,n)产生均值为miu,方差为fim*n阶正态分布的随机数矩阵.

             

              tempSum=sum(p);

             

              p=p./tempSum;

             

              disEZ=p.*ArrDay;

              EZ=sum(disEZ);

 

              if(Z>EZ)

                     SCount=SCount+(Z-EZ)*b;

              else

                     SCount=SCount+(EZ-Z)*a;

              end

 

              T=T+1

       end

 

       SAvg=SCount/StimuDays;

      

       if(SAvg<MinKuiVal)

              MinKuiVal=SAvg;

       end

      

       KuiArr(Z+1)=SAvg;

 

       Z=Z+1;

end

 

%outputAns

KuiArr

MinKuiVal

原文转自:http://www.ltesting.net