1. 使用说明

1.1 项目简介

电梯作为人们出行的重要工具之一,在人们日常生活中扮演着重要的角色。而电梯的调度算法是决定电梯运行效率的关键,一个高效的调度算法对电梯能否有效地运行起到重要的作用。因此,设计一套良好的调度算法具有十分重要的意义。

1.2 项目目的

1.2.1 学习调度算法

1.2.2 通过实现电梯调度,体会操作系统调度过程

1.2.3 学习特定环境下多线程编程方法

1.3 项目功能要求

1.3.1 基本任务

某一层楼20层,有五部互联的电梯。基于线程思想,编写一个电梯调度程序。

1.3.2 功能描述

每个电梯里面设置必要功能键:如数字键、关门键、开门键、上行键、下行键、报警键、当前电梯的楼层数、上升及下降状态等。

每层楼的每部电梯门口,应该有上行和下行按钮和当前电梯状态的数码显示器。

五部电梯门口的按钮是互联结的,即当一个电梯按钮按下去时,其他电梯的相应按钮也就同时点亮,表示也按下去了。

所有电梯初始状态都在第一层。每个电梯如果在它的上层或者下层没有相应请求情况下,则应该在原地保持不动。

调度算法自行设计

1.4 操作手册

1.4.1 数字键

每部电梯中都设有1-20的数字键,点击数字键,电梯到达指定楼层。如图操作:

1.4.2 上下行健

每个楼层设有上行和下行键,点击上下行健,所有电梯都会接收到请求,调度算法进行调度,安排电梯到达该楼层,如图操作:

2. 程序设计与实现

2.1 设计

2.1.1开发环境及语言开发环境:pycharm

开发语言:python

本项目采用PyQt5实现图形化用户界面,达到电梯调度可视化的目的。

2.1.2 算法设计

对于单部电梯采用LOOK算法:

先讨论最短寻找楼层时间优先算法(SSTF):

最短寻找楼层时间优先(SSTF-Shortest Seek Time First)算法,它注重电梯寻找楼层的优化。

最短寻找楼层时间优先算法选择下一个服务对象的原则是最短寻找楼层的时间。

这样请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。

在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大,原因是队列中 的某些请求可能长时间得不到响应,出现所谓的“饿死”现象。

再讨论扫描算法(SCAN):

扫描算法(SCAN)

扫描算法(SCAN) 是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。

它进行寻找楼层的优化,效率比较高,但它是一个非实时算法。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的。

所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成,免去了电梯频繁的来回移动。

扫描算法的平均响应时间比最短寻找楼层时间优先算法长,但是响应时间方差比最短寻找楼层时间优先算法小,从统计学角度来讲,扫描算法要比最短寻找楼层时间优先算法稳定。

而LOOK算法是对扫描算法的一种改进算法:

对LOOK算法而言,电梯同样在最底层和最顶层之间运行。

但当 LOOK 算法发现电梯所移动的方向上不再有请求时立即改变运行方向,而扫描算法则需要移动到最底层或者最顶层时才改变运行方向。

比较多种算法,要避免“饿死”现象,且最大限度地缩短平均响应时间,提高稳定性,考虑采用LOOK算法

在单部电梯LOOK算法的基础上,对于多部电梯寻求最短时间调度:

对于每部电梯,为其设计一对上下行序列数组,其中上行序列数组正序排列,下行序列数组倒序排列,电梯根据目前状态以及两数组中内容执行动作。

当某楼层有上行或下行请求发出时,先考虑每部电梯在完成当前序列的过程中能否响应该请求,计算出符合此条件的电梯的响应距离,再考虑剩余电梯从其当前位置到序列终点与终点到该请求位置的响应距离之和,最后比较每部电梯的响应距离,将该请求分配给具有最短响应距离一部电梯。

2.1.3 数据结构设计

本项目要求对每部电梯的状态进行实施监测,需要存储电梯的运行状态,且每部电梯还需要有对应的调度命令,采用python内置的list以及dictionary来存储数据。

2.1.4 类结构设计

UI类

classUi_MainWindow(object):

类成员

defsetupUi(self,MainWindow):# 设置主窗口UI,加载所需的背景,button以及Label

调度类

classelevator_schedul():

类成员

属性

self.isUp={}# 电梯上行标志数组

self.isDown={}# 电梯下行标志数组

self.last_isUp={}# 电梯前一次上行标志数组

self.last_isDown={}# 电梯前一次下行标志数组

self.location={}# 电梯所在层数数组

self.upfloor=[[0]*21foriinrange(6)]# 记录某电梯将处理但未处理的楼层上行请求

self.downfloor=[[0]*21foriinrange(6)]# 记录某电梯将处理但未处理的楼层下行请求

self.upSequence=[[]foriinrange(6)]# 电梯上行序列数组

self.downSequence=[[]foriinrange(6)]# 电梯下行序列数组

方法

# 监听上行按钮

