首页 电梯调度算法

电梯调度算法

举报
开通vip

电梯调度算法PAGE\*MERGEFORMAT#目录TOC\o"1-5"\h\zHYPERLINK\l"bookmark2"\o"CurrentDocument"一、算法设计1HYPERLINK\l"bookmark4"\o"CurrentDocument"1.算法思想1HYPERLINK\l"bookmark6"\o"CurrentDocument"2.运行环境1HYPERLINK\l"bookmark8"\o"CurrentDocument"3.问题描述1HYPERLINK\l"book...

电梯调度算法
PAGE\*MERGEFORMAT#目录TOC\o"1-5"\h\zHYPERLINK\l"bookmark2"\o"CurrentDocument"一、算法设计1HYPERLINK\l"bookmark4"\o"CurrentDocument"1.算法思想1HYPERLINK\l"bookmark6"\o"CurrentDocument"2.运行环境1HYPERLINK\l"bookmark8"\o"CurrentDocument"3.问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 描述1HYPERLINK\l"bookmark10"\o"CurrentDocument"二、实验步骤及方法1HYPERLINK\l"bookmark12"\o"CurrentDocument"三、源程序代码1HYPERLINK\l"bookmark16"\o"CurrentDocument"四、运行结果图14HYPERLINK\l"bookmark18"\o"CurrentDocument"五、课程总结15一、算法设计1.算法思想本算法设计一部电梯,通过往返寻找方法,即先查询电梯运行方向的楼层是否存在有其他键被按下,有就继续往该方向运行,如果没有就查询电梯运行反方向的楼层是否有按键被按下,如果有电梯就改变方向,反方向运行。如果没有电梯就停止在该楼层,30秒后如果没有任何键被按下,电梯就自动返回1楼停住。同时,电梯乘客所去的楼层方向与电梯当前方向一致的话,则电梯优先搭载该乘客。随后再搭载去反方向的乘客,以此实现电梯的升降操作。2.运行环境本程序用java语言、eclipse平台编写。3.问题描述电梯调度算法的基本原则就是如果在电梯运行方向上有人要使用电梯则继续往那个方向运动,如果电梯中的人还没有到达目的地则继续向原方向运动。具体而言,如果电梯现在朝上运动,如果当前楼层的上方和下方都有请求,则先响应所有上方的请求,然后才向下响应下方的请求;反之。二、实验步骤及方法1.由于鼠标单击每个楼层按钮时,需要作出相应的动作,所以我们使用jbutton按钮类,通过jbutton的单击事件来模拟楼层按钮并通过改变颜色来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示按钮是否被按下2.使用数组存储每个按钮的状态,1表示被按下,0表示未被按下。用于电梯是否到达目标层的判断,及按钮颜色的刷新判断;3.“电梯”也是一个jbutton类,通过改变颜色来模拟电梯的运行,需要在此类中设置一个方向值,用0,1,2分别表示电梯的停止向上向下运行。三、源程序代码importjava.awt.Color;importjava.awt.Container;importjava.awt.Font;importjava.awt.GridLayout;importjava.awt.TextField;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;importjava.util.*;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.Timer;publicclassLifta{/***@paramargs*/publicstaticvoidmain(String[]args){Brickbrick=newBrick();}}classBrick{//方块类publicintoctime=0;//计算开关门事件。publicintj=0;publicStringclosedoor="关门";publicStringclose="关";publicStringopen="开";JFrameframe=newJFrame("电梯调度算法");JPanelpan=newJPanel();JButtonbut=null;JButtonsign=newJButton(+j+"楼");JButtonopenclose=newJButton(closedoor+"");JButtonopenkey=newJButton(open+"");JButtonclosekey=newJButton(close+"");publicArrayListblackBrick;;//brick用来依次存放button,程序用button显示蓝色表示有电梯的当前位置。publicArrayListcontrolBrick;//controlBrick用来依次存放button,表示每层楼电梯口的是上键和下键,程序用button显示绿色表示对应键被按下。publicint[][]controlTable;//用二维数组controlTable与电梯口的上下键对应,其中如果值1表示button应显示绿色,值0表示button应显示灰色。publicArrayListnumberBrick;//numberBrick用来依次存放button,程序用button显示桔黄publicint[]upSignalTable;//publicint[]downSignalTable;publicTimertimer;//计时器。publicLiftThreadlift;//控制每个电梯的线程数组。//构造方法(下)初始化//publicBrick(){sign.setBounds(0,0,80,40);//起始位置//开关门部分openclose.setBounds(80,0,80,40);openclose.setBackground(Color.yellow);openkey.setBounds(160,0,80,40);openkey.addActionListener(newOpencolseListener());//开门按钮添加事件closekey.setBounds(240,0,80,40);closekey.addActionListener(newOpencolseListener());//关门按钮添加事件pan.setLayout(null);//画布绝对定位色表示电梯内的数字键被按下。publicint[]table;//用二维数组table与电梯内的数字键对应,其中如果值1表示button应显示桔黄色,值0表示button应显示灰色。纪录向上任务的任务数组,值为1表示相应位的上键被按下。//纪录向下任务的任务数组,值为1表示相应位的下键被按下。设置字体样式Fontfnt=newFont("Serief",Font.ITALIC,15);////实例化数组numberBrick=newArrayList(10);blackBrick=newArrayList(10);controlBrick=newArrayList(10);controlTable=newint[10][2];for(inti=0;i<10;i++)for(intj=0;j<2;j++)controlTable[i][j]=0;table=newint[10];for(inti=0;i<10;i++)table[i]=0;upSignalTable=newint[10];downSignalTable=newint[10];for(inti=0;i<10;i++){upSignalTable[i]=0;downSignalTable[i]=0;}//********************画图************************for(inti=10;i>0;i--){//最左边黑色列but=newJButton();but.setFont(fnt);but.setBounds(0,(11-i)*40,80,40);but.setBackground(Color.BLACK);blackBrick.add(but);pan.add(but);//显示楼层but=newJButton(+i+"楼");but.setFont(fnt);but.setBounds(80,(11-i)*40,80,40);but.addActionListener(newNumberListener(i));but.setBackground(Color.gray);numberBrick.add(but);pan.add(but);//向上键but=newJButton("上");but.setFont(fnt);but.setBounds(160,(11-i)*40,80,40);if(i!=10)but.addActionListener(newUpListener(i));but.setBackground(Color.gray);controlBrick.add(but);pan.add(but);//向下键but=newJButton("下");but.setFont(fnt);but.setBounds(240,(11-i)*40,80,40);if(i!=1)but.addActionListener(newDownListener(i));but.setBackground(Color.gray);controlBrick.add(but);pan.add(but);}//*******************运行部分*****************pan.add(sign);pan.add(openclose);pan.add(openkey);pan.add(closekey);frame.add(pan);frame.setSize(329,479);lift=newLiftThread();frame.setVisible(true);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);〃:构造方法(上)=======================================================//〃********************************************************************************************************publicvoidDrawBrick(){table,使每个button显示应该的颜色。for(inti=1;i<=10;i++){填充方块和设置方法//重新刷新整个for(intj=0;j<10;j++)((JButton)blackBrick.get(j)).setBackground(Color.black);((JButton)blackBrick.get(10-lift.number)).setBackground(Color.blue);}}publicvoidDrawControlBrick(){//将所电梯口的上下键全部重新按当前状态显示颜色。for(inti=0;i<10;i++)for(intj=0;j<2;j++)if(controlTable[i][j]==1){((JButton)controlBrick.get(i*2+j)).setBackground(Color.green);}else{((JButton)controlBrick.get(i*2+j)).setBackground(Color.gray);}}publicvoidDrawNumberBrick(){//将所有电梯内的数字键重新按当前状态显示颜色。for(inti=0;i<10;i++)if(table[i]==1)((JButton)numberBrick.get(i)).setBackground(Color.orange);else((JButton)numberBrick.get(i)).setBackground(Color.gray);publicbooleanWorkState(){//内的数字键是否被按下,如有键被按下,则值为1,如果没有任何键被按下,则值为判断当前电梯0。for(inti=0;i<10;i++){if(table[i]==1)returntrue;returnfalse;停,则改变电梯状态publicvoidsetState(intnumber){//如果电梯原来lift.destination=number;intx=lift.number;if(lift.state==0){if(number>x)lift.state=1;if(number0;i--)if(table[10-i]==1||controlTable[10-i][1]==1||controlTable[10-i][0]==1)count++;if(count==0&&lift.number<=lift.destination){count=0;for(intj=lift.number;j<10;j++){if(table[10-j]==1||controlTable[10-j][1]==1||controlTable[10-j][0]==1){count++;TOC\o"1-5"\h\z}}if(count>0){lift.state=1;//System.out.println("改变方向:向上");}else{lift.state=0;}}}}publicvoidactionUp(){//检查向上运行的电梯是否还需向上,即检查在此层上还有没有数字键被按下,如果没有,则置电梯状态为停止,并使该电梯内所有数字键还原。if(lift.state==1){intcount=0;for(inti=lift.number;i<10;i++)if(table[10-i]==1||controlTable[10-i][0]==1||controlTable[10-i][1]==1)count++;if(count==0&&lift.number>=lift.destination){count=0;for(intj=lift.number;j>0;j--){if(table[10-j]==1||controlTable[10-j][1]==1||controlTable[10-j][0]==1){count++;TOC\o"1-5"\h\z}}if(count>0){lift.state=2;//System.out.println("改变方向:向下");}else{lift.state=0;}}}}publicvoidactionPerformed(ActionEventevent){intstate=lift.state;//纪录电梯当前状态。if(lift.state!=0&&table[10-lift.number]==1){//如果电梯经过电梯内数字键显示的要到达的楼层,则该数字键状态恢复未按,并重新显示数字键颜色。table[10-lift.number]=0;DrawNumberBrick();newopenclosThread();}if(state!=0&&lift.number==lift.destination){//如果电梯属于逆向到达,则此任务完成,从任务数组中删除并重新显示上下键的颜色。if(state==2&&controlTable[10-lift.number][state-1]==0){controlTable[10-lift.number][2-state]=0;DrawControlBrick();newopenclosThread();}if(state==1&&controlTable[10-lift.number][state-1]==0){controlTable[10-lift.number][2-state]=0;newopenclosThread();DrawControlBrick();}}if(state==1){//向上电梯经过的向上任务完成,从任务数组中删除并重新显示上下键的颜色。if(controlTable[10-lift.number][0]==1){controlTable[10-lift.number][0]=0;newopenclosThread();DrawControlBrick();}}if(state==2){//向下电梯经过的向下任务完成,从任务数组中删除并重新显示上下键的颜色。if(controlTable[10-lift.number][1]==1){//*controlTable[10-lift.number][1]=0;newopenclosThread();DrawControlBrick();actionUp();//actionDown();//state=lift.state;//if(state==1){lift.number++;//System.out.println(}if(state==2){lift.number--;//System.out.println(}//设置相应电梯的显示器sign.setText(""+lift.number);DrawBrick();newReturnfirstfloor(state);//10判断是否继续向上判断是否继续向下如果电梯状态不为停止,则按照运行方向运行。"+lift.number);"+lift.number);秒没人按下任何键,则返回第一层**************************************************电梯线程时间控制***************************************************************************publicclassopenclosThreadextendsThread{publicopenclosThread(){}publicvoidrun(){openclose.setText("开门");try{sleep(1000);}catch(InterruptedExceptione){}openclose.setText("关门");}}publicclassReturnfirstfloorextendsThread{//如果在30秒内没有人按下任何键,电梯则自动返回第一次;省电(*A__A*)嘻嘻”intstater;intcount;publicReturnfirstfloor(intstate){count=0;this.stater=state;start();}publicvoidrun(){if(stater==0&&lift.number!=1){try{sleep(10000);}catch(InterruptedExceptione){}for(inti=1;i<=10;i++){if(table[10-i]==1||controlTable[10-i][1]==1||controlTable[10-i][0]==1){count++;}}if(count==0){//如果10秒后没人按,就设第一层为1,电梯方向为向下。table[9]=1;lift.state=2;}}}}publicclassLiftThreadextendsThread{publicintnumber=1;//电梯当前楼层。publicintstate=0;//0为停止,1为上升,2为下降。intdestination;//电梯的目的楼层。inti=0;publicLiftThread(){start();i=octime;System.out.println(""+i);}publicvoidrun(){ActionListenertimelistener=newTimeListener();timer=newTimer((1500+i),timelistener);timer.start();}}}四、运行结果图A中库调度岂法一同一^五、课程总结后来我们首先从网上搜罗了一系列的关于电梯这方面的资料,包括电梯调度算法设计的思想,然后又研究了电梯具体运行的时候的响应顺序。了解了电梯的运行原则之后,我们开始本次的课程设计,一开始做的时候比较困难,因为有许多因素要考虑,需要很多的java界面方面和相关控件的知识比较薄弱,后来通过不断的查阅资料,上百度勉强能做出来。在本次的课程设计实验中我们运用的是扫描算法(SCAN),扫描算法是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。它进行寻找楼层的优化,效率比较高,但它是一个非实时算法。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的,所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成,免去了电梯频繁的来回移动。总之,在本次的课程设计过程中,我们收获知识,提高能力的同时,也懂得了怎么样去制定、实现计划,课程设计是培养学生综合运用所学知识发现提出分析和解决实际问题锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 本上没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,在设计的过程中发现自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,在设计中我们遇到了很多编程问题,最后在不断地查阅后,我们慢慢的进入状态,这次课程设计确实加深了我们对操作系统这门课程的理解。
本文档为【电梯调度算法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
tongshu
暂无简介~
格式:doc
大小:68KB
软件:Word
页数:19
分类:
上传时间:2022-06-07
浏览量:0