- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
哲学家聚餐问题的计算机仿真
哲学家聚餐实验报告2008011464 杨盛一.实验内容哲学家用餐问题是由E.J.Dijkstra提出,目的是解决资源的共享与访问控制。五位“哲学家”均匀地围坐在一张圆桌周围,他们一边讨论一边用餐。每人面前有一盘佳肴,每个盘子之间有一把叉子,如下图所示:1)说话(思考)时不吃也不占用叉子;2)吃食物时不说话也不思考;3)等待时不说话也不思考;4)任何一个哲学家在任何时候要么处于说话(思考)状态,要么处于吃食物状态,要么处于等待叉子的状态;允许同时有多人说话(思考)或多人吃食物;5)当某人要吃食物时,必须同时占用靠近他的两把叉子,当不够两把叉子时,他处于等待叉子的状态;叉子一旦被某人占用,就处于被占用状态,直到该人的吃食物的活动完成后才被释放;6)任何一把叉子,均可被靠近它的哲学家占用,也只能被靠近它的哲学家占用,按FIFO规则;7)食物充足,也不考虑吃饱了不想吃的问题。设每一位哲学家每一次说话或思考的时间长度服从正态分布N(5,4),每次吃食物的时间长度x服从如下形式的分布的随机变量。二.实验要求设每一位哲学家每一次说话或思考的时间长度服从正态分布N(5,4),每次吃食物的时间长度x服从如下形式的分布的随机变量。自行编制程序,仿真时,采用如下随机数: ,种子值为1。初始状态为:哲学家1、3、5为说话或思考状态,2、4吃食物状态。1)可任选采用事件调度法或活动扫描法建模; 2)仿真运行时间长度:24小时,仿真计算在24小时内,每位哲学家的平均说话或思考时间、等待用餐时间和吃食物时间; 3)自行确定仿真运行时间长度,用批均值法,统计估计每位哲学家的稳态平均说话或思考时间、等待用餐时间和吃食物时间,以及相应的置信区间三.项目目的1)掌握用事件调度法或活动扫描法进行仿真建模的方法2)掌握离散事件系统仿真方法3)掌握用批均值法进行离散事件系统仿真输出数据分析的方法四.仿真程序流程图事件判断五.部分程序说明本次仿真采用的是事件调度法。随机数发生器采用题目要求的线性同余法随机数发生器/*线性同余法生成随机数*/double Random_Z(){double z=16807*z1;z1=z-B*((int)(z/B));return (z1/B);}用舍选法产生符合实验要求的分布/* 舍选法用U(0,1)生成F(x) */double Random_F(){double u1,u2;while(1){u2=2+Random_Z()*2;//2-4均匀分布u1=Random_Z()*2/3;//0-2/3均匀分布if(u2=2.5){if(u1=((u2-2)*(2.0/3)+(1.0/3))) return u2;}else{if(u1=(2.0/3-(u2-2.5)*(2.0/9))) return u2;}}}/*舍选法用U(0,1)生成N(u,th^2) */double Random_N(double u,double th){if (s==1) {s=0;return N;}double v1,v2,w;while(1){v1=Random_Z()*2-1;v2=Random_Z()*2-1;w=v1*v1+v2*v2;if(w=1){s=1;N=(v2*sqrt(-2*log(w)/w))*th+u;return (v1*sqrt(-2*log(w)/w))*th+u;}}}定义哲学家的三种状态enum state{eating,talkingOrThinking,waiting};//枚举状态定义哲学家类型typedef struct Philosopher {state NowState;double timeToFinishCurrentFair;//如果在吃,还要多久吃完;如果在思考,还要思考多久;如果在等,等了多少时间(负数表示)double totalTimeOfEating;//吃饭总时间double totalTimeOfThinking;//思考总时间double totalTimeOfWaiting;//等待总时间}Philosopher;//哲学家类型哲学家类型包含:当前状态NowState,timeToFinishCurrentFair表示结束当前状态还需要的时间,应当注意的是,当哲学家A处于等叉状态时,何时退出等叉状态取决于相邻的两位哲学家的状态,即当两个哲学家均处于说话状态或等叉但是等待时间不及哲学家A/*为分析设置的记录res[i][0][k]是第i位哲学家第k批仿真的吃饭时间res[i][1][k]是第i位哲学家第k批仿真的思考时间res[i][2][k]是第i位哲学家第k批仿真的等待时间k=0时是相应的总时间resInPercent[i][0][k]是第i位哲学家第k批仿真的吃饭时间的百分比re
文档评论(0)