电梯调度算法.doc_第1页
电梯调度算法.doc_第2页
电梯调度算法.doc_第3页
电梯调度算法.doc_第4页
电梯调度算法.doc_第5页
已阅读5页,还剩12页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录一、算法设计11算法思想12运行环境13问题描述1二、实验步骤及方法1三、源程序代码1四、运行结果图14五、课程总结15一、算法设计1算法思想本算法设计一部电梯,通过往返寻找方法,即先查询电梯运行方向的楼层是否存在有其他键被按下,有就继续往该方向运行,如果没有就查询电梯运行反方向的楼层是否有按键被按下,如果有电梯就改变方向,反方向运行。如果没有电梯就停止在该楼层,30秒后如果没有任何键被按下,电梯就自动返回1楼停住。同时,电梯乘客所去的楼层方向与电梯当前方向一致的话,则电梯优先搭载该乘客。随后再搭载去反方向的乘客,以此实现电梯的升降操作。2运行环境本程序用java语言、eclipse平台编写。3问题描述电梯调度算法的基本原则就是如果在电梯运行方向上有人要使用电梯则继续往那个方向运动,如果电梯中的人还没有到达目的地则继续向原方向运动。具体而言,如果电梯现在朝上运动,如果当前楼层的上方和下方都有请求,则先响应所有上方的请求,然后才向下响应下方的请求;反之。二、实验步骤及方法1由于鼠标单击每个楼层按钮时,需要作出相应的动作,所以我们使用jbutton按钮类,通过jbutton的单击事件来模拟楼层按钮并通过改变颜色来表示按钮是否被按下2使用数组存储每个按钮的状态,1表示被按下,0表示未被按下。用于电梯是否到达目标层的判断,及按钮颜色的刷新判断;3“电梯”也是一个jbutton类,通过改变颜色来模拟电梯的运行,需要在此类中设置一个方向值,用0,1,2分别表示电梯的停止向上向下运行。三、源程序代码import java.awt.Color;import java.awt.Container;import java.awt.Font;import java.awt.GridLayout;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.*;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.Timer;public class Lifta/* * param args */public static void main(String args)Brick brick=new Brick();class Brick /方块类public int octime=0; /计算开关门事件。public int j=0;public String closedoor=关门;public String close=关;public String open=开;JFrame frame=new JFrame(电梯调度算法);JPanel pan=new JPanel();JButton but=null;JButton sign=new JButton(+j+楼);JButton openclose=new JButton(closedoor+);JButton openkey=new JButton(open+);JButton closekey=new JButton(close+);public ArrayList blackBrick; /brick用来依次存放button,程序用button显示蓝色表示有电梯的当前位置。public ArrayList controlBrick; /controlBrick用来依次存放button,表示每层楼电梯口的是上键和下键,程序用button显示绿色表示对应键被按下。public int controlTable; /用二维数组controlTable与电梯口的上下键对应,其中如果值1表示button应显示绿色,值0表示button应显示灰色。public ArrayList numberBrick; /numberBrick用来依次存放button,程序用button显示桔黄色表示电梯内的数字键被按下。public inttable; /用二维数组table与电梯内的数字键对应,其中如果值1表示button应显示桔黄色,值0表示button应显示灰色。public int upSignalTable; /纪录向上任务的任务数组,值为1表示相应位的上键被按下。public int downSignalTable; /纪录向下任务的任务数组,值为1表示相应位的下键被按下。public Timer timer; /计时器。public LiftThread lift; /控制每个电梯的线程数组。/=构造方法(下)初始化=/public Brick()sign.setBounds(0, 0, 80, 40); /起始位置/开关门部分openclose.setBounds(80, 0, 80, 40); openclose.setBackground(Color.yellow);openkey.setBounds(160, 0, 80, 40); openkey.addActionListener(new OpencolseListener();/开门按钮添加事件closekey.setBounds(240, 0, 80, 40);closekey.addActionListener(new OpencolseListener();/关门按钮添加事件pan.setLayout(null); /画布绝对定位 Font fnt=new Font(Serief,Font.ITALIC,15); /设置字体样式 /实例化数组numberBrick=new ArrayList(10);blackBrick=new ArrayList(10);controlBrick = new ArrayList(10); controlTable = new int102;for (int i = 0; i 10; i+)for (int j = 0; j 2; j+)controlTableij = 0;table = new int10;for (int i = 0; i 10; i+)tablei = 0;upSignalTable = new int10;downSignalTable = new int10;for (int i = 0; i 0;i-)/最左边黑色列but=new JButton();but.setFont(fnt);but.setBounds(0, (11-i)*40, 80, 40);but.setBackground(Color.BLACK);blackBrick.add(but);pan.add(but); /显示楼层but=new JButton(+i+楼);but.setFont(fnt);but.setBounds(80, (11-i)*40, 80, 40);but.addActionListener(new NumberListener(i);but.setBackground(Color.gray);numberBrick.add(but);pan.add(but); /向上键but=new JButton(上);but.setFont(fnt);but.setBounds(160, (11-i)*40, 80, 40);if(i!=10)but.addActionListener(new UpListener(i);but.setBackground(Color.gray);controlBrick.add(but);pan.add(but);/向下键but=new JButton(下);but.setFont(fnt);but.setBounds(240, (11-i)*40, 80, 40);if(i!=1)but.addActionListener(new DownListener(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 = new LiftThread();frame.setVisible(true);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); /=构造方法(上)=/*填充方块和设置方法*public void DrawBrick() /重新刷新整个table,使每个button显示应该的颜色。for (int i = 1; i =10; i+)for(int j=0;j10;j+)(JButton) blackBrick.get(j).setBackground(Color.black);(JButton) blackBrick.get(10-lift.number).setBackground(Color.blue);public void DrawControlBrick() /将所电梯口的上下键全部重新按当前状态显示颜色。for (int i = 0; i 10; i+)for(int j=0;j2;j+)if (controlTableij = 1)(JButton) controlBrick.get(i * 2 + j).setBackground(Color.green);else (JButton) controlBrick.get(i * 2 + j ).setBackground(Color.gray);public void DrawNumberBrick() /将所有电梯内的数字键重新按当前状态显示颜色。for (int i = 0; i 10; i+)if (tablei = 1)(JButton) numberBrick.get(i ).setBackground(Color.orange);else(JButton) numberBrick.get(i ).setBackground(Color.gray);public boolean WorkState() /判断当前电梯内的数字键是否被按下,如有键被按下,则值为1,如果没有任何键被按下,则值为0。for (int i = 0; i x)lift.state = 1;if (number 0; i-)if (table10 - i = 1|controlTable10-i1=1|controlTable10-i0=1)count+;if (count = 0& lift.number = lift.destination) count=0;for(int j=lift.number;j0)lift.state=1;/System.out.println(改变方向:向上);elselift.state = 0;public void actionUp()/检查向上运行的电梯是否还需向上,即检查在此层上还有没有数字键被按下,如果没有,则置电梯状态为停止,并使该电梯内所有数字键还原。if (lift.state = 1) int count = 0;for (int i = lift.number; i =lift.destination) count=0;for(int j=lift.number;j0;j-)if(table10-j=1|controlTable10-j1=1|controlTable10-j0=1)count+;if(count0)lift.state=2;/System.out.println(改变方向:向下);elselift.state = 0;public void actionPerformed(ActionEvent event) int state = lift.state;/纪录电梯当前状态。if (lift.state!=0&table10 - lift.number = 1) /如果电梯经过电梯内数字键显示的要到达的楼层,则该数字键状态恢复未按,并重新显示数字键颜色。table10 - lift.number = 0;DrawNumberBrick();new openclosThread();if (state != 0& lift.number = lift.destination) /如果电梯属于逆向到达,则此任务完成,从任务数组中删除并重新显示上下键的颜色。if (state = 2& controlTable10 - lift.numberstate - 1= 0) controlTable10 - lift.number2 - state = 0;DrawControlBrick();new openclosThread();if (state = 1& controlTable10 - lift.numberstate - 1= 0) controlTable10 - lift.number2 - state = 0;new openclosThread();DrawControlBrick();if (state = 1) /向上电梯经过的向上任务完成,从任务数组中删除并重新显示上下键的颜色。if (controlTable10 - lift.number0 = 1) controlTable10 - lift.number0 = 0;new openclosThread();DrawControlBrick();if (state = 2) /向下电梯经过的向下任务完成,从任务数组中删除并重新显示上下键的颜色。if (controlTable10 - lift.number1 = 1) controlTable10 - lift.number1 = 0;new openclosThread();DrawControlBrick();actionUp(); /判断是否继续向上actionDown(); /判断是否继续向下state = lift.state; /如果电梯状态不为停止,则按照运行方向运行。if (state = 1)lift.number+;/System.out.println(向上+lift.number);if (state = 2)lift.number-;/System.out.println(向下+lift.number);/设置相应电梯的显示器sign.setText( + lift.number);DrawBrick();new Returnfirstfloor(state);/10秒没人按下任何键,则返回第一层 /*电梯线程时间控制*public class openclosThread extends Thread public openclosThread() public void run() openclose.setText(开门);try sleep(1000); catch (InterruptedException e) openclose.setText(关门);public class Returnfirstfloor extends Thread /如果在30秒内没有人按下任何键,电梯则自动返回第一次;省电(*_*) 嘻嘻int stater;int count;public Returnfirstfloor(int state) count=0;this.stater=state;start();public void run() if(stater=0&lift.number!=1)try sleep(10000);catch (InterruptedException e) for (int i = 1; i=10; i+)if (table10 - i = 1|controlTable10-i1=1|controlTable10-i0=1)count+;if(count=0)/如果10秒后没人按,就设第一层为1,电梯方向为向下。table9 = 1;lift.state=2;public class LiftThread extends Thread public int number = 1; /电梯当前楼层。public int state = 0; /电梯当前状态,0为停止,1为上升,2为下降。int destination; /电梯的目的楼层。int i=0;public LiftThread() start();i=octime;System.out.println(+i);public void run() ActionListener timelistener = new TimeListener();timer = new Timer(1500+i), timel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论