Java实现电梯调度算法

Java实现电梯调度算法

    • 电梯算法简介
    • 题目
    • 代码实现
    • 效果图

电梯算法简介

当磁头正在由里向外移动时,电梯调度算法所选择的下一个访问对象应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样由里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向,由外向里移动。这时,同样也是每次选择在当前磁道之内,且距离最近的进程来调度。 ——摘自百度百科
网上大多将电梯调度算法和扫描算法看作同一个算法,我们老师讲的时候将它们作了区分。扫描算法:需要扫描到该方向的最后一个磁盘才能返回,电梯算法则只要扫描到该方向欲访问的最后一个磁道就可以返回。
例如:磁盘有200个柱面,编号为0-199,当前移动臂在143号柱面上,向0方向移动。请求访问序列:86,147,91,177,94,150,102。
电梯调度算法访问的磁道面顺序为:102,94,91,86,147,150,177。
扫描算法访问的磁道面顺序为:102,94,91,86,0,147,150,177。

题目

假定一个磁盘有200个柱面,编号为0一199,在完成了磁道125外的请求后,当前正在磁道143处为一个请求服务。若请求队列的先后顺序为86,147,91,177,94,150,102,175,130。采用电梯调度算法写出磁头移动的顺序,并计算存取臂移动总量。

代码实现

我用java实现的是界面化,这样运行的时候大概可能看起来比较直观吧

  • 定义柱面类Cylinder.java
public class Cylinder {//柱面号public int number;//初始化public Cylinder(int number) {this.number = number;}
}
  • 主类Elevator.java

界面初始化:

TextField tf1;
TextField tf2;
//显示界面的TextField队列
private ArrayList<TextField> textFields = new ArrayList<TextField>();
public void showUI(){//窗口初始化javax.swing.JFrame window  = new javax.swing.JFrame();window.setSize(800, 1000);window.setTitle("电梯算法");window.setDefaultCloseOperation(3);window.setLocationRelativeTo(null);JPanel jPanel = new JPanel();jPanel.setPreferredSize(new Dimension(0, 100));jPanel.setBackground(Color.white);Label l1 = new Label("Previews:");Label l2 = new Label("Now:");tf1 = new TextField("143");tf2 = new TextField("125");jPanel.add(l1);jPanel.add(tf1);jPanel.add(l2);jPanel.add(tf2);Button button1 = new Button("START");button1.setPreferredSize(new Dimension(100, 60));jPanel.add(button1);Button button = new Button("NEXT");button.setPreferredSize(new Dimension(100, 60));jPanel.add(button);JPanel jPanel2 = new JPanel();//设置网格布局GridLayout gridLayout = new GridLayout(10,20,0,3);jPanel2.setLayout(gridLayout);//添加TextView作为柱面for(int i=0;i<200;++i){TextField textField = new TextField(""+i);jPanel2.add(textField, gridLayout);textFields.add(textField);}jPanel2.setBackground(Color.blue);window.add(jPanel,BorderLayout.NORTH);window.add(jPanel2, BorderLayout.CENTER);window.setVisible(true);button.addActionListener(this);button1.addActionListener(this);}

调用showUI()方法后,显示的窗口是这样的: 效果图
初始化访问序列

//存储柱面号的数组
private int a[] = new int[]{86,147,91,165,177,94,150,102,175,130};
//这个后面会用到
int b[] = new int[]{86,147,91,177,94,150,102,165,175,130};
//需要访问柱面的队列
private ArrayList<Cylinder> cylinderlist = new ArrayList<Cylinder>();
//初始化访问的柱面
public void init(){cylinderlist = new ArrayList<Cylinder>();for(int i=0;i<a.length;++i){Cylinder cylinder = new Cylinder(a[i]);cylinderlist.add(cylinder);}//使用匿名类排序Collections.sort(cylinderlist, new Comparator<Cylinder>() {public int compare(Cylinder h1, Cylinder h2) {return h1.number-h2.number;}});//将要访问的柱面设为红色for(int i=0;i<b.length;++i){textFields.get(b[i]).setBackground(Color.RED);}//当前柱面号设为灰色textFields.get(now).setBackground(Color.gray);
}

寻找下一个要访问的柱面号
如果现在是向外移动(向199号方向移动),选择大于当前柱面号的访问者中柱面号最小者

private int now = 125;//当前柱面号
private int previews =143;//之前完成的柱面号服务请求
public void findMin(){//赋值给完成的柱面号previews = now;//之前已经用匿名类排序后,只要选择队列中该位置的后一个元素就可以了int no = 0;for(int i=cylinderlist.size()-1;i>=0;--i){Cylinder cylinder = cylinderlist.get(i);if(cylinder.number>=now)no = i;}Cylinder c = cylinderlist.get(no);//访问到后将选中的柱面移除访问序列cylinderlist.remove(no);//将选中的柱面号赋值给当前移动臂在的位置now = c.number;
}

如果现在是向里移动(向0号方向移动),选择小于当前柱面号的访问者中柱面号最大者,类似

public void findMax(){previews = now;int no = 0;for(int i=0;i<cylinderlist.size();++i){Cylinder cylinder = cylinderlist.get(i);if(cylinder.number<=now)no = i;}Cylinder c = cylinderlist.get(no);cylinderlist.remove(no);now = c.number;
}

改变图形界面移动的颜色

public void display(){//判断如果是向里移动if(previews-now<0){//循环为之前完成的柱面号至当前柱面号for(int k=previews;k<now;++k){//将当前TextField的颜色置为灰色TextField textField2 = textFields.get(k+1);textField2.setBackground(Color.GRAY);//将刚才访问过的TextField颜色置为白色TextField textField = textFields.get(k);textField.setBackground(Color.WHITE);//休眠时间,可以调整移动的速度try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//与上面类似if(previews-now>0){for(int k=previews;k>now;--k){TextField textField2 = textFields.get(k-1);textField2.setBackground(Color.GRAY);TextField textField = textFields.get(k);textField.setBackground(Color.WHITE);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

为按钮加点击事件

public void actionPerformed(ActionEvent e) {//获取点击事件String event = e.getActionCommand();//判断点击了哪个按钮switch (event) {case "NEXT":if(cylinderlist.size()>0){//向外移动调用findMin()方法if ((now-previews)>0&&now!=199){findMin();//输出看一下结果System.out.println("previews:"+previews+" now:"+now);//显示效果display();}else {//向里移动调用findMax()方法findMax();System.out.println("previews:"+previews+" now:"+now);display();}}else{System.out.println("已完成");}break;case "START"://获取文本框中的数字previews = Integer.parseInt(tf1.getText());now = Integer.parseInt(tf2.getText());	//初始化init();System.out.println(now+" "+previews);break;default:break;}}

调用方法

public static void main(String[] args) {Elevator elevator = new Elevator();elevator.showUI();}

到这所有的代码就写完了,加起来不会超过200行。如果嫌点击太慢,可以弄个循环,循环次数为访问队列的长度。想计算总共移动的量,可以定义一个变量,初始值定义为0,每次移动的时候增加|now-previews|。

效果图

gif
Console

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/252653.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

算法高级(39)-坐电梯时情不自禁想起的电梯调度算法实现原理

一、引言 现代社会中&#xff0c;不管你是在北上广、北海道、新加坡&#xff0c;或者是三四五六七八线的小城市&#xff0c;凡是有点规模的地方&#xff0c;高楼大厦都是比比皆是的。而在上下楼的时候&#xff0c;不可避免的会跟电梯打交道。而一般情况你也很少能心平气和地等…

电梯调度

在像芝加哥&#xff0c;纽约&#xff0c;东京&#xff0c;新加坡&#xff0c;香港等大城市里&#xff0c;每天都会有上百万的人通过电梯离开他们的大楼。但是我们却很少考虑电梯是如何调度来提供服务的&#xff0c;尤其是在人流高峰期&#xff0c;这个时候办公楼里的大多数人都…

电梯调度算法

磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器&#xff0c;担负着繁重的输入输出任务、在多道程序设计系统中&#xff0c;往往同时会有若干个要求访问磁盘的输入输出请求等待处理&#xff0c;这时我们就需要采用一种合适的调度算法来使…

苹果主屏幕按钮怎么设置_苹果手机屏幕变大怎么恢复

如果苹果手机屏幕放大起来&#xff0c;其实只要同时使用三个手指快速连续点击手机屏幕两次&#xff0c;手机界面就会恢复正常。还可以在【设置】-【通用】-【辅助功能】中将【缩放】开关关闭。在【辅助功能】中【更大字体】选项中可以调整字体的大小。具体介绍如下&#xff1a;…

苹果主屏幕按钮怎么设置_Mac小技巧 Mac屏幕旋转怎么设置

相信不少的Mac用户在躺下看电子书或者电影的时候&#xff0c;都希望可以将Mac的电脑屏幕进行旋转&#xff01;其实&#xff0c;这个操作是可以实现的呢&#xff01;那么&#xff0c;你知道Mac屏幕旋转怎么设置吗&#xff1f;想要知道答案的话就快来阅读下面的文章吧&#xff01…

苹果屏幕旋转怎么设置_iPhone12屏幕供应商是谁 苹果12屏幕怎么查看是哪家

苹果iPhone12系列手机在10月份正式发售上市&#xff0c;今年的iPhone12全系列都使用了OLED屏幕&#xff0c;官方将这块屏幕称之为超视网膜 XDR 显示屏&#xff0c;那么今年的iPhone12系列屏幕供应商有哪些&#xff0c;怎么分辨自己手上的iPhone12屏幕来自哪家公司呢&#xff0c…

苹果手机投屏软件_苹果手机怎样投屏到笔记本?

注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&#xff0c;著作权属归原创者所有。我们分享此文出于传播更多资讯之目的。如有侵权&#xff0c;请在后台留言联系我们进行删除&#xff0c;谢谢&#xff01; 经常用手机的小伙伴都知道&am…

怎么设置苹果手机的小圆点_苹果屏幕旋转怎么设置?关于苹果手机设置的一些小技巧...

苹果屏幕旋转怎么设置&#xff1f;在平常使用手机观看视频的时候&#xff0c;很多人希望手机屏幕可以自己旋转为横屏状态&#xff0c;在使用微信聊天的时候再自动转为竖屏&#xff0c;这种切换可以直接利用控制中心的一个功能来实现。 如何开启苹果手机的屏幕旋转&#xff1f;首…

苹果屏幕使用时间怎么设置_苹果手机屏幕不能旋转怎么办

很多刚刚接触苹果手机的人&#xff0c;可能不知道怎么使用苹果手机。那么苹果手机屏幕不能旋转怎么办呢&#xff1f;下面就让小编来告诉大家吧&#xff0c;欢迎阅读。 1、苹果手机页面未锁定的情况下从屏幕底端向上滑动&#xff0c;弹出小界面窗口。 2、可以看到小窗口顶部左端…

linux屏幕旋转后触控不准,手机重力感应失效解决方法 不能自动旋转屏幕怎么设置...

如今手机已经成为人们生活中必不可少的一个工具了&#xff0c;在使用过程也常常会遇到各种各样的问题&#xff0c;比如当手机重力感应失效的时候应该怎么解决呢&#xff0c;手机不能自动旋转屏幕要怎么设置&#xff0c;针对这个问题下面就为大家带来最新解决方法&#xff0c;希…

苹果6怎样打开html,苹果6屏幕旋转怎么设置 怎么开启和关闭【图文】

手机在使用的过程中&#xff0c;通常都会有两种状态&#xff0c;横屏与竖屏&#xff0c;大家的使用习惯不一样&#xff0c;所喜欢的状态也不一样&#xff0c;而且手机都会有屏幕自动旋转的情况&#xff0c;它会根据手机的摆放状态自己切换&#xff0c;比较方便大家使用&#xf…

会员管理系统,建议收藏!

你见过会员管理系统吗&#xff1f;在一些线下的美容院&#xff0c;健身房&#xff0c;理发店&#xff0c;往往会有办理会员这样的需求&#xff0c;所以会员管理系统应运而生。那会员管理系统有哪些作用呢&#xff1f; 会员卡&#xff1a;无需填写信息、无需实体会员卡&#xf…

会员卡系统的管理运营

下面的是会员系统的源代码和DOS命令的运行

会员卡应用管理系统源码 支持收银+积分管理+商城营销功能 含详细搭建教程

分享一个会员卡应用管理系统源码&#xff0c;收银积分管理商城营销系统源码&#xff0c;含完整的程序包和搭建教程。 系统功能一览&#xff1a; 1、精简强悍&#xff0c;会员卡&#xff0c;积分&#xff0c;在线充值&#xff0c;商家核销&#xff0c;在线下单&#xff0c;优惠…

C语言:会员管理系统

会员信息包括&#xff1a;会员号&#xff08;6位数&#xff0c;唯一&#xff09;&#xff0c;姓名&#xff0c;身份证号&#xff0c;联系电话&#xff0c;状态&#xff08;1表示正常&#xff0c;0表示挂失&#xff09;。 会员管理包括&#xff1a;会员的添加、删除、修改&#…

云上铺会员管理系统支持什么类型会员卡?

最近很多打算购买我们系统的客户都在问我们&#xff0c;云上铺到底支持什么会员卡&#xff0c;今天趁这个机会专门给大家讲一下。 云上铺会员管理系统&#xff0c;作为一款独立开发设计的SAAS会员管理系统&#xff0c;广泛适用于美容美发&#xff0c;汽车美容&#xff0c;服装…

C语言 会员管理系统

大一上学期期末项目设计&#xff1b; 思路参考&#xff1a;【千锋教育新版C语言程序设计视频教程&#xff08;适合自学&#xff0c;c语言初学者入门教程&#xff09;】 https://www.bilibili.com/video/BV1id4y1375a/?p119&share_sourcecopy_web&vd_sourcea6401c9820…

微信会员卡管理系统会员充值说明

云上铺微信会员卡管理系统会员充值即会员卡储值进行余额消费一种操作。 基础操作&#xff1a;点击【消费收银】→【会员充值】&#xff0c;显示有【会员充值/扣款/转账/提现】等业务&#xff0c;如下图所示&#xff1a; 会员充值必须先选择会员信息,输入会员卡号&#xff0c;或…

超市VIP卡管理系统

好久没有碰VS了。。。只好自己找个项目练手。 今天找了个练习的项目&#xff0c;超市VIP卡管理系统。 拿到手的项目需求就这么点。 &#xff08;1&#xff09; 会员卡使用磁卡&#xff0c;允许手工输入卡号和扫描器输入两种方式。会员卡号的长度为10位&#xff0c;前两位是各分…