电梯算法
电梯调度算法

目录一、算法设计 (1)1.算法思想 (1)2.运行环境 (1)3.问题描述 (1)二、实验步骤及方法 (1)三、源程序代码 (2)四、运行结果图 (15)五、课程总结 (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; //计算开关门事件。
多电梯调度算法

多电梯调度算法
多电梯调度算法是一个用于控制多个电梯在一个大楼中高效运行的系统。
这个系统可以根据乘客的需求和楼层情况,智能地决定每个电梯应该去哪一层接乘客或者送乘客。
为了实现这一目标,多电梯调度算法可以采用以下策略:
1. 电梯最近停留楼层策略:当有新请求到来时,电梯会优先选择最近停留的楼层。
这样可以最大程度地减少电梯的等候时间和行程时间。
2. 同方向优先策略:当电梯到达某一楼层接乘客后,如果有相同方向的请求,电梯会优先选择同方向的请求而不会改变方向。
这样可以避免不必要的方向转变,提高效率。
3. 最小耗能策略:电梯在每一次移动时,会选择耗能最小的方向。
通过计算每个方向上的耗能,并综合考虑每个电梯的负载情况和楼层的请求情况,来选择耗能最小的方向。
4. 动态调整电梯数量策略:当需求量较小时,只开启少部分电梯。
而当需求量增加时,可以动态调整电梯的数量,以满足乘客的需求。
这样可以降低能源消耗和运营成本。
5. 紧急优先策略:当有紧急请求到来时,例如火警或者地震预警,系统会立即将所有电梯调度到底层,以最快速度将所有人员安全地送离建筑物。
通过以上策略的综合运用,多电梯调度算法可以实现电梯的高效运行,节约能源和时间,提供更好的乘坐体验。
该算法还可以根据实际情况进行调整和优化,以满足不同大楼的需求。
电梯调度算法总结

电梯调度算法总结⼀:任务要求本次的程序任务和要求如上图所⽰,需要有4部电梯同时运⾏,每部电梯都有⾃⼰的限制且被同⼀控制器所控制,希望有图形显⽰效果,本次的任务我们组已经完成,关于编程的历程与总结现在就⼀⼀道来。
⼆:初步构想阶段我们先尝试解决最核⼼的问题,即电梯的调度算法问题,初步构思是这样的,电梯根据当前控制器内所要到的楼层信息判断是向下运⾏或向上运⾏,并向上或向下运⾏⾄控制器内楼层的最⼤或最⼩值,期间出现的所有楼层信息都加⼊到控制器内,若有⽐最值更⼤或更⼩的信息不予理会,只是加⼊控制器中,每到⼀楼层就判断控制器内是否有该楼层,有则在该层停留,并移除控制器内该层信息,⽆则继续运⾏,运⾏⾄最值处,重新从控制器内找出最值,并判断向上或向下运⾏,如此循环。
当控制器内没有信息后,电梯等待⼀段时间后会回到初值处。
代码如下:1public void down()//定义⼀个下降函数便于复⽤2 {3for(;cout>=con.getmin();cout--)4 {5 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.black);6if(con.getlist(this.mode).contains(cout))7 {8 con.remove(cout);9 System.out.println("到达"+cout+"层");10 changepeople();11try {12 Thread.sleep(500);13 } catch (InterruptedException e) {14// TODO Auto-generated catch block15 e.printStackTrace();16 }17if(cout==con.getmin())18break;19 }20if(cout==con.getmin())21break;22try {23 Thread.sleep(200);24 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.white);25 } catch (InterruptedException e) {26// TODO Auto-generated catch block27 e.printStackTrace();28 }29 }30 }31public void run() //电梯运⾏算法主要运⾏函数32 {33while(true)34 {35while(!con.getlist(this.mode).isEmpty())36 {37 con.setmami();38if(con.getmax()>cout) //和下⾯的if组成判断电梯是否向上运⾏否则向下运⾏39 {40if(con.getmin()>cout||(con.getmax()-cout)<=(cout-con.getmin()))41 {42for(;cout<=con.getmax();cout++)43 {44 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.black); 45if(con.getlist(this.mode).contains(cout))46 {47 con.remove(cout);48 System.out.println("到达"+cout+"层");49 changepeople();50try {51 Thread.sleep(500);52 } catch (InterruptedException e) {53// TODO Auto-generated catch block54 e.printStackTrace();55 }56if(cout==con.getmax())57break;58 }59if(cout==con.getmax())60break;61try {62 Thread.sleep(200);63 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.white);64 } catch (InterruptedException e) {65// TODO Auto-generated catch block66 e.printStackTrace();67 }68 }69 }70else71 down();72 }73else//电梯向下运⾏的算法74 down();75 }76try {77 Thread.sleep(1000);78 } catch (InterruptedException e) {79// TODO Auto-generated catch block80 e.printStackTrace();}81while(con.getlist(this.mode).isEmpty()&&cout!=incout) //⽆任务回到初始楼层的函数82 {83 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.white);84if(cout>incout)85 {86 cout--;87 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.black);88try {89 Thread.sleep(200);90 } catch (InterruptedException e) {91// TODO Auto-generated catch block92 e.printStackTrace();93 }94 }95if(cout<incout)96 {97 cout++;98 vie.map.get(new Point(250-50*panmode,500-cout*20)).setBackground(Color.black);99try {100 Thread.sleep(200);101 } catch (InterruptedException e) {102// TODO Auto-generated catch block103 e.printStackTrace();104 }105 }106 }107 }108 }109 }我这⾥是从全部完成后的代码上截取出的算法部分,有图形显⽰的代码和⼀些实现其他功能的代码,初步构想时只是做出了算法,并在dos模拟。
电梯调度设计思路及算法:

电梯调度设计思路及算法:
将电梯作为一个类,声明四个对象,即四部电梯。
电梯类中属性:当前所在楼层(可用高度得出);
可承载最多人数;
可承载最大重量;
当前状态(可用速度,高度,皆有正负表示);
电梯类中函数:判断是否去接乘客(参数为乘客所在楼层数),{是否同向或静止};
计算当前所在楼层和乘客所在楼层之间差距(返回差距,在主函数中比较);
判断电梯是否超过电梯承载限额;
在一定时间内无人使用回到一层;
修改当前状态;
电梯运行中(参数为电梯内乘客所按层数),此函数为重载函数(参数个数不同);
主函数:
当乘客在电梯外按下上下键按钮时,四个电梯对象判断是否去接ta,在有电梯接的情况下,比较哪个最快到达;
若有相同的,则以乘客所按的那部电梯为标准;
若四部电梯都接不了,则等待至其中一部电梯进入可接状态。
乘客进入后按下要到的楼层,电梯进入运行中。
另一批乘客开始坐电梯,,,,,。
电梯调度算法总结(大全五篇)

电梯调度算法总结(大全五篇)第一篇:电梯调度算法总结1.传统电梯调度算法1.1先来先服务算法(FCFS)先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。
它根据乘客请求乘坐电梯的先后次序进行调度。
此算法的优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期得不到满足的情况[12]。
这种方法在载荷较轻松的环境下,性能尚可接受,但是在载荷较大的情况下,这种算法的性能就会严重下降,甚至恶化。
人们之所以研究这种在载荷较大的情况下几乎不可用的算法,有两个原因:(1)任何调度算法在请求队列长度为1时,请求速率极低或相邻请求的间隔为无穷大时使用先来先服务算法既对调度效率不会产生影响,而且实现这种算法极其简单。
(2)先来先服务算法可以作为衡量其他算法的标准。
1.2最短寻找楼层时间优先算法(SSTF)最短寻找楼层时间优先(SSTF-Shortest Seek Time First)[14]算法,它注重电梯寻找楼层的优化。
最短寻找楼层时间优先算法选择下一个服务对象的原则是最短寻找楼层的时间。
这样请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。
在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“饿死”现象。
1.3扫描算法(SCAN)扫描算法(SCAN)是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。
它进行寻找楼层的优化,效率比较高,但它是一个非实时算法。
扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的,所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成,免去了电梯频繁的来回移动[2]。
电梯调度算法

电梯调度算法
1.最省电算法,当一台电梯自下而上运行时,不同楼层的人呼叫电
梯时,出行方向与电梯运行方向一致的用户并且电梯所在楼层小于呼叫楼层将被响应,电梯方向反向运行后,出行方向与电梯一致的用户且电梯所在楼层大于呼叫楼层将被响应,电梯如此循环往复运行以最省电算法响应呼叫用户。
2.先按先服务算法,根据客户所按楼层电梯呼叫按钮的先后顺序做
出响应,谁先请求,先响应谁,并且后按的如果在电梯顺便的情况下(电梯还未到达且电梯运动方向与请求方向一致时)可以响应后按按钮用户的请请求。
3.优先级服务算法,给予不同楼层不同的优先级,优先级高的楼层
用户呼叫首先响应,同优先级相同楼层按先按先服务算法调度,优先级高的用户服务完后再服务优先低的用户提出申请,同一优先级用户按先按先服务算法调度,电梯内的请求可以划为一类优先级。
4.特权级服务算法,给予不同楼层及电梯内用户不同优先级,优先
级高的用户的要求满足后,再服务优先级低的用户,直至最后一级客户的请求被响应。
电梯优先调度算法

电梯优先调度算法电梯调度算法(ms InterView)移臂调度算法包括以下四种:1)先来先服务算法:根据访问者提出访问请求的先后次序来决定执行次序。
2)最短寻找时间优先调度算法:从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。
3)电梯调度扫描算法:从移动臂当前位置沿移动方向选择最近的那个柱面的访问者来执行,若该方向上无请求访问时,就改变移动方向再选择。
4)单向扫描调度算法:从0柱面开始往里单向扫描,扫到哪个执行哪个。
*/// t1.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include"math.h"#include"stdlib.h"#include"string.h"struct Head{int nPosition;bool bVisited;};void Visit(struct Head *pHead){printf("visite cy:%d\n",pHead->nPosition); pHead->bVisited=true;}int ReadInputKeyboard(struct Head *pHead,int *pCurrentPosition,int nMaxNumber){int i;printf("please input Current position:");scanf("%d",pCurrentPosition);printf("please input will visit position:");for(i=0;i<nMaxNumber;i++){scanf("%d",&pHead[i].nPosition);pHead[i].bVisited=false;if(pHead[i].nPosition<0)break;}return i;}int ReadInputFile(struct Head *pHead,int *pCurrentPosition,int nMaxNumber){int i;char szFileName[256],*q,*p,szTemp[20];printf("please input filename:");scanf("%s",szFileName);FILE *pFile=fopen(szFileName,"r");if(pFile==NULL){printf("open file %s error",szFileName); return -1;}for(i=0;!feof(pFile) &&i<nMaxNumber;) {p=szFileName;fgets(p,256,pFile);while(q=strchr(p,',')){memset(szTemp,0,sizeof(szTemp)*sizeof(char)); strncpy(szTemp,p,q-p);p=q+1;if(i==0)*pCurrentPosition=atoi(szTemp);else{pHead[i-1].nPosition=atoi(szTemp);pHead[i-1].bVisited=false;}i++;}memset(szTemp,0,sizeof(szTemp)*sizeof(char));pHead[i-1].nPosition=atoi(p);pHead[i-1].bVisited=false;//i++;}fclose(pFile);return i;}int FifoVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {//先来先服务int nHaveVisited=0;int nMoveDistance=0;int i;while(nHaveVisited<nNumber){for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;Visit(&pHead[i]);nHaveVisited++;nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition); nCurrentPosition=pHead[i].nPosition;}}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int SsfoVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {// 最短寻找时间优先int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber){nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)) {nMinDistance=abs(pHead[i].nPosition-nCurrentPosition); nMinIndex=i;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int DtVisit(int nCurrentPosition,bool bOut,struct Head *pHead,int nNumber){//电梯调度算法int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber)nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(bOut&&pHead[i].nPosition<nCurrentPosition||!bOut&am p;&pHead[i].nPosition>nCurrentPosition){if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;}}}if(nMinDistance==0xffff){bOut=!bOut;continue;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int DxVisit(int nCurrentPosition,struct Head *pHead,int nNumber) {//单向调度算法int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited<nNumber){nMinDistance=0xffff;nMinIndex=0;//找最小值for(i=0;i<nNumber;i++){if(pHead[i].bVisited)continue;if(pHead[i].nPosition>nCurrentPosition ){if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)) {nMinDistance=abs(pHead[i].nPosition-nCurrentPosition); nMinIndex=i;}}}if(nMinDistance==0xffff){nMoveDistance+=199-nCurrentPosition;nCurrentPosition=0;continue;}//访问Visit(&pHead[nMinIndex]);nHaveVisited++;nMoveDistance+=nMinDistance;nCurrentPosition=pHead[nMinIndex].nPosition;}printf("the sum of move distance:%d\n",nMoveDistance); return nMoveDistance;}int main(int argc, char* argv[]){//p114struct Head mylist[20];//={98,false,183,false,37,false,122,false,14,false,124,false,65,f alse,67,false};//int nCurrentPosition=53;//int nRealNumber=8;int nCurrentPosition=0;int nRealNumber=ReadInputFile(mylist,&nCurrentPosition,20);// FifoVisit(nCurrentPosition,mylist,nRealNumber);// SsfoVisit(nCurrentPosition,mylist,nRealNumber);//DtVisit(nCurrentPosition,false,mylist,nRealNumber);DxVisit(nCurrentPosition,mylist,nRealNumber);return 0;}。
电梯调度算法的研究与应用

