一、前言

本次博客我将简单介绍一下前两次的电梯作业,并简单解析一下我的程序结构,进一步对我的第二次作业的算法核心和一些想法做一些分享,我的电梯设计算法并不是由调度器来决定电梯的捎带与否,而是由电梯自主判断,在没有人员限制与其他条件的情况下,电梯自行判断电梯外是否有人以及是否需要捎带。

二、电梯作业的介绍

北航面向对象的课程第二单元要求设计一个载客电梯,该电梯为目的选层电梯,即需要使用电梯的人在未进入电梯时便已经输入自己要去的楼层(该种电梯已经在一些办公楼中投入使用),我们的任务是要实现它的调度算法,以实现最快最好运送完所有乘客,乘客的请求会在电梯运行过程红不断提出,我们则需要根据他们的请求控制电梯的运行,开关门,上下乘客。

三、第一、二次电梯作业的架构逻辑

简单的电梯作业不考虑电梯的最大载客量和电梯可去楼层的限制,用多线程的方法实现,是一个经典的生产者-消费者模型,可以设计一个请求池,乘客这个群体视为生产者,不断将请求放入池中,而电梯即使消费者,通过运行来满足乘客请求,视为将请求取走,因此完全是一个标准的生产者-消费者模型,因此我们创建一个Elevator电梯类作为实现电梯动作的载体,即消费者,创建一个Input类从终端接受请求,并将请求不断加入请求池中,即生产者,另外创建一个Dispatcher类,调度器,在第一次作业中调度器主要承担请求池的角色,而我们的请求池则是一个Queue队列,来存放和提供请求。

第一次作业UML类图如下:

主类中是一个死循环,不断从Input中接受请求,将请求放入Dispatcher,其中值得一提的是由于Input和Elevator都需要不断调用调度器,因此Dispatcher实现单例模式,以保证线程的安全,每一次循环创建一个接受请求的线程和执行电梯动作的线程,Operate是一个线程类,Elevator也是单例模式,接受Operate的调用,结束的标志是Input接受到null后返回一个标志表示请求结束,而后便跳出死循环结束程序

第一次作业的调度算法是傻瓜调度,即接受一个完成一个,按顺序执行请求,不存在捎带,这样的执行效率也毫无疑问是最低的,但是实现起来非常简单,不再赘述

这里值得一提的是单例模式

单例模式,毫无疑问,从名字上就可以明白即对于一个类来说在整个程序中只创建一个实例,不允许创建多个实例,每次只能调用一个实例,对于共享的资源和需要重复调用的代码块使用synchronized关键字保护起来,单例模式是多线程设计中最为基础和常见的一个模式,很好的保证了线程的安全,它的优点便是对于这种需要不安全的类实现了线程安全,但是缺点也显而易见,对于公用的代码块或共享的数据资源,如果有一个线程在用,那么其他所有线程都必须在这里等待,必须等前一个线程用完后才可继续执行,浪费了线程执行的时间;其次这样的先到先得也破坏了线程之间的优先级,如果线程并发有优先级的限制,那么毫无疑问单例模式不能胜任这样的任务,而信号量的机制,wait和notify的使用都可以解决这一问题。

第二次作业UML类图如下:

整体架构与第一次作业没有任何差别,因此不再赘述

设计思想有一些改变,首先调度器需要与电梯产生更多的交互,这要从我们的电梯说起,本次作业的电梯需要实现ALS即捎带策略,那我的想法是由电梯自行决定是否捎带,创建一个数组,对应每一楼层外的等待人数,例如如果8层有一个人按下了请求,那么floor[8]就会+1,如果这一层的人上了电梯,那么floor[8]就会-1。那么电梯每次执行都需要分两步,1.判断运行方向,运行方向有三种:向上,向下,停下,如果楼层外有人,或者电梯里有人要出来就停止运行,否则,根据电梯里所有请求的目的楼层离电梯目前楼层最近的那个楼层确定电梯向上or向下运行。2、在判断完运行方向后,如果向上或向下,那么直接输出相关信息,如果电梯停下,那么一定有人要进或者有人要出,先判断是否有人出去,遍历一下电梯中的人的目的楼层,如果有等于当前楼层的,就开门,先让要出的人出去,随后判断是否有人要进入,如果电梯外的人的请求运行方向与电梯下一步的运行方向一致,便让人进来,随后关上电梯,并且根据电梯下一步运行方向执行向上或向下操作。

优化:以上是我的设计算法,但是这样的捎带策略未必会达到时间上的最优,因为我判断电梯运行方向的方式是根据电梯里所有人的目的楼层离当前楼层最近的那一位而确定的,但是这样的算法可能会出现多次折返的情况,因此,我想如果每次按电梯里所有人中离当前楼层最远的那个楼层来确定执行方向,这样最多两次折返即可完成电梯中所有人的请求,虽然在一些小规模数据上性能并不一定优于之前的设计,甚至可能还差一点,但是不会出现那种极端的不断折返的情况,提高了电梯调度的可靠性。

四、第三次作业的任务分配算法

