matlab 实验案例 理发店模拟
计算机仿真与建模实验报告
中南大学计算机仿真与建模实验报告题目:理发店的服务过程仿真姓名:XXXX班级:计科XXXX班学号:0909XXXX日期:2013XXXX理发店的服务过程仿真1 实验案例 (2)1.1 案例:理发店系统研究 (2)1.1.1 问题分析 (3)1.1.2 模型假设 (3)1.1.3 变量说明 (3)1.1.4 模型建立 (3)1.1.5 系统模拟 (4)1.1.6 计算机模拟算法设计 (5)1.1.7 计算机模拟程序 (6)1实验案例1.1 案例:理发店模拟一个理发店有两位服务员A和B顾客随机地到达该理发店,每分钟有一个顾客到达和没有顾客到达的概率均是1/2 , 其中60%的顾客理发仅用5分钟,另外40%的顾客用8分钟. 试对前10分钟的情况进行仿真。
(“排队论”,“系统模拟”,“离散系统模拟”,“事件调度法”)1.1.1 问题分析理发店系统包含诸多随机因素,为了对其进行评判就是要研究其运行效率,从理发店自身利益来说,要看服务员工作负荷是否合理,是否需要增加员工等考虑。
从顾客角度讲,还要看顾客的等待时间,顾客的等待队长,如等待时间过长或者等待的人过多,则顾客会离开。
理发店系统是一个典型的排队系统,可以用排队论有关知识来研究。
1.1.2 模型假设1.60%的顾客只需剪发,40%的顾客既要剪发,又要洗发; 2.每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟; 3.顾客的到达间隔时间服从指数分布; 4. 服务中服务员不休息。
1.1.3 变量说明u :剪发时间(单位:分钟),u=5m ;v: 既剪发又理发花的时间(单位:分钟),v=8m ;T : 顾客到达的间隔时间,是随机变量,服从参数为λ的指数分布,(单位:分钟)T 0:顾客到达的平均间隔时间(单位:秒),T 0=λ1;1.1.4 模型建立由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。
考虑一般理发店的工作模式,一般是上午9:00开始营业,晚上10:00左右结束,且一般是连续工作的,因此一般营业时间为13小时左右。
MATLAB教程第8章MATLAB综合实训
MATLAB教程第8章MATLAB综合实训MATLAB综合实训是对之前学过的知识进行综合运用的一个实践环节。
在该实训中,我们需要利用所掌握的MATLAB技能完成一个综合性的任务,包括数据处理、图像处理、信号处理等方面。
在本章中,我们将介绍MATLAB综合实训的基本要求和步骤,并给出一个具体的实例来帮助理解。
1.数据处理:从给定的数据集中提取出需要的数据,并进行相应的处理。
例如,计算数据的平均值、方差等统计量,或者对数据进行排序、过滤等操作。
2.图像处理:对给定的图像进行处理,可以包括图像增强、滤波、边缘检测等操作。
也可以利用图像处理工具箱中的函数完成一些特定的任务。
3.信号处理:对给定的信号进行处理,可以包括信号滤波、谱分析、频域变换等操作。
也可以利用信号处理工具箱中的函数完成一些特定的任务。
4. 建模与仿真:根据给定的问题,设计相应的数学模型,并进行仿真分析。
例如,可以利用ODE求解器求解一些常微分方程,或者使用Simulink进行系统级建模与仿真。
下面以一个实例来说明MATLAB综合实训的步骤和方法。
假设我们有一组学生成绩数据,包括学号、姓名和成绩。
我们需要完成以下任务:1.根据成绩对学生进行排名,并输出前5名学生的学号和姓名;2.计算所有学生的平均成绩和方差,并绘制成绩的直方图;3.根据成绩数据,计算学生之间的相关系数矩阵,并绘制热力图;4.假设我们有一个学生的成绩缺失,根据其他学生的成绩数据,利用K近邻算法进行插补;5.在插补后的数据上,利用线性回归建立学生的成绩预测模型,并进行模型评估。
首先,我们需要读取成绩数据。
可以使用MATLAB中的readtable函数将Excel文件中的数据读入到MATLAB的表格结构中。
```matlabdata = readtable('scores.xlsx');```接下来,我们可以根据成绩对学生进行排名,并输出前5名学生的学号和姓名。
matlab数学建模100例
matlab数学建模100例Matlab是一种强大的数学建模工具,广泛应用于科学研究、工程设计和数据分析等领域。
在这篇文章中,我们将介绍100个使用Matlab进行数学建模的例子,帮助读者更好地理解和应用这个工具。
1. 线性回归模型:使用Matlab拟合一组数据点,得到最佳拟合直线。
2. 多项式拟合:使用Matlab拟合一组数据点,得到最佳拟合多项式。
3. 非线性回归模型:使用Matlab拟合一组数据点,得到最佳拟合曲线。
4. 插值模型:使用Matlab根据已知数据点,估计未知数据点的值。
5. 数值积分:使用Matlab计算函数的定积分。
6. 微分方程求解:使用Matlab求解常微分方程。
7. 矩阵运算:使用Matlab进行矩阵的加减乘除运算。
8. 线性规划:使用Matlab求解线性规划问题。
9. 非线性规划:使用Matlab求解非线性规划问题。
10. 整数规划:使用Matlab求解整数规划问题。
11. 图论问题:使用Matlab解决图论问题,如最短路径、最小生成树等。
12. 网络流问题:使用Matlab解决网络流问题,如最大流、最小费用流等。
13. 动态规划:使用Matlab解决动态规划问题。
14. 遗传算法:使用Matlab实现遗传算法,求解优化问题。
15. 神经网络:使用Matlab实现神经网络,进行模式识别和预测等任务。
16. 支持向量机:使用Matlab实现支持向量机,进行分类和回归等任务。
17. 聚类分析:使用Matlab进行聚类分析,将数据点分成不同的类别。
18. 主成分分析:使用Matlab进行主成分分析,降低数据的维度。
19. 时间序列分析:使用Matlab进行时间序列分析,预测未来的趋势。
20. 图像处理:使用Matlab对图像进行处理,如滤波、边缘检测等。
21. 信号处理:使用Matlab对信号进行处理,如滤波、频谱分析等。
22. 控制系统设计:使用Matlab设计控制系统,如PID控制器等。
matlab大作业实验报告
matlab大作业学号姓名:年级:专业:1、产生一个10 10的随机矩阵A,要求A中元素均为整数,范围[1,50]。
1)求出A中所有元素之和S,平均值M。
2)找到所有小于平均值,且能被3整除的元素。
3)绘制出A的二维纵向柱状图,横坐标为[8 5 9 1 2 3 4 7 10 13],条形宽度为0.7的“stacked”样式。
代码如下:clc,clear all,close allA=round(rand(10,10)*50);disp(A)S=sum(sum(A));P=mean(mean(A));disp(S)disp(P)disp('所有小于平均数且能被三整除的元素')XPS=H((mod(H,3)==0)&(H<P));disp(XPS')subplot(1,1,1),bar(A,0.7,'stacked'),title('ygh');set(gca,'XTickLabel',{'8','5','9','1','2','3','4','7','10','13'})2、产生一个随机四位密码。
用户用“input”进行输入对比。
猜错提示“WRONG”,正确提示“RIGHT”同时退出程序,最多五次机会。
代码如下:clc,clear all,close alldisp('请输入密码')A=round(8999*rand(1,1))+1000;m=1;while m<=5N=input('请输入一个四位数:');if A==N;disp('RIGHT');breakelsedisp('WRONG');endm=m+1;enddisp('密码是:')disp(A)disp('输入结束')3、按照脚本文件的编程风格,用for和while循环嵌套输出如下的乘法口诀表。
如何使用MATLAB进行数据处理和模拟实验
如何使用MATLAB进行数据处理和模拟实验第一章:MATLAB简介MATLAB是一种强大的数值计算软件,广泛应用于科学与工程领域。
它具备丰富的数学和统计函数库,可以进行各种数据处理和模拟实验。
在本章中,我们将简要介绍MATLAB的基本特点和使用方法。
1.1 MATLAB的特点MATLAB具备以下特点:(1)矩阵计算:MATLAB内置了矩阵运算功能,使得数据处理更加简便和高效。
(2)图形显示:MATLAB可以生成高质量的二维和三维图形,方便数据可视化。
(3)函数丰富:MATLAB内置了大量的数学和统计函数,能够满足各种数值计算需求。
(4)易于学习:MATLAB的语法简单易懂,上手较容易,适合初学者。
1.2 MATLAB的安装和启动要使用MATLAB进行数据处理和模拟实验,首先需要安装MATLAB软件。
(1)从MathWorks官方网站下载MATLAB安装程序。
(2)运行安装程序,并按照提示进行安装。
(3)安装完成后,通过启动菜单或桌面图标启动MATLAB。
1.3 MATLAB的基本语法MATLAB的语法类似于其他编程语言,主要包括变量定义、函数调用、循环和条件判断等基本操作。
(1)变量定义:使用等号将数值或表达式赋给变量,例如:x = 2.5。
(2)函数调用:通过函数名和参数调用函数,例如:y =sin(x)。
(3)循环:使用for或while循环重复执行一段代码,例如:for i = 1:10。
(4)条件判断:使用if语句根据条件执行不同的代码块,例如:if x > 0。
第二章:数据处理数据处理是指从原始数据中提取、转换和整理信息的过程。
在MATLAB中,通过使用各种数据处理函数和工具箱可以实现对数据的各种操作。
2.1 数据导入和导出MATLAB支持多种数据格式的导入和导出,包括文本文件、Excel文件、图像文件等。
通过导入数据,可以将数据加载到MATLAB工作空间中进行处理。
(1)导入文本文件:使用readtable函数可以将文本文件中的数据读取为一个表格变量。
MATLAB实训报告
MATLAB实训报告摘要:本实训通过运用MATLAB软件进行数据分析和图像处理的实践,深入了解MATLAB的基本操作和功能,通过对实际问题进行实践,提高了数据分析和图像处理的能力。
本实训将主要内容分为两个部分,第一部分是数据分析,主要包括数据导入、数据处理、数据统计和数据可视化;第二部分是图像处理,主要包括图像读取、灰度转换、滤波处理和图像增强。
实训结果表明,通过MATLAB可以方便快捷地进行数据分析和图像处理,提高了数据分析和图像处理的效率和精度。
关键词:MATLAB,数据分析,图像处理,数据可视化,图像增强一、引言MATLAB是一款功能强大的科学计算和工程仿真软件,广泛应用于科学研究、工程设计和教学领域。
MATLAB提供了丰富的函数库和工具箱,可以用于数据处理、图像处理、信号处理、优化和统计分析等应用。
本实训旨在通过实践,掌握MATLAB的基本操作和功能,提高数据分析和图像处理的能力。
二、数据分析1.数据导入首先,我们需要将要分析的数据导入到MATLAB中。
MATLAB支持导入多种数据文件,如Excel、文本文件、MAT文件等。
在实训过程中,我们将导入一个Excel文件,其中包含了企业一段时间内的销售额数据。
通过使用MATLAB的“xlsread”函数,我们成功将Excel文件导入到MATLAB 中。
2.数据处理在数据导入之后,我们需要对数据进行进一步的处理。
MATLAB提供了丰富的数据处理函数,如数据排序、数据筛选、数据合并等。
在实训中,我们对导入的销售额数据进行了排序和筛选。
通过使用MATLAB的“sort”和“find”函数,我们可以方便地对数据进行排序和筛选。
3.数据统计在数据处理之后,我们可以进一步对数据进行统计分析。
MATLAB提供了丰富的统计分析函数,如均值、方差、相关系数等。
在实训中,我们对销售额数据进行了均值和方差的计算。
通过使用MATLAB的“mean”和“var”函数,我们可以方便地计算数据的均值和方差。
《Matlab基础与应用》实训指导书
《MATLAB基础与应用》实训指导书目录实训一认识MATLAB实训二 MATLAB数据操作实训三 MATLAB程序设计(一)实训四 MATLAB程序设计(二)实训五 MATLAB二维绘图实训六 MATLAB特殊二维绘图实训七 MATLAB三维绘图实训八 MATLAB符号函数的运算实训九 MATLAB符号微积分实训十 MATLAB符号方程求解实训十一 MATLAB数据分析与统计实训十二 MATLAB数值运算实训十三 MATLAB常微分方程的数值求解实训十四认识GUI实训十五图形用户界面设计实训十六 Simulink仿真实训十七 MATLAB综合实训(一)实训十八 MATLAB综合实训(二)实训一 认识MATLAB【实训目的】1.认识MATLAB 操作界面2.MATLAB 帮助系统的使用方法 3.掌握数据操作的有关知识 【主要软件设备】MATLAB 软件 【实训内容】1.认识MATLAB 操作界面2.MATLAB 帮助系统的使用方法 3.掌握数据操作的有关知识 【实训题目】1.通过帮助浏览器查找max 函数的用法。
2.通过帮助浏览器查找并比较ceil 、floor 、fix 、round 、rem 和sign 函数的用法。
3.gcd 函数用于求两个整数的最大公约数。
先用help 命令查看该函数的用法,然后利用该函数求15和35的最大公约数。
4.已知A=2.1,B=-4.5,C=6,D=3.5,E=-5,计算⎪⎪⎪⎪⎭⎫⎝⎛+D BC E A ππ22arctan 的值。
5.已知96.4=a ,11.8=b ,计算)ln(b a e ba +-的值。
【实训注意事项】1. 在所实训的机房,必须保持机房的整洁2. 在所实训机房,未经允许不要对计算机进行操作及其他操作3. 实训必须按照实训报告要求进行 【实训报告要求】1. 通过帮助浏览器查找函数的用法在实训报告上只填写所编程序2. 数据操作的有关知识的程序必须按照MATLAB 软件上所编程序书写,书写格式一定要正确实训二 MATLAB 数据操作【实训目的】1.掌握数据操作的有关知识 2.掌握矩阵的基本运算 3.掌握数据和文件操作 【主要软件设备】MATLAB 软件 【实训内容】1.矩阵的基本运算 2.数据和文件操作3.理解数据操作的有关知识 【实训题目】1.已知矩阵101241205A -⎡⎤⎢⎥=⎢⎥⎢⎥-⎣⎦、010213112B -⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,求2A+B 、23A B -、A*B 、B*A 、A.*B 、A\B 、 A/B 、A. \B 、A. /B 。
matlab实验案例 一个修理厂的模拟
实验案例 一个修理厂的模拟1 实验案例 (1)1.1 案例:一个修理厂的模拟 (1)1.1.1 问题描述 (1)1.1.2 模拟模型 (1)1.1.3 模拟程序 (2)1.1.4 模拟结果 (3)1 实验案例1.1 案例:一个修理厂的模拟1.1.1 问题描述某修理厂设有3个停车位置,其中一个位置供正在修理的汽车停放。
现以一天为一个时段,每天最多修好一辆车,每天到达修理站的汽车数有如下概率分布:到达数 0 1 2概率 0.6 0.2 0.2假定在一个时段内一辆汽车能够修好的概率为0.7,本时段内未能完成修理的汽车于正在等待修理的汽车一起进入下一时段。
试问:该停车厂有无必要增加停车位置,并说明理由。
1.1.2 模拟模型这种排队论方面的问题采用固定时间增量法模拟。
模拟以一天为一个时段,模拟纵时间最好在1000天以上。
模拟汽车到达数量,根据概率分布:产生在[0,1]上均匀分布的随机数t ,如果6.00<≥t t 且,则认为当天到达的车辆数为0辆;如果8.06.0<≥t t 且,则认为当天到达的车辆数为1辆,如果18.0<≥t t 且,则认为当天到达的车辆数为2辆。
模拟修理情况:由于一天最多修好一辆,而一个时段内一辆汽车修好的概率为0.7,则模拟每两车的修理情况,如果这些车所能修好数目大于等于1辆,则以当天修好1辆计。
1.1.3模拟程序本模拟程序编写了一个主函数queue,另外在函数queue中编写了2个子函数:getcome:模拟车辆到来情况,返回当天到来的车辆数目getrepaired:模拟修理情况,返回修好的车辆数目整个模拟程序如下:(2005/6/6新版本)function queue%2005-6-6%排队模拟主程序%排队问题模拟%numdays=input('请输入模拟天数:')numstay=0;%假定最初修理站还没有待修理的汽车LEN=6;%定义常量matfrequence=zeros(1,LEN);%第i个元素表示当天末还有i-1辆车在没有修好的时段频数leave_norepair=0;%存储来到,但没有停车位置而离开的车辆数for days=1:numdays%主循环,模拟numdays个时段temp= getcome;if numstay + temp>3 ,leave_norepair = leave_norepair + (numstay + temp - 3);end%numcome=numstay+getcome;%2004-10-10:这里有问题,受限制与停车位置数量numcome=min(3,numstay + temp);%%头一天还没有修好的车辆数+当天新到来的车辆数%numstay表示当天末还没有修理好的车辆数目numstay=max(0,numcome - getrepaired(numcome));% matfrequence(numstay+1)=matfrequence(numstay+1) + 1 ; endmatfrequenceprob=matfrequence/numdaysdisp(sprintf('平均每天夜里停放在修理站的车辆数=%4.2f',...sum(matfrequence/numdays.*[0:LEN-1])))%sprintf('=%.4f',sum(matfrequence/numdays.*[0:LEN-1])) disp(sprintf('平均每天因位置而未修理而离开修理站的车辆数=%4.2f',...leave_norepair/numdays))%sprintf('=%.4f',leave_norepair/numdays)leave_norepairfunction num=getcome%模拟车辆到来情况,返回当天到来的车辆数目t=rand;if t>=0 & t<0.6num= 0;%当天到来车俩数为0辆elseif t>=0.6 & t<0.8num=1;%当天到来车俩数为1辆elsenum=2;%当天到来车俩数为2辆endfunction r=getrepaired(num_cur)%模拟修理情况,返回修好的车辆数目%n为需要修理的车辆数目%r为n辆车修好了r辆%num_cur 当前(天)车辆数r=0;if num_cur<=0,%如果根本没有车,当然就没有修好车returnend%只考虑当前正在修的这辆车是否能够修好if rand<0.7,%(0,0.7) 认为修好,[0.7,1)认为没有修好r=1;end1.1.4模拟结果程序运行结果如下:请输入模拟天数: (100): 10000numdays =10000matfrequence =4230 2729 2375 666 0 0 prob =0.4230 0.2729 0.2375 0.0666 0 0平均每天夜里停放在修理站的车辆数=0.95平均每天因位置而未修理而离开修理站的车辆数=0.09leave_norepair =883模拟10000次的结果如下表所示:留夜的车辆数0 1 2 3频数4230 2729 2375 666频率0.4230 0.2729 0.2375 0.0666 最后得到平均每天夜里停放在修理站的车辆数约为0.95辆。
数学建模——理发店问题的蒙特卡洛仿真
数学建模课程设计题目:理发店问题学生:一、课程设计题目一个理发店有两位服务员A 和B,顾客们随机到达店内,其中60% 的顾客仅剪发,每位花5 分钟时间;40% 的顾客既剪发又洗发,每位花8 分钟时间。
设计算法,利用计算机对理发店的服务情况进行模拟。
并统计以下量:1. 最大队列长度2. 顾客平均等待3. 顾客总等待时间4. 平均队列长度二、设计思路利用蒙特卡洛模拟原理,利用计算机对以上排队问题进行模拟。
蒙特卡洛(Monte Carlo)模拟是一种通过设定随机过程,反复生成时间序列,计算参数估计量和统计量,进而研究其分布特征的方法。
具体的,当系统中各个单元的可靠性特征量已知,但系统的可靠性过于复杂,难以建立可靠性预计的精确数学模型或模型太复杂而不便应用时,可用随机模拟法近似计算出系统可靠性的预计值;随着模拟次数的增多,其预计精度也逐渐增高。
蒙特卡洛模拟方法的原理是当问题或对象本身具有概率特征时,可以用计算机模拟的方法产生抽样结果,根据抽样计算统计量或者参数的值;随着模拟次数的增多,可以通过对各次统计量或参数的估计值求平均的方法得到稳定结论。
对于本题,我们假定顾客到达时间间隔服从均值为3min的指数分布,模拟一定数量顾客情况下理发店的排队状况。
三、设计代码arrive_t=exprnd(3,10,1); %顾客到达时间q=zeros(10,1);t=zeros(10,1);t0=zeros(10,1);rannum=unifrnd(0,1,10,1);%产生均匀分布随机数customer=zeros(10,1);%设定顾客wait_time1=0;wait_time2=0;flag=0;%确定是否有人等待for i=1:10%分出第一种和第二种状况if(rannum(i,1)<=0.6)customer(i,1)=5;%只剪elsecustomer(i,1)=8;%剪和洗endendtf=0;t(1,1)=tf+arrive_t(1,1);%到达时间wait_time=0;%等待时间t0(1,1)=t(1,1)+customer(1,1);%服务时间q(1,1)=0;%队列长度t(2,1)=t(1,1)+arrive_t(2,1);t0(2,1)=t(2,1)+customer(2,1);t(3,1)=t(2,1)+arrive_t(3,1);if (t(3,1)>t0(2,1)||t(3,1)>t0(2,1))t0(3,1)=t(3,1)+customer(3,1);elsewait_time1=t0(1,1)-t(3,1);wait_time2=t0(2,1)-t(3,1);if (wait_time1>wait_time2)t0(3,1)=t(3,1)+wait_time2+customer(3,1);wait_time=wait_time2;elset0(3,1)=t(3,1)+wait_time1+customer(3,1);wait_time=wait_time1;endendi=4;while(i<=10)t(i,1)=t(i-1,1)+arrive_t(i,1);q(i,1)=q(i-1,1)+1;wait_time1=t0(i-1,1)-t(i,1);wait_time2=t0(i-2,1)-t(i,1);if (flag==0)if (wait_time1>0)&&(wait_time2>0)if wait_time1>wait_time2flag=1;t0(i,1)=t(i,1)+wait_time2+customer(i,1); wait_time=wait_time+wait_time2;elseflag=1;t0(i,1)=t(i,1)+wait_time1+customer(i,1); wait_time=wait_time+wait_time1;endi=i+1;elseif (wait_time1<=0)&&(wait_time2>0)t0(i,1)=t(i,1)+customer(i,1);q(i)=q(i)-1;flag=0;i=i+1;elseif (wait_time1>0)&&(wait_time2<=0)t0(i,1)=t(i,1)+customer(i,1);q(i)=q(i)-1;flag=0;i=i+1;elseif (wait_time1<=0)&&(wait_time2<=0)t0(i,1)=t(i,1)+customer(i,1);q(i)=q(i)-1;flag=0;i=i+1;endelsewait_time1=t0(i-2,1)-t(i-1,1)-arrive_t(i,1);wait_time2=t0(i-3,1)-t(i-1,1)-arrive_t(i,1);if wait_time1>wait_time2t0(i,1)=t(i,1)+wait_time2+customer(i,1);wait_time=wait_time+wait_time2;elset0(i,1)=t(i,1)+wait_time1+customer(i,1);wait_time=wait_time+wait_time1;endflag=0;endendave_t=t(10,1)./1;ave_q=wait_time./t(10,1);maxq=max(q);fprintf('最大队列长度%f\n',maxq);fprintf('总等待时间%f\n',wait_time);fprintf('平均等待时间%f\n',ave_t);fprintf('平均队列长度%f\n',ave_q);四、运行结果运行一次程序,可以得到以下结果(依据蒙特卡洛仿真原理,每次结果会在一定范围内波动)最大队列长度7.000000总等待时间 93.656144平均等待时间 19.465428平均队列长度 4.811410。
MATLAB智能算法30个案例分析
MATLAB 智能算法30个案例分析第1 章1、案例背景遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。
遗传算法的做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。
在遗传算法中,染色体对应的是数据或数组,通常是由一维的串结构数据来表示,串上各个位置对应基因的取值。
基因组成的串就是染色体,或者叫基因型个体( Individuals) 。
一定数量的个体组成了群体(Population)。
群体中个体的数目称为群体大小(Population Size),也叫群体规模。
而各个个体对环境的适应程度叫做适应度( Fitness) 。
2、案例目录:1.1 理论基础1.1.1 遗传算法概述1. 编码2. 初始群体的生成3. 适应度评估4. 选择5. 交叉6. 变异1.1.2 设菲尔德遗传算法工具箱1. 工具箱简介2. 工具箱添加1.2 案例背景1.2.1 问题描述1. 简单一元函数优化2. 多元函数优化1.2.2 解决思路及步骤1.3 MATLAB程序实现1.3.1 工具箱结构1.3.2 遗传算法中常用函数1. 创建种群函数—crtbp2. 适应度计算函数—ranking3. 选择函数—select4. 交叉算子函数—recombin5. 变异算子函数—mut6. 选择函数—reins7. 实用函数—bs2rv8. 实用函数—rep1.3.3 遗传算法工具箱应用举例1. 简单一元函数优化2. 多元函数优化1.4 延伸阅读1.5 参考文献3、主程序:1. 简单一元函数优化:clcclear allclose all%% 画出函数图figure(1);hold on;lb=1;ub=2; %函数自变量范围【1,2】ezplot('sin(10*pi*X)/X',[lb,ub]); %画出函数曲线xlabel('自变量/X')ylabel('函数值/Y')%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=20; %最大遗传代数PRECI=20; %变量的二进制位数GGAP=0.95; %代沟px=0.7; %交叉概率pm=0.01; %变异概率trace=zeros(2,MAXGEN); %寻优结果的初始值FieldD=[PRECI;lb;ub;1;0;1;1]; %区域描述器Chrom=crtbp(NIND,PRECI); %初始种群%% 优化gen=0; %代计数器X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换ObjV=sin(10*pi*X)./X; %计算目标函数值while gen<MAXGENFitnV=ranking(ObjV); %分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP); %选择SelCh=recombin('xovsp',SelCh,px); %重组SelCh=mut(SelCh,pm); %变异X=bs2rv(SelCh,FieldD); %子代个体的十进制转换ObjVSel=sin(10*pi*X)./X; %计算子代的目标函数值[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群X=bs2rv(Chrom,FieldD);gen=gen+1; %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I]=min(ObjV);trace(1,gen)=X(I); %记下每代的最优值trace(2,gen)=Y; %记下每代的最优值endplot(trace(1,:),trace(2,:),'bo'); %画出每代的最优点grid on;plot(X,ObjV,'b*'); %画出最后一代的种群hold off%% 画进化图figure(2);plot(1:MAXGEN,trace(2,:));grid onxlabel('遗传代数')ylabel('解的变化')title('进化过程')bestY=trace(2,end);bestX=trace(1,end);fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])2. 多元函数优化clcclear allclose all%% 画出函数图figure(1);lbx=-2;ubx=2; %函数自变量x范围【-2,2】lby=-2;uby=2; %函数自变量y范围【-2,2】ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线hold on;%% 定义遗传算法参数NIND=40; %个体数目MAXGEN=50; %最大遗传代数PRECI=20; %变量的二进制位数GGAP=0.95; %代沟px=0.7; %交叉概率pm=0.01; %变异概率trace=zeros(3,MAXGEN); %寻优结果的初始值FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %区域描述器Chrom=crtbp(NIND,PRECI*2); %初始种群%% 优化gen=0; %代计数器XY=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换X=XY(:,1);Y=XY(:,2);ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算目标函数值while gen<MAXGENFitnV=ranking(-ObjV); %分配适应度值SelCh=select('sus',Chrom,FitnV,GGAP); %选择SelCh=recombin('xovsp',SelCh,px); %重组SelCh=mut(SelCh,pm); %变异XY=bs2rv(SelCh,FieldD); %子代个体的十进制转换X=XY(:,1);Y=XY(:,2);ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子代的目标函数值[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群XY=bs2rv(Chrom,FieldD);gen=gen+1; %代计数器增加%获取每代的最优解及其序号,Y为最优解,I为个体的序号[Y,I]=max(ObjV);trace(1:2,gen)=XY(I,:); %记下每代的最优值trace(3,gen)=Y; %记下每代的最优值endplot3(trace(1,:),trace(2,:),trace(3,:),'bo'); %画出每代的最优点grid on;plot3(XY(:,1),XY(:,2),ObjV,'bo'); %画出最后一代的种群hold off%% 画进化图figure(2);plot(1:MAXGEN,trace(3,:));grid onxlabel('遗传代数')ylabel('解的变化')title('进化过程')bestZ=trace(3,end);bestX=trace(1,end);bestY=trace(2,end);fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str(bestZ), '\n']) 第2 章基于遗传算法和非线性规划的函数寻优算法1.1案例背景1.1.1 非线性规划方法非线性规划是20世纪50年代才开始形成的一门新兴学科。
Matlab实验报告_2
实验一 Matlab基础知识一、实验目的:1.熟悉启动和退出Matlab的方法。
2.熟悉Matlab命令窗口的组成。
3.掌握建立矩阵的方法。
4.掌握Matlab各种表达式的书写规则以及常用函数的使用。
二、实验内容:1.求[100,999]之间能被21整除的数的个数。
(rem)2.建立一个字符串向量,删除其中的大写字母。
(find)3.输入矩阵,并找出其中大于或等于5的元素。
(find)4.不采用循环的形式求出和式6312ii=∑的数值解。
(sum)三、实验步骤:●求[100,199]之间能被21整除的数的个数。
(rem)1.开始→程序→Matlab2.输入命令:»m=100:999;»p=rem(m,21);»q=sum(p==0)ans=43●建立一个字符串向量,删除其中的大写字母。
(find)1.输入命令:»k=input('’,’s’);Eie48458DHUEI4778»f=find(k>=’A’&k<=’Z’);f=9 10 11 12 13»k(f)=[ ]K=eie484584778●输入矩阵,并找出其中大于或等于5的元素。
(find)1.输入命令:»h=[4 8 10;3 6 9; 5 7 3];»[i,j]=find(h>=5)i=3 j=11 22 23 21 32 3●不采用循环的形式求出和式的数值解。
(sum)1.输入命令:»w=1:63;»q=sum(2.^w)q=1.8447e+019实验二 Matlab 基本程序一、 实验目的:1. 熟悉Matlab 的环境与工作空间。
2. 熟悉M 文件与M 函数的编写与应用。
3. 熟悉Matlab 的控制语句。
4. 掌握if,switch,for 等语句的使用。
二、 实验内容:1. 根据y=1+1/3+1/5+……+1/(2n-1),编程求:y<5时最大n 值以及对应的y 值。
最新用matlab解析实际案例
Matlab大作业专业:东凌经济管理学院班级:小组成员:2012年5月1成员分工:**(组长):第一题模型一建立,文档编写***:第一题模型二建立,文档编写***:第二题模型建立2第一题某小型超市出售某一品牌八宝粥,其需求量与消费者平均收入和商品价格密切相关,根据近期几个月每一个月的消费记录以及消费者收入市场调查,统计如下表。
现在在一个地区新建一所同样的超市,出售同样一款八宝粥,该超市附近消费者平均收入为4000元,超市经理想知道八宝粥定价6元时,进多少货才会比较合适。
需求量100 75 80 70 50 65 90 100 110 60 收入4000 2400 4800 2000 1200 1600 5200 4400 5200 1200 价格 5 7 6 6 8 7 5 4 3 92.1 基本假设1)假设该品牌八宝粥的超市库存量与需求量一致,不存在多余库存。
2)假设超市每个月就进一次货。
3)假设超市之前调查的数据充分准确。
4)假设在新超市,人群收入以及商品价格对需求量的影响与之前规律类似。
5)假设该品牌八宝粥的需求量除了与消费者收入和商品价格有关,其他因素影响很小,可以忽略不计。
2.2 符号设定:消费者收入向量。
)(income I:商品价格向量。
)(price P :商品需求向量。
)(t requiremen R2.3 模型建立2.3.1 模型分析:因为有商品价格P 和消费者收入I 两个参数对商品需求量R 产生影响,所以我们选择采用回归模型解决这个问题。
模型一:多元二项式回归模型222211210P I P I R βββββ++++=Matlab 程序:I=[4000 2400 4800 2000 1200 1600 5200 4400 5200 1200]; P=[5 7 6 6 8 7 5 4 3 9];R=[100 75 80 70 50 65 90 100 110 60]; f=[I' P'];rstool(f,R','purequadratic')程序运行结果以及图像:预测结果beta =110.53130.0366-26.5709-4.7229*10^(-6)1.8475rmse =4.5362residuals =5.2724-0.7162-4.5158-1.9390-3.33153.45663.4843-3.4452-0.09761.8320结果分析:由实验可得回归模型为:228475.1)6(^10*7229.4-5709.260366.05313.110P I P I R +--+=,因为剩余标准差为4.5362,说明此回归模型的显著性较好。
MATLAB综合应用实例分享与解析
MATLAB综合应用实例分享与解析近年来,作为一种功能强大且易于使用的科学计算软件,MATLAB在各个领域都有着广泛的应用。
它不仅可以进行数值计算、数据可视化和矩阵操作,还可以进行图像处理、机器学习、信号处理等复杂的科学研究。
本文将介绍几个MATLAB的综合应用实例,并对其实现原理进行解析,希望能够帮助读者更好地了解和使用MATLAB。
一、图像处理在图像处理领域,MATLAB具有强大的功能和丰富的工具箱。
下面以图像去噪和图像分割为例,介绍MATLAB在图像处理方面的应用。
1. 图像去噪图像去噪是图像处理的一项重要任务,可以提高图像的质量和清晰度。
MATLAB提供了一系列的去噪函数,其中最常用的是基于小波变换的方法。
首先,将图像进行小波分解得到各个频率分量,然后通过阈值处理将一些较小的分量置零,最后对处理后的分量进行小波逆变换得到去噪后的图像。
2. 图像分割图像分割是将图像划分为不同的区域或对象的过程,是图像分析和计算机视觉中的重要步骤。
MATLAB利用图像的灰度值、颜色信息或纹理特征等进行图像分割。
其中,最常用的方法是基于阈值的分割和基于区域的分割。
基于阈值的分割通过选择适当的阈值将图像转化为二值图像,而基于区域的分割则使用聚类分析或图割算法将图像划分为多个区域。
二、数值计算除了图像处理,MATLAB在数值计算方面也具有强大的功能。
下面以微分方程求解和曲线拟合为例,介绍MATLAB在数值计算方面的应用。
1. 微分方程求解微分方程是描述自然界中变化规律的重要数学工具,MATLAB提供了多种求解微分方程的函数。
对于常微分方程,可以使用ode45函数进行数值求解。
该函数通过自适应步长方法,将微分方程转化为差分方程,并使用龙格-库塔方法进行积分。
对于偏微分方程,可以使用pdepe函数进行求解。
该函数基于有限差分或有限元等方法,将偏微分方程转化为代数方程组,并通过迭代求解得到结果。
2. 曲线拟合曲线拟合是通过已知数据点来估计未知函数的方法,MATLAB提供了polyfit和lsqcurvefit等函数来进行曲线拟合。
(物联网)MATLAB智能算法个案例分析
(物联网)MATLAB智能算法个案例分析MATLAB 智能算法30个案例分析智能算法是我们在学习中经常遇到的算法,主要包括遗传算法,免疫算法,粒子群算法,神经网络等,智能算法对于很多人来说,既爱又恨,爱是因为熟练的掌握几种智能算法,能够很方便的解决我们的论坛问题,恨是因为智能算法感觉比较“玄乎”,很难理解,更难用它来解决问题。
因此,我们组织了王辉,史峰,郁磊,胡斐四名高手共同写作MATLAB智能算法,该书包含了遗传算法,免疫算法,粒子群算法,鱼群算法,多目标pareto算法,模拟退火算法,蚁群算法,神经网络,SVM等,本书最大的特点在于以案例为导向,每个案例针对一个实际问题,给出全部程序和求解思路,并配套相关讲解视频,使读者在读过一个案例之后能够快速掌握这种方法,并且会套用案例程序来编写自己的程序。
本书作者在线,读者和会员可以向作者提问,作者做到有问必答。
本书和目录如下:1 基于遗传算法的TSP算法(王辉)TSP (旅行商问题—Traveling Salesman Problem),是典型的NP完全问题,即其最坏情况下的时间复杂性随着问题规模的增大按指数方式增长,到目前为止不能找到一个多项式时间的有效算法。
遗传算法是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。
遗传算法的做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。
实践证明,遗传算法对于解决TSP问题等组合优化问题具有较好的寻优性能。
2 基于遗传算法和非线性规划的函数寻优算法(史峰)遗传算法提供了求解非线性规划的通用框架,它不依赖于问题的具体领域。
遗传算法的优点是将问题参数编码成染色体后进行优化,而不针对参数本身,从而不受函数约束条件的限制;搜索过程从问题解的一个集合开始,而不是单个个体,具有隐含并行搜索特性,可大大减少陷入局部最小的可能性。
[精品]以队列实现的仿真技术预测理发馆的经营状况
[精品]以队列实现的仿真技术预测理发馆的经营状况实验三以队列实现的仿真技术预测理发馆的经营状况 ,问题描述,
为理发馆的排队模拟问题添加预测经营状况的功能。
每个顾客有选择理发师的服务要求,理发师分三个等级(一级、二级和三级),对应不同的服务收费。
当顾客进门时,如果想选择某级理发师,只要该级别的理发师不空闲,就将排队侯理。
程序将统计每天的营业额和不同级别理发师的创收。
,基本要求,
每个顾客进门时将生成三个随机数(durtime,intertime,select),其中,durtime和intertime的意义同本章前面的示例,select是服务选项,通过
select=1+R%3来求得。
服务收费由durtime*(4-select)*0.4(元)计算,该式包含着服务需要的时间和理发师的级别两项因素。
,测试数据,
测试数据:营业时间480分钟,7把理发椅,1,2号、3,4号、5,7号理发椅分别对应一级、二级和三级理发师。
,实现提示,
对理发椅需要进行编号,使不同级别的理发师与编号的理发椅相对应。
队列和事件表应增加理发师选项的数据信息。
,问题讨论,
在处理模拟问题时,对数据模拟的越真实,模拟效果越好。
为此,可以从真实的数据中提炼数据模型。
读者可以根据真实的数据模型进一步修改算法。
计算机仿真-理发店
实验二理发店仿真一、实验要求某理发店有2名理发员,他们为顾客的服务时间为20min±3min,服从正态分布。
顾客相继到达的间隔服从μ=10的指数分布。
顾客到达后,如发现店内有6人以上在排队等待,30%的顾客便离去,其余的人继续等待。
要求:建模、仿真、一天10小时营业。
统计:①理发员实际服务人数;②平均队长和因人数过多离去的人数;③α=0.05计算置信区间。
二、算法流程1、我们假设当理发店开门营业时,第一个顾客进来;2、当一个顾客进来,我们生成两个随机数:服务时间、下一个顾客进来的时间间隔,并进行判断是否可以为其进行服务;3、系统时间每隔一个时间段进行检查:(1)、判断有没有人服务时间结束,如果有就释放理发的位子;(2)、判断是否有人正在排队,若有空位,则排队的人可以进行服务;(3)、判断是否有下一个顾客到达,如果有则进行第2步4、当系统时间达到10小时时,理发店服务时间结束,进行各项数据统计。
三、仿真实验1、程序#include <iostream>#include <cmath>#include <sys/timeb.h>#include <stdlib.h>#define MAX 30000#define TRUE 1#define FALSE 0#define xhcs 120#define tfenbu 1.98#define pi 3.141592654#define naturee 2.718281828using namespace std;double sernum[xhcs],len[xhcs],leanum[xhcs];double avg_serve,avg_len,avg_leave;double s_serve,s_len,s_leave;double t_serve,t_len,t_leave;int R;double R1,R2; //随机数double wait_length=0; //等待队列的总长度int totalnum=0; //总共顾客数int servenum=0; //理发员实际服务人数 int leavenum=0; //离开的顾客的人数double totaltime=0; //顾客理发所需总时间 double curtime=0; //当前时间int chairnum=2; //当前可用的椅子数typedef struct customer{int NO; //编号double intime; //进入理发店时间double durtime; //进门顾客理发所需服务时间 double intertime; //下个顾客将到达的时间间隔 double starttime; //开始理发时间double leavetime; //离开理发店的时间int serve_flag; //是否在理发}customer;customer cus[MAX];typedef struct Qnode{int num; //理发者的编号struct Qnode *next;}Qnode,*QueuePtr;typedef struct{QueuePtr front; //队头指针QueuePtr rear; //队尾指针}LinkQueue;LinkQueue W; //等待队列void InitQueue(LinkQueue &Q) //队列初始化{Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));Q.front->next=NULL;}int Queue_Length(LinkQueue &Q) //求等待队列的当前长度{int length=0;QueuePtr p;p=Q.front;while(p->next){p=p->next;++length;}return length;}void EnQueue(LinkQueue &Q,int e) //将编号为e的顾客插入队尾{QueuePtr p;p=(QueuePtr)malloc(sizeof(Qnode));p->num=e;p->next=NULL;Q.rear->next=p;Q.rear=p;}int DeQueue(LinkQueue &Q) //队头元素出队,并用e返其编号{QueuePtr p;int e;p=Q.front->next;e=p->num;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return e;}int QueueEmpty(LinkQueue &Q) //判断等待队列是否为空,若空返回1 {return(Q.front==Q.rear? TRUE:FALSE);}void customer_serve(int n) //为顾客理发{servenum++;cus[n].starttime=curtime;cus[n].leavetime=cus[n].durtime+curtime;chairnum--; //当前可用理发椅数减1cus[n].serve_flag=TRUE;}void customer_in() //顾客进入理发店{totalnum++;cus[totalnum].NO=totalnum;cus[totalnum].intime=curtime; //记录顾客进入时间R1=rand()/32767.0;R2=rand()/32767.0;cus[totalnum].durtime=20.0+(sqrt(-2.0*log(R1)/log(naturee)) * cos(2*pi*R2))*3.0;cus[totalnum].durtime=double(int(cus[totalnum].durtime*100.0))/100.0;R1=rand()/32767.0;cus[totalnum].intertime=(log(1-R1)/log(naturee)*(-10.0));cus[totalnum].intertime=double(int(cus[totalnum].intertime*100.0))/100.0; if(QueueEmpty(W) && chairnum>0)customer_serve(totalnum); //有空闲位置并无人参与竞争,调用服务函数else{cus[totalnum].serve_flag=FALSE; //否则入队等待EnQueue(W,totalnum);}}void customer_leave(int n) //顾客离开理发店{cus[n].serve_flag=FALSE;chairnum++;totaltime=curtime-cus[n].intime+totaltime;}void show(){int i;for(i=0;i<xhcs;i++){avg_serve+=sernum[i];avg_len+=len[i];avg_leave+=leanum[i];}avg_serve/=double(xhcs);avg_len/=double(xhcs);avg_leave/=double(xhcs);for(i=0;i<xhcs;i++){s_serve+=(sernum[i]-avg_serve)*(sernum[i]-avg_serve);s_len+=(len[i]-avg_len)*(len[i]-avg_len);s_leave=(leanum[i]-avg_leave)*(leanum[i]-avg_leave);}s_serve/=double(xhcs-1);s_len/=double(xhcs-1);s_leave/=double(xhcs-1);t_serve=tfenbu*sqrt(s_serve/double(xhcs));t_len=tfenbu*sqrt(s_len/double(xhcs));t_leave=tfenbu*sqrt(s_leave/double(xhcs));printf("理发店有2名理发员,一天10小时营业\n现仿真45天的运行状况,当置信度为95%时。
Flexsim理发店的建模与仿真
理发店的建模与仿真1.仿真时间单位(time unit)为分钟,顾客的到达满足exponential(0,10),理发师Barber Dan的理发时间满足uniform(9,1),建立仿真模型运行一天(480 min)统计如下值:1)理发师一天接待多少顾客2)等待理发的最大人数以及平均值3)顾客在理发店的平均时间4)理发师的时间利用率用Flexsim建立仿真模型,Flexsim建模五步骤:a.布局图 1 布局图Flexsim建模要素分为固定实体以及流动实体,分别对应于Promodel中的Location 和Entity,根据题目,定义了Waiting Room和Barber Dan,Source和Sink是Flexsim中的特有实体,Source用来生成流动实体,Sink用来销毁实体(相当于顾客的离开和产品的卖出)。
b.连接各实体图 2 连接图Flexsim中的连线有两种,分为有方向和无方向的,有方向的用来定义逻辑顺序(产品的流动顺序)。
Promodel中用带箭头的线表示逻辑顺序。
按照各实体的逻辑顺序,依次连接Source,Waiting Room,Barber Dan和Sink,图中的文字是用来动态显示仿真过程中的参数变化。
c.定义各实体参数为Source定义其参数:图 3 Source 参数为其定义分布函数:图 4 顾客到达分布函数为Barber Dan定义参数:图 5 Barber Dan参数Flexsim为任务执行实体定义了四种时间,分别为预置时间,处理时间,故障间隔时间,故障修复时间,这里只定义了处理时间。
图 6 定义理发时间处理时间符合均匀分布,最小值为8,最大值为10。
d.编译,运行图7 模型的三维视图重置后设定运行结束时间480,再设定好模型的运行速度,经过5次运行,统计运行结果。
要统计结果已通过编程可以直接在模型中观察。
表 1 结果统计图8 模型运行过程图9 Flexsim生成的报表根据统计结果,顾客的平均在理发店的时间为26.16min,理发师的时间利用率为77.32%。
队列的应用——理发店问题模拟仿真 算法与数据结构课程网站
Hu Junfeng
26
顺序结构队列操作的实现
Hu Junfeng
27
顺序结构队列 操作的实现
Hu Junfeng
28
顺序结构队列操作的实现
Hu Junfeng
29
链接结构队列的数据结构设计
尾部插入
r -> link = newNode; r = newNode; newNode.link = NULL;
头部删除。
ptr = f; f = f -> next; free ( ptr );
空链表?
Hu Junfeng
30
链接结构队列操作的实现
Hu Junfeng
31
队列的应用 —— 缓冲区与随机过程
a1 a2 a3 a4 … an …
稳定的服务提供
随机到来的服务请求
• 用于匹配不同速率需求与服务 • 用于格式转换
Hu Junfeng
22
基于环形存储结构的队列实现
• 把数组paqu->q[MAXNUM]从逻辑上看成一个环,这种队列称为环 形队列。
• 当表中已有MAXNUM -1个结点时,如果还要插入,
paqu->r和paqu->f就会重合,而这与空队列的情形相混。
• 为区分空队列与满队列两种情况的环形队列,一般是牺牲队列 中的一个结点,当队列中已有MAXNUM-1个结点时就称满,再要 插入就发生溢出.
• 先到先服务 • 小人物优先 • 时间片轮转服务
Hu Junfeng
35
问题:
• 顾客如何表达? • 顾客流如何表达? • 模拟服务流程如何实现?
Hu Junfeng
36
队列的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验案例理发店模拟1 实验案例 (1)1.1 案例:理发店系统研究 (1)1.1.1 问题分析 (2)1.1.2 模型假设 (2)1.1.3 变量说明 (2)1.1.4 模型建立 (2)1.1.5 系统模拟 (3)1.1.6 计算机模拟算法设计 (4)1.1.7 计算机模拟程序 (5)1.1.8 思考题 (8)1实验案例1.1 案例:理发店模拟例子:一个理发店有两位服务员A和B,顾客们随机到达店内,其中60%的顾客仅需剪发,每位花5分钟时间,另外40%顾客既要剪发又要洗发,每位用时8分钟。
理发店是个含有多种随机因素的系统,请对该系统进行模拟,并对其进行评判。
(准备怎么做)可供参考内容“排队论”,“系统模拟”,“离散系统模拟”,“事件调度法”1.1.1 问题分析理发店系统包含诸多随机因素,为了对其进行评判就是要研究其运行效率,从理发店自身利益来说,要看服务员工作负荷是否合理,是否需要增加员工等考虑。
从顾客角度讲,还要看顾客的等待时间,顾客的等待队长,如等待时间过长或者等待的人过多,则顾客会离开。
理发店系统是一个典型的排队系统,可以用排队论有关知识来研究。
1.1.2 模型假设1.60%的顾客只需剪发,40%的顾客既要剪发,又要洗发; 2.每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟; 3.顾客的到达间隔时间服从指数分布; 4. 服务中服务员不休息。
1.1.3 变量说明u :剪发时间(单位:分钟),u=5m ;v: 既剪发又理发花的时间(单位:分钟),v=8m ;T : 顾客到达的间隔时间,是随机变量,服从参数为λ的指数分布,(单位:分钟)T 0:顾客到达的平均间隔时间(单位:秒),T 0=λ1;1.1.4 模型建立由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。
考虑一般理发店的工作模式,一般是上午9:00开始营业,晚上10:00左右结束,且一般是连续工作的,因此一般营业时间为13小时左右。
这里以每天运行12小时为例,进行模拟。
这里假定顾客到达的平均间隔时间T 0服从均值3分钟的指数分布,则有3小时到达人数约为603603=⨯人, 6小时到达人数约为1203606=⨯人, 10小时到达人数约为20036010=⨯人, 这里模拟顾客到达数为60人的情况。
(如何选择模拟的总人数或模拟总时间)1.1.5系统模拟根据系统模拟的一般方法,需要考虑系统的如下数据、参数。
1.状态(变量)(1)等待服务的顾客数;(2)A是否正在服务;(3)B是否正在服务;2.实体:两名服务员、顾客们3.事件:(1)一名新顾客的到达;(2)A开始服务;(3)A结束服务;(4)B开始服务;(5)B结束服务;4.活动:(1)顾客排队时间(2)顾客们到达的间隔时间(3)A的服务时间(4)B的服务时间;在系统模拟时,为了研究系统的整体情况,这里考虑顾客到达后不离开,且等待队长不限。
要考虑如果服务员均空闲时,顾客先选择谁服务?要考虑模拟的时间设置还有顾客数目。
模拟终止条件是根据顾客数目还是根据营业时间终止?1.1.6计算机模拟算法设计自行设计finished=0;初始化运行时钟while finished==0if 产生的顾客数不到规定数目时then,产生该顾客的有关数据;将顾客加入等待队列;else运行时钟继续;endif处理服务员的状态(包括工作状态,空闲时间);获得服务员的服务优先顺序;根据服务员优先顺序从等待队列中安排服务;endwhile有无参考算法?离散系统仿真算法:事件调度法1.1.7 计算机模拟程序顾客到达的间隔时间T 的计算机产生方法,利用T=rand T rand ln ln 10-=-λ,%理发店系统的模拟(案例分析之一)%关键词:面向事件的计算机模拟技术clear allcurclock=0;%当前时刻,动态变化totalcustomer=0;%总共服务的顾客数numsrv=2;srvstatus=zeros(numsrv,5);%服务员有关数据%srvstatus 第1列:服务状态(0空闲,1正在服务);第2列:当前服务顾客编号;% 第3列:当前服务结束时刻;第4列:服务员空闲时间;第5列:服务的顾客总数endtime =0;%结束时间waiting=[];%等待队列数据%waiting 第1列:顾客编号;第2列:顾客到达时刻;第3列:顾客开始接受服务时刻;% 第4列:接受服务时间;第5列:顾客结束服务时刻;第6列:间隔时间 cur=zeros(1,6);%当前产生顾客的数据,对应关系同waitingavgwaitlen=[];%平均等待队长avgwaittime =[];% 平均等待时间ujiange=5;%平均间隔时间finished=0;numsimucustumer=yesinput('输入等待模拟的顾客数:',10,[101000]);while finished==0,if totalcustomer < numsimucustumer%产生一个顾客的到达及其有关性质的数据totalcustomer = totalcustomer+1;jiange= -log(rand)*ujiange;%与上一个顾客的到达的间隔时间curclock = curclock + jiange;cur(1)= totalcustomer ;% 第1列:顾客编号cur(2) = curclock;%第2列:顾客到达时刻cur(6) = jiange; 第6列:间隔时间%下面产生接受服务时间(可改进模型)if rand<0.6, %产生顾客有关性质:这里是产生接受服务时间cur(4) = 5;elsecur(4) = 8;end%放入等待队列if isempty(waiting),waiting= cur;else[m,n]=size(waiting);waiting(m+1,:)= cur;endelsecurclock = curclock + (-log(rand)*ujiange);end%if totalcustomer<%分配等待队列(看是否有服务员空闲,如果有则分配;否则继续执行)%处理服务员的服务状态for i=1:numsrv,if srvstatus(i,1)==1 & srvstatus(i,3) <= curclock,srvstatus(i,1)=0;%设置为空闲状态srvstatus(i,4)= curclock-srvstatus(i,3);%目前已经空闲的时间elseif srvstatus(i,1)==1 & srvstatus(i,3) > curclock, srvstatus(i,4)= 0;%没有休息(正在忙)elsesrvstatus(i,4)= curclock-srvstatus(i,3);%目前已经空闲的时间endend%处理服务员服务的先后顺序(依据空闲时间)(精细处理)tmp=srvstatus(:,4);for i=1:numsrv,[value,id]=max(tmp);b(i)=id;tmp(id)=0;%已经排序了end%此时等待队列必然不为空for j=1:numsrv,i=b(j);%确定服务员的序号if(srvstatus(i,1)==0)%找一个顾客开始服务,同时计算该顾客什么时候接受服务,结束服务;[m,n]=size(waiting);if m==0,break;endif waiting(1,5)==0,%还没有开始接受服务waiting(1,3)= curclock;waiting(1,5)= waiting(1,3)+waiting(1,4);%结束时刻srvstatus(i,1)=1;%设置为忙状态srvstatus(i,2)=waiting(1,1);%顾客编号srvstatus(i,3)= waiting(1,5);%结束时刻srvstatus(i,5)=srvstatus(i,5)+1;%又服务了一个顾客%计算等待时间avgwaittime(end+1) = waiting(1,3)-waiting(1,2); disp(sprintf('间隔时间(%8.2f) 顾客编号:%5d 接受服务员(%4d)服务(到达时刻%10.2f)',waiting(1,6),waiting(1,1),i,waiting(1,2)))endtime=max(endtime,waiting(1,5))waiting(1,:)=[];%从等待队列中离开endend%ifend%for[m,n]=size(waiting);%计算队长(这里的计算式子可以参考排队论有关术语进行确定)if totalcustomer < numsimucustumeravgwaitlen(end+1)=m;endif sum(srvstatus(:,5))>=numsimucustumer,%队列为空,结束finished=1;endend%whiledisp('服务顾客数:')disp(srvstatus(:,5)')disp('平均队长');disp(mean(avgwaitlen));disp('运行时间(分钟,小时)');disp(sprintf('%8.f%8.f',curclock,curclock/60));disp('平均等待时间(分钟)');disp(mean(avgwaittime ));disp('结束时间(分钟)');disp(endtime );figurehist(avgwaitlen)title('平均队长')figurehist(avgwaittime)title('平均等待时间');1.1.8思考题请运行模拟程序,并分析运行结果。