系统建模与仿真作业 下载本文

作业一:统计试验法解决报童问题

1.问题提出

报童问题是决策方面的一个简单例子。对一个报童来说,他每天由报社买来报纸,然后到街上去卖,当然他希望获得最大的利润。如果把报童问题看作一个系统,那么报纸、顾客、报童和利润就成了该系统的重要组成部分。问题在于,根据市场需求,报童寻求一个什么样的定货法则或策略才能使他所获得的利润最大。因为定货多了,如果市场需求小,卖不了将导致利润下降,甚至亏本;定货少了,如果市场需求量大,又失去了赚钱的机会。这样一来,定货法则或定货策略就成了报童能否赚取最大利润的关键。当然,最好是每天需要多少份就定多少份,但市场需求量是一个随机变量,这就需要每天用统计方法作出决策。

报童以每份0.5元的价格买进报纸,以0.8元的价格出售。根据长期统计,报童根据以前的卖报记录知道,每天的需求量有几种可能及出现的概率。对现有数据分析,得出报童每天最佳买进报纸量,使报童的平均总收入最大。

2.模型建立与求解

假定, Bn— 当天买进或订购的报纸数量

Sn— 当天社会需要报纸的数量,显然,它是一个随机变量 Dn— 当天卖掉的报纸数量

再假定,报童每天买进和卖出每份报纸的价格分别用 PB和PS表示,且 PS>PB,即卖出价大于买入价,则第 n 天的利润为

Pn=SnPS-BnPB

报童决定:当天订购报纸的数量等于前一天的市场需求量,即

Bn=Dn-1

而当天卖掉的报纸的数量n S 则由以下两个条件来决定

Dn ≤ Bn时,Sn=Dn Dn> Bn时,Sn=Bn

即是说,如果当天订购的报纸的数量大于需求量,当天卖掉的报纸的数量只能等于需求量;如果当天买的报纸的数量小于需求量,即当天卖掉的报纸的数量

等于当天订购量和当天需求量二者中的小者。

现在的问题是,前一天的需求量如何决定。报童决定利用过去一年的统计数字确定Dn-1。报童根据以前的卖报记录知道,每天的需求量有以下几种可能:40份,41份,42份,43份,44份, 45份,46份;并且统计出了相对频数,得到如右表的一组数据。

需求量Dn 相对频数 Pn 40 0.05 41 0.1 42 0.2 43 0.3 44 0.15 45 46 0.1 0.1 其需求量的平均值Dn=∑ i Pi=43. 10

最后,报童做了一个轮盘,并将其分成了七份,每份的大小分别等于每个需求量对应的频数,即需求量分别为40,41,…,46份报纸时,其轮盘上对应的面积分别为0.05,0.1,…,0.1类推。

这样,报童每天去订货之前转一次轮盘,指针所指的数量就作为前一天的需求量Dn-1。假定,第一天转了一次,Dn-1=45,即D0=45。作为第二天买报的依据;第二天又转了一次,D1 =44表示当天需求量,说明这一天订购44份,由于Bn>Dn,所以只卖掉44份,即Sn=Dn。……第六天又转了一次, D5 =41表示当天的需求量,说明这一天订购40份,由于Bn

3.实验结果

报童问题的10天的仿真结果

Sn 44 43 44 40 40 41 Pn 12.7 12.4 12.1 11.0 12.0 12.3 ∑Pn 12.7 25.1 37.2 48.2 60.2 72.5 41 41 42 43 11.3 12.3 12.6 11.4 83.8 96.1 108.7 120.1 表采用不同的决策准则时报童所获得的利润 N0 1 2 3 17天的利润 208.3元 207.0元 209.7元 100天的利润 1215.3元 1223.8元 1242.8元 500天的利润 6122.1元 6159.8元 6234.8元 报童使用的决策规则 Bn=Dn-1 Bn=(Dn-1+Dn-2)/2 Bn= 43 B1=D0 4 209.8元 1241.1元 6235.4元 B2=(D0+D1)/2 Bn=(D0+D1+…+Dn-1)]/n 说明: Bn-每天买入的报纸数量 Dn-每天社会的需求量 PB-每份报纸的买入价 Ps-每份报纸的卖出价 过去累计的需求量及相应的概率: 40 41 42 43 44 45 46 0.05 0.10 0.20 0.30 0.15 0.10 0.10

附录程序

#include #include

#define N 17 //天数 #define Ps 0.8 //卖出价 #define Pb 0.5 //进货价

int random() {

int Dn;

float temp; temp=rand()*100/(float)RAND_MAX;

if(temp<5) Dn=40; else if(temp<15) Dn=41; else if(temp<35) Dn=42; else if(temp<65) Dn=43;

else if(temp<80) Dn=44; else if(temp<90) Dn=45;

else

Dn=46; return Dn; }

void main() { int D[N+1],B[N+1],S[N+1]; int i;

double P[N+1];

double pn=0;

int j; int a=0;

printf(\ B S P pn\\n\

for(i=0; i<=N; i++) {

D[i]=random(); }

for(i=0; i<=N; i++) { D[i]=random();

/***1*****Bn=Dn-1***************/

// if(i!=N) B[i+1]=D[i]; /***2***Bn=

(Dn-1+Dn-2)/2*********/ /* if(i==0)B[i+1]=D[i]; if(i!=N)

B[i+2]=(D[i]+D[i+1])/2;*/ /***3****** Bn= 43**************/ // B[i]=43;

/***4****Bn=(D0+D1+…+Dn-1)]/n

***/ for(j=0,a=0;j

if(i!=0)

B[i]=a/i;

///////////////////////////////////////////////// if(D[i]

if(i!=0)

{ P[i]=S[i]*Ps-B[i]*Pb; pn+=P[i]; printf(\ %d %d %.1f %.1f\\n\ }

}

作业二:产生独立分布随机数和相关分布随机数

1.(0-1)之间的均匀分布:

概率密度函数: ?10?x?1P(x)??其他; ?0产生思想:采用乘同余法产生; 具体实现方法:xn+1=uxn(mod n);

参数:u一般取2a±3或5,a为正整数;x0为初始值一般取2b+1,b取正整数;

m一般取计算机的字长,其是控制所产生随机数的精度(即:小数点后的位数);

程序实现中取u=11,m=2^32,x0的取值是3,计算10000点随机数。 程序如下:

c=3; u=11; x(1)=3; M=2^32 for i=2:1:10000;

x(i)=mod(u *x(i-1)+c,M); end; x=x./M; e=mean(x); d=var(x); hist(x,20);

title('(0-1)均匀分布直方图');

text(0,-60,strcat('均值是',num2str(e)));

text(0.5,-60,strcat('方差是',num2str(d)));

3

运行结果如下: