一、实验内容
题目1
从题1、2中任选一题 题目2
从题3—12中任选一题 二、实验目的
1. 了解时间步长仿真和事件步长仿真的概念
2. 掌握利用计算机模拟一些实际系统的一般原理和基本方法 3. 学会用计算机对一些随机现象和复杂系统进行动态模拟 三、注意事项
1. 时间步长对模拟结果的影响. 2. 随机数的生成法.
3. 在各种事件中正确找出作为步长的事件,明确事件间的触发关系、事件
对系统状态的影响、事件表的刷新
四、参考资料
①《数学建模与数学实验》第2版 赵静 但琦 高等教育出版社 ②《运筹学》杨茂盛 黄己立 西安建筑工业大学出版社 ③《数据结构》 严蔚敏 清华大学出版社 五、实验过程
(一)问题分析:该问题是?连续模型/离散模型;采用仿真方法?时间步
长仿真/事件步长仿真
(二)系统假设:包括随机数服从的分布 (三)符号说明:定义变量,含义说明 (四)模拟框图
(五)程序代码(语言不限)
(六)运行结果(包括部分中间过程和最后结果)
(七)模型检验:计算模型解析解,与仿真结果对比,检验仿真效果
六、结果及分析 原问题的回答及分析
题目: 学号 0 1 2 3 4 5 6 7 8 9 题号 1 2 3 4 5 6 7 8 9 10 11 12 题目 《数学建模实验》P335例1 盐水浓度变化 《数学建模实验》P338例2 库存问题 《数学建模实验》P345例2 可靠性问题 《运筹学》P319例3 排队论 《运筹学》P321例4 排队论 《运筹学》P323例5 排队论 《运筹学》P325例6 排队论 《运筹学》P328例7 排队论 《运筹学》P330例8 排队论 《运筹学》P341习题12.2 排队论 《运筹学》P342习题12.3 排队论 《运筹学》P343习题12.11 排队论 function out=MMSkteam(s,k,mu1,mu2,T) %多服务台
%s——服务台个数 %k——最大顾客等待数 %T——时间终止点
%mu1——到达时间间隔服从指数分布 %mu2——服务时间服从指数分布 %事件表:
% arrive_time——顾客到达事件 % leave_time——顾客离开事件 %mintime——事件表中的最近事件 %current_time——当前时间 %L——队长
%tt——时间序列 %LL——队长序列
%c——顾客到达时间序列 %b——服务开始时间序列 %e——顾客离开时间序列 %a_count——到达顾客数 %b_count——服务顾客数 %e_count——损失顾客数
%初始化
arrive_time=exprnd(mu1); leave_time=[]; current_time=0; L=0; LL=[L];
tt=[current_time]; c=[]; b=[]; e=[];
a_count=0; b_count=0; e_count=0;
%循环
while min([arrive_time,leave_time]) tt=[tt,current_time]; %记录时间序列 if current_time==arrive_time %顾客到达子过程 arrive_time=arrive_time+exprnd(mu1); % 刷新顾客到达事件 a_count=a_count+1; %累加到达顾客数 if L c=[c,current_time];%记录顾客到达时间序列 b=[b,current_time];%记录服务开始时间序列 leave_time=[leave_time,current_time+exprnd(mu2)];%产生新的顾客离开事件 leave_time=sort(leave_time);%离开事件表排序 elseif L c=[c,current_time];%记录顾客到达时间序列 else %顾客损失 e_count=e_count+1;%累加损失顾客数 end else %顾客离开子过程 leave_time(1)=[];%从事件表中抹去顾客离开事件 e=[e,current_time];%记录顾客离开时间序列 if L>s %有顾客等待 L=L-1; %更新队长 b=[b,current_time];%记录服务开始时间序列 leave_time=[leave_time,current_time+exprnd(mu2)]; leave_time=sort(leave_time);%离开事件表排序 else %无顾客等待 L=L-1; %更新队长 end end LL=[LL,L]; %记录队长序列 end Ws=sum(e-c(1:length(e)))/length(e); Wq=sum(b-c(1:length(b)))/length(b); Wb=sum(e-b(1:length(e)))/length(e); Ls=sum(diff([tt,T]).*LL)/T; Lq=sum(diff([tt,T]).*max(LL-s,0))/T; fprintf('到达顾客数:%d\\n',a_count)%到达顾客数 fprintf('服务顾客数:%d\\n',b_count)%服务顾客数 fprintf('损失顾客数:%d\\n',e_count)%损失顾客数 fprintf('平均逗留时间:%f\\n',Ws)%平均逗留时间 fprintf('平均等待时间:%f\\n',Wq)%平均等待时间 fprintf('平均服务时间:%f\\n',Wb)%平均服务时间 fprintf('平均队长:%f\\n',Ls)%平均队长 fprintf('平均等待队长:%f\\n',Lq)%平均等待队长 if k~=inf for i=0:s+k p(i+1)=sum((LL==i).*diff([tt,T]))/T;%队长为i的概率 fprintf('队长为%d的概率:%f\\n',i,p(i+1)); end else for i=0:3*s p(i+1)=sum((LL==i).*diff([tt,T]))/T;%队长为i的概率 fprintf('队长为%d的概率:%f\\n',i,p(i+1)); end end fprintf('顾客不能马上得到服务的概率:%f\\n',1-sum(p(1:s)))%顾客不能马上得到服务的概率 out=[Ws,Wq,Wb,Ls,Lq,p];
b_count=b_count+1;%累加服务顾客数b_count=b_count+1;%累加服务顾客数
因篇幅问题不能全部显示,请点此查看更多更全内容