电梯调度算法的研究与应用在现代城市生活中,电梯已经是我们每天不可缺少的交通工具之一。
随着现代科技的进步,电梯的功能也越来越强大。
然而,现在的电梯调度算法仍存在一些不足之处。
本文将探讨电梯调度算法的研究现状以及其应用,希望能对大家有所启发。
一、背景介绍电梯调度算法是指通过计算机程序控制电梯的运行,使其能够按照一定的算法和规则运行,达到更加高效和人性化的运行方式。
随着人们对生活品质的不断追求,电梯调度算法也在不断发展和创新。
我们可以看到,现代电梯已经具备了智能控制、网络监控等功能,电梯调度算法也已逐渐成为电梯设计和制造中的关键技术之一。
二、电梯调度算法的分类目前,电梯调度算法主要可分为以下三种:1. 基于传统控制理论的算法这种算法主要依赖于传统的控制理论,采用经典控制方法进行控制。
其特点是控制效果较为稳定,但常常需要经过长时间的实验和调试才能精确掌握。
2. 基于人工智能的算法随着人工智能技术的不断发展,越来越多的电梯制造厂商开始采用基于人工智能的算法进行电梯调度控制。
这种算法能够自适应环境变化,最大化电梯的效率,提高穿梭效率和运行安全性。
但其缺点是,经验不足的人员很难通过简单的述职来做出决策,需要对算法进行不断优化和改进,提高运作效率。
3. 基于模型预测的算法这种算法主要依靠复杂的数学模型,通过预测电梯载客量和人员流动情况等信息,自动控制电梯的调度运行。
其优点是能够高度智能自适应,能够适应不同时间和载客量的变化,但缺点是需要大量的数据来进行预测和学习,需要借助大量的计算设备和软件工具。
三、电梯调度算法的应用电梯调度算法的应用主要集中在以下几个方面:1. 建筑物电梯调度优化电梯调度算法主要用于控制楼层间电梯运行的优化,使得电梯能够更快地到达目的地并降低乘客等待时间。
通过增加和调整电梯的载客量,调整电梯的速度,能够更好的适应不同的载客量和运行环境。
2. 校园电梯控制升级对于高校等机构来说,采用电梯调度算法可以有效提高校园电梯的运行效率和安全性,使学生出行更加方便和快捷。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
io io = (io) waitlist.get(i);
io io1 = new io();
io1.setCourse(io.getCourse());
io1.setCylinder(io.getCylinder());
static String course = "Null";//定义静态值存放进程名
static int cylinder = 0;//定义静态值存放柱面位置
static int track = 0;//定义静态值存放磁道位置
static int record = 0;//定义静态值存放物理记录位置
p = i;
}
}
}
}
if (p == 0 && list.size() >= 1) {//若找到比当前值小的元素,进行list表中对应元素的删除并继续
io io = (io) list1.get(p);
int a, b, c;
a = io.getCylinder() - cylinder;
b = io.getTrack() - track;
io.setRecord(sc.nextInt());
list.add(io);
}
public void Scheduling() {
ArrayList<io> list1 = (ArrayList<io>) list.clone();
ArrayList<io> list2 = (ArrayList<io>) list.clone();
System.out.println("输入进程名柱面号磁道号物理记录号");
io.setCourse(sc.next());
io.setCylinder(sc.nextInt());
io.setTrack(sc.nextInt());
io.setRecord(sc.nextInt());
if ("up".equals(side)) {//摆臂方向为up时,当输入值小于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待
DiskDispatchArithmetic ds = new DiskDispatchArithmetic();
Scanner sc = new Scanner(System.in);
System.out.println("输入随机数:");
//double i = Math.random();
//int i = 1;
if (a != 0) {//若比较得到当前柱面号与下一个准备操作进程柱面号不同,则按照side方向寻找适合值
System.out.println("即将调度的进度不在此柱面号中,按照" + side + "方向寻找适配进度");
}
if (a == 0 && b != 0) {//若比较得到当前磁道号与下一个准备操作进程磁道号不同,则按照side方向寻找适合值
Collections.sort(list1, comparator);//调用从小到大排序进行排序
System.out.println("当前io表:");
System.out.println("进程名" + " " + "柱面号" + " " + "磁道号" + " " + "物理记录号");
for (int i = 0; i < list2.size(); i++) {//打印当前io表
}
course = io.getCourse();
cylinder = io.getCylinder();
track = io.getTrack();
record = io.getRecord();
ut.println("将要调度的进程:");
System.out.println("进程名" + " " + "柱面号" + " " + "磁道号" + " " + "物理记录号");
c = io.getRecord() - record;
System.out.println("当前所指向进程:");
System.out.println("进程名" + " " + "柱面号" + " " + "磁道号" + " " + "物理记录号");
System.out.println(course + " " + cylinder + " " + track + " " + record);
flag = 1;
} else {
flag = 0;
}
}
if (flag == 1) {
return true;
} else {
return false;
}
}
public void Request() {//运行后添加io表的元素
io io = new io();
Scanner sc = new Scanner(System.in);
System.out.println("当前所指向进程:");
System.out.println(cylinder + " " + track + " " + record);
side = "down";
System.out.println("由于没有比当前所指向进程更大的进程,移动方向改变,为" + side);
//int i=0;
int i = sc.nextInt();
if (list.isEmpty() && waitlist.isEmpty()) {
System.out.println("当前io表为空,等待输入");
ds.toContinue();
}else{
if (i >= 0.5) {
System.out.println("随机数为" + i + "大于0.5,执行驱动调度");
if (io.getCylinder() < cylinder) {
if (io.getTrack() < track) {
if (io.getRecord() < record) {
waitlist.add(io);
}
}
} else {
list.add(io);
}
}
if ("down".equals(side)) {//摆臂方向为down时,当输入值大于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待
ds.Scheduling();
} else {
System.out.println("随机数为" + i + "小于0.5,执行接受请求");
ds.Request();
}
}
}
public boolean isHave(int a, int b, int c) {
ArrayList<io> list1 = (ArrayList<io>) list.clone();
int fcylinder = cylinder;//当前所在的柱面
int ftrack = track;//当前所在的磁道
int frecord = record;//当前所在的物理记录
if ("up".equals(side)) {//判断side方向为up时执行
ComparatorIo comparator = new ComparatorIo();
ComparatorIoTurn comparator = new ComparatorIoTurn();
Collections.sort(list1, comparator);
io1.setTrack(io.getTrack());
io1.setRecord(io.getRecord());
list.add(io1);
}
waitlist.clear();//清空waitlist
}
toContinue();
}
if ("down".equals(side)) {//当side为down,则进行从大到小排序,流程同上
for (int i = 0; i < list1.size(); i++) {//通过比较找到下一个准备操作的元素
io io = (io) list1.get(i);
if (fcylinder > io.getCylinder()) {