defupbutton_listen(self,btn_number):

# 监听下行按钮

defdownbutton_listen(self,btn_number):

# 监听电梯楼层数字按钮,elevator_number:电梯序号,btn_number:按钮楼层号

defnumberbtn_listen(self,elevator_number,btn_number):

# 创建线程

defthread(self,elevator_number):

# 加载上行序列动画

defelevator_up_anim(self,elevator_number):

# 加载下行序列动画

defelevator_down_anim(self,elevator_number):

# 执行完上行动作恢复静止后,处理执行动作时产生的但未处理的请求

# 此时执行动作时产生的但未处理的下行请求可能在任意位置,但执行动作时产生的但未处理的上行请求只可能在下方

defelevator_finish_up(self,elevator_number):

# 执行完下行动作恢复静止后,处理执行动作时产生的但未处理的请求

# 此时执行动作时产生的但未处理的上行请求可能在任意位置,但执行动作时产生的但未处理的下行请求只可能在上方

defelevator_finish_down(self,elevator_number):

# 每趟动画执行完后,对该趟动画执行时产生的未能执行的数据进行处理

deffinish_anim(self,elevator_number):

# 加载电梯动画

defelevator_anim(self,elevator_number):

主窗口界面类

classmyWindow(QtWidgets.QMainWindow):

类成员

self.ui=Ui_MainWindow()# 创建UI

self.ui.setupUi(self)# 设置UI

self.schedul=elevator_schedul(self.ui)# 创建调度逻辑

2.2 主要功能实现

2.2.1 监听上下行按钮【以上行为例】

2.2.2 监听数字按钮

2.2.3 执行完上下行动作恢复静止后,处理执行动作时产生的但未处理的请求【以上行为例】# 此时执行动作时产生的但未处理的下行请求可能在任意位置,但执行动作时产生的但未处理的上行请求只可能在下方

defelevator_finish_up(self,elevator_number):

i=20

whilei>=1:# 倒序处理执行动作时产生的但未处理的下行请求

ifself.downfloor[elevator_number][i]==1:

ifi>self.location[elevator_number]:# 上方存在执行动作时产生的但未处理的下行请求

self.upSequence[elevator_number].append(i)# 将最高楼层的下行请求加入上行序列,继续上行

self.upSequence[elevator_number]=list(set(self.upSequence[elevator_number]))

self.isUp[elevator_number]=True

# self.ui.isup_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isup.png"))

# self.ui.isdown_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isnotdown.png"))

break

# 上方不存在执行动作时产生的但未处理的下行请求

self.downfloor[elevator_number][i]=0

self.downSequence[elevator_number].append(i)# 将记录的上方的上行请求加入上行序列,开始上行

self.downSequence[elevator_number]=list(set(self.downSequence[elevator_number]))

self.downSequence[elevator_number].sort()

self.downSequence[elevator_number].reverse()

self.isDown[elevator_number]=True

# self.ui.isup_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isnotup.png"))

# self.ui.isdown_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isdown.png"))

i=i-1

# 不存在下行请求,处理执行动作时产生的但未处理的上行请求(该请求只可能在下方)

ifself.isDown[elevator_number]==Falseandself.isUp[elevator_number]==False:

foriinrange(1,21):# 正序处理

ifself.upfloor[elevator_number][i]==1:

self.downSequence[elevator_number].append(i)# 将最底楼层的下行请求加入下行序列,开始下行

self.downSequence[elevator_number]=list(set(self.downSequence[elevator_number]))

self.isDown[elevator_number]=True

# self.ui.isup_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isnotup.png"))

# self.ui.isdown_label[elevator_number].setPixmap(QtGui.QPixmap("icon/isdown.png"))

break

3. 测试

3.1 功能键测试

上行:

测试用例:五部电梯处于随机状态,按下某一楼层上行按钮

预期结果:程序正常运行,具有最短响应距离的电梯处理请求:

测试结果:电梯1响应,符合预期

下行:

测试用例:五部电梯处于随机状态,按下某一楼层下行按钮

预期结果:程序正常运行,具有最短响应距离的电梯处理请求:

测试结果:电梯4响应,符合预期

数字键

测试用例:五部电梯处于随机状态,按下某一电梯数字按钮

预期结果:程序正常运行,该电梯正确处理请求:

测试结果:电梯正确响应,符合预期

