电梯调度算法
- 格式:doc
- 大小:102.00 KB
- 文档页数:15
目录一、算法设计 (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; //计算开关门事件。
电梯调度算法总结⼀:任务要求本次的程序任务和要求如上图所⽰,需要有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模拟。
第⼀个算法题-电梯调度算法参考⽂章⼀问题描述:所有的员⼯均在1楼进电梯的时候,选择所要到达的楼层。
然后计算出停靠的楼层i,当到达楼层i的时候,电梯停⽌。
所有⼈⾛出电梯,步⾏到所在的楼层中。
求所有⼈爬的楼层数⽬和的最⼩值。
⼆问题解决⽅法:解决⽅案:(1)使⽤简单的⽅法,直接将楼层从1到n开始遍历sum(person[i] * |i - j| ) 此表达式为⼀个双重循环,i与j均为1-n的循环。
j下标表⽰电梯停靠的楼层。
person数组表⽰,对应i层的下电梯的⼈数。
此算法负责度为o(n*n)对应的j是上述和为最⼩的⼀层即为所求。
上⾯的算法复杂度为o(n)(2)下⾯考虑⼀个简单的算法,使其复杂度达到o(n)考虑假如电梯停靠在某⼀楼层i处,假设在i处下楼的客⼈为N2,在i以上楼层的客⼈数⽬为N3 ,在i⼀下楼层的客⼈数⽬为N1。
且将电梯在i层停⽌时,全部⼈员的路程之和记为T。
那么加⼊电梯在i-1层停的话,则原来i层之上的⼈需要多爬⼀层,即增加了N3第i层的⼈需要多爬⼀层,则结果增加了N2, i层之下的⼈则少爬了⼀层,结果减去N1所以第i-1层的结果为 T - N1 + N2 + N3 。
即结果可以即为 T -(N1 - N2 - N3)下⾯考虑在i+1层的结果,若电梯在i+1层停⽌的话,原来i层之上的客户都会少爬⼀层,则结果减少N3 ,⽽i层之下的⼈员则都会多爬⼀层即增加了N1 ,第i层的⼈员都会多爬⼀层即为增加了N2 。
则结果为 T + N1 + N2 - N3综上我们得出,(1)若N1 > N2 + N3的时候,我们在第i-1层选择电梯停⽌最好。
(2)若N1 + N2 < N3的时候,我们选择在第i+1层停⽌电梯最好。
个⼈完全不知道什么是o(n) 的概念,等熟能⽣巧,每天有时间就看看算法问题。
电梯调度设计思路及算法:
将电梯作为一个类,声明四个对象,即四部电梯。
电梯类中属性:当前所在楼层(可用高度得出);
可承载最多人数;
可承载最大重量;
当前状态(可用速度,高度,皆有正负表示);
电梯类中函数:判断是否去接乘客(参数为乘客所在楼层数),{是否同向或静止};
计算当前所在楼层和乘客所在楼层之间差距(返回差距,在主函数中比较);
判断电梯是否超过电梯承载限额;
在一定时间内无人使用回到一层;
修改当前状态;
电梯运行中(参数为电梯内乘客所按层数),此函数为重载函数(参数个数不同);
主函数:
当乘客在电梯外按下上下键按钮时,四个电梯对象判断是否去接ta,在有电梯接的情况下,比较哪个最快到达;
若有相同的,则以乘客所按的那部电梯为标准;
若四部电梯都接不了,则等待至其中一部电梯进入可接状态。
乘客进入后按下要到的楼层,电梯进入运行中。
另一批乘客开始坐电梯,,,,,。
.实验八电梯调度算法.一、实验目的1) 掌握电梯调度算法相关理论;2) 设计程序模拟电梯调度算法过程.二、实验主要设备及使用要求按操作计算机的要求使用好计算机设备。
.三、实验原理或算法(一)磁盘调度主要思想扫描算法(SCAN)SCAN 算法又称电梯调度算法。
SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。
“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。
这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客陈生、伍生、张生在等候乘电梯。
他们的要求是:陈生在2层等待去10层;伍生在5层等待去底层;张生在8层等待15层。
由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张生从8层带到15层,然后电梯换成下行方向,把乘客伍生从5层带到底层,电梯最后再调换方向,把乘客陈生从2层送到10层。
仍用前述的同一例子来讨论采用“电梯调度”算法的情况。
由于磁盘移动臂的初始方向有两个,而该算法是与移动臂方向有关,所以分成两种情况来讨论。
〈1〉.移动臂由里向外移动开始时在50号柱面执行操作的读写磁头的移动臂方向是由里向外,趋向32号柱面的位置,因此,当访问50号柱面的操作结束后,沿臂移动方向最近的柱面是 32号柱面。
所以应先为32号柱面的访问者服务,然后是为15号柱面的访问者服务。
之后,由于在向外移方向已无访问等待者,故改变移动臂的方向,由外向里依次为各访问者服务。
在这种情况下为等待访问者服务的次序是61、99、130、148、159、199。
〈2〉.移动臂由外向里移动开始时,正在50号柱面执行操作的读写磁头的移动臂是由外向里(即向柱面号增大的内圈方向)趋向61号柱面的位置,因此,当访问50号柱面的操作结束后,沿臂移动方向最近的柱面是61号柱面。
电梯调度算法课程设计一、课程目标知识目标:1. 学生理解电梯调度算法的基本原理和概念;2. 学生掌握至少两种常见的电梯调度算法,如扫描算法和最短路径算法;3. 学生了解电梯调度算法在现实生活中的应用场景。
技能目标:1. 学生能够运用流程图和伪代码表达电梯调度算法;2. 学生通过编程实践,掌握一种电梯调度算法的实现;3. 学生能够分析并评估不同电梯调度算法的性能和优劣。
情感态度价值观目标:1. 学生培养对算法问题的兴趣,激发探索精神和创新意识;2. 学生在小组合作中,学会沟通与协作,培养团队精神;3. 学生通过学习电梯调度算法,认识到科技对提高生活质量的贡献,增强社会责任感。
课程性质:本课程为信息技术或计算机科学相关课程的拓展内容,旨在通过实践性学习,提高学生的算法思维和编程能力。
学生特点:假设为高中二年级学生,已具备一定的编程基础和问题解决能力。
教学要求:课程要求学生在理论学习的基础上,结合实践操作,深入理解电梯调度算法的设计与实现。
通过课程学习,学生能够将所学知识应用于实际问题的解决,提高综合运用能力。
教学过程中注重培养学生的独立思考、团队协作和创新能力。
课程目标的设定旨在使学生在知识、技能和情感态度价值观方面取得全面发展。
二、教学内容本课程教学内容围绕以下三个方面展开:1. 理论知识:- 电梯调度算法的基本概念与原理;- 常见电梯调度算法的介绍,包括扫描算法、最短路径算法等;- 电梯调度算法在实际应用中的优势与局限。
2. 实践操作:- 使用流程图和伪代码表达电梯调度算法;- 编程实现一种电梯调度算法;- 分析并比较不同电梯调度算法的性能。
3. 教学大纲与进度安排:- 第一章节:电梯调度算法基本概念与原理(1课时)- 内容:介绍电梯调度算法的定义、发展历程及基本原理;- 第二章节:常见电梯调度算法(2课时)- 内容:详细讲解扫描算法、最短路径算法等,并通过实例进行分析;- 第三章节:电梯调度算法的应用与实践(3课时)- 内容:实践操作部分,包括流程图绘制、伪代码编写、编程实现及性能分析。
电梯调度算法总结(大全五篇)第一篇:电梯调度算法总结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.特权级服务算法,给予不同楼层及电梯内用户不同优先级,优先
级高的用户的要求满足后,再服务优先级低的用户,直至最后一级客户的请求被响应。
目录一、算法设计 (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; //计算开关门事件。
电梯优先调度算法电梯调度算法(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;}。
课程设计报告电梯调度算法学院医药信息工程学院专业年级 2008 学生姓名学号指导教师2011-7-12电梯调度算法设计报告一.LOOK(查找)调度(电梯)电梯算法,操作系统学术名为SCAN算法。
磁臂仅移动到请求的最外道就回转。
反方向查找服务。
1.问题描述:说明:电梯调度算法的基本原则就是如果在电梯运行方向上有人要使用电梯则继续往那个方向运动,如果电梯中的人还没有到达目的地则继续向原方向运动。
具体而言,如果电梯现在朝上运动,*如果当前楼层的上方和下方都有请求,则先响应所有上方的请求,然后才向下响应下方的请求;如果电梯向下运动,则刚好相反。
*设计要求:模拟多人在不同楼层同时要求到各自目的地时电梯的响应顺序,要求使用C语言编程,定义合适的数据结构。
最后,需要说明设计思想,同时给出能够运行的源程序,并给出对应的程序流程图。
* 设计提示:可以用一个结构体表示乘电梯的人,其中内容包括人的姓名、起始楼层、目的楼层;建立一个结构体的数组模拟当前所有需要乘电梯的人。
把这个结构体数组作为程序的输入,*通过对数组中每个人的起始楼层和目的楼层进行分析,确定每个人进出电梯的顺序,并打印输出。
2.算法设计:本程序用java语言、eclipse平台编写。
(1)算法思想:本算法只设计了一辆电梯,通过往返寻找方法,即先查询电梯运行方向的楼层是否存在有其他键被按下,有就继续往该方向运行,如果没有就查询电梯运行反方向的楼层是否有按键被按下,如果有电梯就改变方向,反方向运行。
如果没有电梯就停止在该楼层,30秒后如果没有任何键被按下,电梯就自动返回1楼驻停。
同时,电梯乘客所去的楼层方向与电梯当前方向一致的话,则电梯优先搭载该乘客。
随后再搭载去反方向的乘客。
实现电梯的升降操作。
二.1.总程序流程图如下2.代码如下:package Test1;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){// TODO Auto-generated method stubBrick 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 int[]table; //用二维数组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 int[10][2];for (int i = 0; i < 10; i++)for (int j = 0; j < 2; j++)controlTable[i][j] = 0;table = new int[10];for (int i = 0; i < 10; i++)table[i] = 0;upSignalTable = new int[10];downSignalTable = new int[10];for (int i = 0; i < 10; i++) {upSignalTable[i] = 0;downSignalTable[i] = 0;}//********************画图************************ for(int i=10;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显示应该的颜色。