报童问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

报童问题:

某报童以每份0.03元的价格买进报纸,以0.05元的价格售出,根据长期统计,报纸每天的销售量及百分率为 销售量 200 210 220 230 240 250 百分比 0.10 0.20 0.40 0.15 0.10 0.05

已知当天销售不出去的报纸,将以每份0.02元的价格退还给报社,试用模拟方法确定报童每天买进报纸数量,时报通的平均总收入为最大?

一、系统的假设:

(1) 模拟时间充分大;

(2) 报童购买报纸量介于销售量最小值与最大值之间;

(3)不考虑有重大事件发生时卖报的高峰期,也不考虑风雨天气时卖报的低谷期。

二、问题分析

报童购进数量应根据需求量确定,但需求量是随机的,所以报童每天如果购进的报纸太少,不够买的,会少赚钱;如果购进太多,卖不完就要赔钱,这样由于每天报纸的需求量是随机的,致使报童每天的收入也是随机的,因此衡量报童的收入,不能是报童每天的收入,而应该是他长期(几个月、一年)卖报的日平均收入。我们可以应用计算机模拟的方法 在模拟时间充分大的条件下(例如10000天),模拟每天的销售量,因而确定每天应买进多少报纸才能使平均总收入达到最大值。

设该问题的销售量为离散型随机变量η,η有分布列P(η =x i )=p i (i=1,2,…6)。所谓对离散型随机变量η的模拟, 其实质就是通过计算机上的模拟试验来取得在真实试验下的样本值 U,由分布列知U 只取数值x 1,x 2…中的某一个.对离散型随机变量η的一般模拟方法如下:

(1) 在直线上将[0 ,1]区间划分成若干个子区间, 其分点记为A 1,…A 2,A 6,分点A i 的坐标

∑p k =p k i k=1 (i=1,2,…6)

如下图所示:

0 A1 A2 A4 A5 1

x

p 1 p 1+p 2 ∑p k 4k=1 ∑p k 5k=1

(2)在计算机上取伪随机数rand ;

注释:计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。

(3)判定rand 在x 轴上所落的位置,若rand ∈(∑p k i−1k=1 ,∑p k i k=1),则可以认为 的一次真实试验样本值取x i

三、符号假设

BUYMIN :每天的最小购买量

BUYMAN :每天的最大购买量

SIMUDAY :模拟时间

sell_amount :报童销售量

buy_amount :报童购买量

percentage :销售百分率

ave_profit :总平均利润

loop_buy :当天购买量

loop_day :当天时间

计算机程序:在Matlab 软件包中编程,共需两个M-文件:main.m, Getprofit.m, 主程序为main.m.

% 主文件main.m

BUYMIN=200; 每天的最小购买量

BUYMAX=250; 每天的最大购买量

SIMUDAY=1.0e+5; 模拟时间 %

sell_amount=200:10:250; 销售量

percentage=[0.1 0.3 0.7 0.85 0.95 1 %] 百分率

buy_amount=0;

ave_profit=0;

for loop_buy=BUYMIN:BUYMAX

sum_profit=0;

for loop_day=1:SIMUDAY

index=find(percentage>=rand); %产生随机数,用于决定当天的销售量 sum_profit=sum_profit+GetProfit(loop_buy,sell_amount(index( 1)));

end

buy_amount=[buy_amount,loop_buy]; % 循环嵌套

ave_profit=[ave_profit,sum_profit/SIMUDAY]; % 循环嵌套

end

buy_amount(1)=[]; % 第一个元素置空

ave_profit(1)=[];

[val,id]=max(ave_profit) % 显示最大平均收入val

buy=buy_amount(id) % 显示在平均收入最大情况下的每天的购买量buy xlabel='每天的购买量';

ylabel='平均利润';

plot(buy_amount,ave_profit,'*:');

% 函数GetProfit.m代码:

function re=GetProfit(a,b)

if a

else % 供过于求:报童购买量大于销售量

re=b*(0.05-0.03)+(a-b)*(0.02-0.03);

end

运行结果:

val=4.2801 id=21 buy=220