在讨论课上很多同学出现了A,B电梯任务繁重但是C电梯任务很轻的极大反差,请求任务的不均分配一定会降低电梯执行的效率,那么如何合理分配任务给电梯呢?我在这里提出我的一些想法:调度器中创建三个请求池,每一个请求队列对应一个电梯,这样每个电梯相互独立,只会执行自己任务队列中的任务,请求来的时候就确定加入哪一个请求队列,也就确定了任务的分配,那么如何公平分配任务呢?首先给每个任务队列对应一个变量,该变量是队列中任务个数与电梯容量的比值,即任务越多,电梯越小,那么该值就会越大,每次来一个任务时,先判断是否存在某两个电梯之间的变量值之差超过了0.5,如果是,则让任务轻的电梯接任务,如果该电梯不可以独立完成,便确定两电梯合作的汇合交接地点进而确定交接。如果没有,则判断是否可以由电梯独立完成,可以便让可以独立完成并且值相对小的电梯接任务,如果否,便确定两个合作的电梯,确定的原则还是值相对小的两个电梯合作接任务,将请求拆分分别加入两个请求队列,对请求队列中的每个请求设置有效值,只有前一个请求完成,后一个请求才有效可以执行,否则电梯会一直忽略该任务,知道该请求有效。

转载于:https://www.cnblogs.com/oocj/p/buaaoo_homework_unit_2.html

Java实现目的选层电梯的调度相关推荐

  1. java 电梯类图_Java实现目的选层电梯的调度

    一.前言 本次博客我将简单介绍一下前两次的电梯作业,并简单解析一下我的程序结构,进一步对我的第二次作业的算法核心和一些想法做一些分享,我的电梯设计算法并不是由调度器来决定电梯的捎带与否,而是由电梯自主 ...

  2. 利用环形数组实现单部电梯选层控制算法

    电梯自动化控制系统已经成为计算机技术应用领域中的相当重要的一个分支.为适应电梯的安全性.可靠性和功能灵活性等需求,系统多以微型计算机为核心.这种系统是将计算机技术.自动控制技术.通信技术以及转换技术高 ...

  3. 面向六部十层电梯群控算法的研究

    面向六部十层电梯群控算法的研究 赵大权,张翔宇 (晋中学院 机械学院,山西 晋中 030619) 摘  要: 在商业大楼和高层写字楼里,基于可编程逻辑控制器(PLC)对电梯运行进行控制是当前主流方案, ...

  4. JAVA线程池管理及分布式HADOOP调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  5. android 反射调用方法可不可以重载,使用Java进行反射投射和重载方法调度

    请注意,所有代码都是一个简化示例,目的是仅传达我的问题的核心思想.它应该都经过轻微的编辑后编译并运行.使用Java进行反射投射和重载方法调度 我有几个类都实现了一个通用接口. public inter ...

  6. PLC之六部十层电梯整体框架

    1.基本框架 此图基于西门子杯逻辑控制赛项中电梯题目的变量表以及功能设计 1.I/O输入是指变量表中的input数字量,包括电梯所有的内呼按钮.外呼按钮.电梯平层开关等 2.逻辑处理是指根据相对应的输 ...

  7. 六层电梯西门子S7-200PLC梯形图程序

    六层电梯西门子S7-200PLC梯形图程序 . 本商品是电子程序,非实物,采用邮箱发送. 一.电梯具有的功能 电梯内选和外选按钮的呼叫与对应指示灯的显示功能: 电梯开门和关门动作,开门到位: 电梯上升 ...

  8. 基于S7–1500的单部六层电梯教程(三)

    教程继续更新ing 程序思路讲解 基于S7–1500的单部六层电梯教程(一) 基于S7–1500的单部六层电梯教程(二) 基于S7–1500的单部六层电梯教程(三) 基于S7–1500的单部六层电梯教 ...

  9. 两部6层电梯西门子S7-200PLC梯形图程序

    两部6层电梯西门子S7-200PLC梯形图程序 . 一.电梯具有的功能 1.电梯内选和外选按钮的呼叫与对应指示灯的显示功能: 2.电梯开门和关门动作,开门到位: 3.电梯上升和下降的动作: 4.电梯停 ...

最新文章

  1. HashMap之微代码解析-总结整理
  2. local_irq_disable
  3. CodeForces - 1337C Linova and Kingdom(贪心)
  4. 可变数据类型和不可变数据类型
  5. 端到端半监督目标检测框架Instant-Teaching:
  6. 评分 - 2019寒假训练营第一次作业
  7. DataLogic 工业串口扫码器Python读取说明
  8. CFA一级考试题型是什么?好不好考?
  9. 北斗卫星导航系统简介
  10. videojs播放rtmp视频流,解决TypeError: this.el_.vjs_getProperty is not a function错误
  11. [每日一氵] openCV resize函数直接按比例缩放
  12. python s append_详细介绍pandas的DataFrame的append方法使用
  13. 如何使用Python在Excel中插入和删除行和列?你只需要这个工具
  14. HDU—校赛—1004
  15. python多张图叠加为一张_python实现多张图片拼接成大图
  16. 推荐几个帮你避坑和赚钱的公众号
  17. 达人评测 i5-1155g7和i5-1235u选哪个 i51155g7和1235u差距
  18. 给一个向量进行归一化
  19. 苹果浏览器safari推介
  20. 2021ICPC南京站大杂记

热门文章

  1. windows server 2003 r2 64位web服务器安装配置注意事项
  2. SQL Server 与 SQL Express 的异同
  3. android进程优先级的计算
  4. 【Redis】15.Redis主从复制
  5. 从fragment开始向上查找实现了某个接口的parent Fragment 或者 Activity
  6. vue中@符号表示什么意思?
  7. HBase—基础介绍
  8. Yet Another Multiple Problem 同余定理 bfs
  9. Liunx的常用命令
  10. portal for arcgis 10.4的安装和配置及遇到的问题