python电梯题_课内资源 - 基于PyQt5实现的python电梯调度程序相关推荐

  1. python+diango写酒店管理系统_课内资源 - 基于Python的Django框架实现的中式快餐厅管理信息系统网站...

    1 初步调研 随着餐饮业的连锁和国外餐饮巨头的进入,餐饮业的竞争将越来越激烈:要想在竞争中处于不败之地,必须在管理.服务等方面提高服务管理意识.面对当前餐饮业普遍的产业化程度低,管理手段.管理技术落后 ...

  2. python迷宫小游戏代码_课内资源 - 基于python实现的迷宫游戏

    一.项目概述与编译环境 本次大作业选题为题目2,即小兔子找胡萝卜的迷宫问题,最终完成开发的游戏名为Caveman and Treasure(穴居人寻宝),游戏整体界面如下: 该项目在windows下编 ...

  3. python编程输出汉字_课内资源 - 基于Python的拼音汉字转换程序

    1.实验内容利用统计语言模型实现拼音汉字转换 输入:拼音串,输出:对应的汉字串 给定10000字的测试语料,测试音字转换的准确率 针对音字转换结果中存在的问题给出具体分析 以图表的形式表示上述结果 2 ...

  4. java洗衣店管理课程设计报告_课内资源 - 基于Java的洗衣店管理系统

    摘 要 随着科技的快速发展,人们的需求也是越来越多,为了方便对信息的管理我们小组就设计了一个洗衣店订单的管理系统. 洗衣店管理系统是典型的的信息管理系统,创建了六个类,分别是:Test类:Person ...

  5. java基本语法借阅_课内资源 - 基于Java和MySql实现的光盘借阅管理系统

    一.需求设计以下几个类:光盘类:用户类:借阅记录类,包括下列模块: 新建.修改.删除光盘信息 新建.修改.删除用户信息 光盘借阅/归还信息记录 查询光盘名称,用户的借阅历史 要求:基于JFrame窗体 ...

  6. jsp mysql在线考试系统源码_课内资源 - 基于JSP和MYSQL数据库实现的在线考试系统...

    1 系统概述 1.1 功能模块 教学部需要考试系统,该考试系统需要完成如下功能: 考试系统只针对于Java课程,题目全部为单项选择,共10题 学生注册.登录 后台管理员功能:题库管理.录入试卷.修改试 ...

  7. jsp mysql问卷调查_课内资源 - 基于JSP的在线调查问卷系统

    一.系统架构图 用户登入功能,由login.jsp页面和LoginServlet.java组成,页面用于填写用户名和密码:Servlet用于验证是否可以登入,如果能够登入,则将用户登入时间记录到数据库 ...

  8. mysql餐馆点餐系统_课内资源 - 基于Jsp和MySql的餐厅点餐系统

    1 总体概述 本设计主要通过HTML.CSS.JavaScript网页开发技术,会话及其会话技术,过滤器技术,Java语言以及连接mysql数据库来实现一个具有登录注册功能,且登录页面使用验证码技术来 ...

  9. java 图形处理_课内资源 - 基于Java实现的几何图形处理系统

    1 综述 针对<计算机图形学>课程开发的几何图形处理系统实现的功能包括:在UI界面中通过鼠标点击拖拽等方式可视化地输入二维图形的功能:编辑最近输入的二维图形的功能:裁剪直线的功能,支持的图 ...

最新文章

  1. 60行代码爬取知乎“神回复”,句句戳中泪点
  2. 如何快速采集分析平台日志,并进行展示监控?
  3. python代码实现鸡尾酒排序(双向冒泡排序)
  4. 属性为nil的时候测试是否crash  nil是不会崩溃的
  5. python有什么用途和价值-Python是什么 Python的用处
  6. Spring Aop实例之AspectJ注解配置
  7. java学习笔记 2022.2.11
  8. mysql创建表属性引_【学习之Mysql数据库】mysql数据库创建表的属性详解
  9. django新建一个项目_如何使用Django创建项目
  10. JSP版LCX:端口转发神器 KPortTran
  11. 欧拉系统安装+eSight安装
  12. Python.密码本生成
  13. ThinkPHP6 excel 导出功能完整实现
  14. 博客专家贡献(2022年至今)--2022-11-29(转)
  15. 开业两月有余的转转二手集市怎么没有声音了?
  16. org.bouncycastle.util.encoders.Base64.decode 解码去换行问题
  17. 操作系统中pv操作用c语言,操作系统-pv操作.doc
  18. 沙龙与华为强强携手,机甲龙惊艳广州车展
  19. 解决Flutter Android sdkmanager tool not found
  20. 使用idea搭建maven+ssm项目

热门文章

  1. 创建一个适用于BrainNet Viewer的.node文件---AAL2.node
  2. js中ondblclick
  3. eclipse查看euc-jp编码格式的文件
  4. 1752年9月奇怪的日历
  5. 阿里巨变,阿里巴巴取消 CTO
  6. 网红用什么软件录视频?从小白到大神,学会这些录屏技巧就够了!
  7. 池州控股集团财务共享项目启动啦!
  8. 吴刚:今天与appannie的人沟通国内appstore收入数据,最近一个月他们的分析结果,iphone第一分成后约十多万美金一个月,ipad第一是二战风云,约是iphone第一的两倍,是ipad收入
  9. R语言安装xlsx包以及可能遇到的问题
  10. 优傲机器人UR+平台 打造汽车智造“百变工具”