报童卖报问题
问题描述: 某报童以每份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. 系统的假设:
(1) 模拟时间充分大;
(2) 报童购买报纸量介于销售量最小值与最大值之间;
(3)不考虑有重大事件发生时卖报的高峰期,也不考虑风雨天气时卖报的低谷期。
2. 问题分析
报童售报: a (零售价) > b(购进价) > c(退回价)
售出一份赚 a-b;退回一份赔 b-c
每天购进多少份可使收入最大,
购进太多?卖不完退回?赔钱
购进太少?不够销售?赚钱少
应根据需求确定购进量
每天需求量是随机的?每天收入是随机的
优化问题的目标函数应是长期的日平均收入,等于每天收入的期望
3. 符号假设
BUYMIN:每天的最小购买量 BUYMAX:每天的最大购买量
SIMUDAY:模拟时间
sell_amount:报童销售量 buy_amount: 报童购买量
percentage:销售百分率 ave_profit:总平均利润
loop_buy :当天购买量 loop_day :当天时间
4.建立模型
调查需求量的随机规律——每天需求量为 r 的概率 f(r), r=0,1,2… 设每天购进 n 份,日平均收入为 G(n)已知售出一份赚 a-b;退回一份赔 b-c
r,n,售出n,赚(a,b)n r,n,售出r,赚(a,b)r
,退回n,r,赔(b,c)(n,r) ,
n
G(n),[(a,b)r,(b,c)(n,r)]f(r),(a,b)nf(r),, ,01,, rnr
求 n 使 G(n) 最大
5. 计算机程序:在Matlab软件包中编程,共需两个,,文件: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