OO_Unit2——电梯模拟

OO_Unit2——电梯模拟

1 程序结构分析

  1.1 Task1——单部多线程可捎带电梯

    • 基本思路

      • 前言:其实不只是程序员,事实上每一个等电梯的人,在看着楼层显示屏中的数字离自己越来越近时,都至少有那么一刻会不自觉的与电梯设计者进行一次思想的交互,会站在设计者的角度来想象、模拟电梯的运行策略算法,有时还会不禁暗自称道其设计思路的高明。这次作业让我有幸能根据自己平时的体验来亲自设计一款具有自己风格的电梯,作为一只每天穿梭于宿舍与图书馆之间的贵系献祭者,自然对图书馆的电梯运行策略是再熟悉不过了,因此,本次设计的电梯就是基于自己经常搭乘的校图书馆电梯的设计思想,但是因为作业的性能度量基于电梯的角度,于是在捎带策略上牺牲了部分乘客的便捷性,从而实现整体运行时间最短。
      • 两个线程,一个用于输入乘客请求(Input类),一个用于电梯运行控制(Controller类)
      • 两个实时容器,一个存储电梯外正在等候的乘客(ReqQueue类 + Floor类),一个存储电梯类正在搭乘的乘客(Elevator类)
      • Input类——ReqQueue类——Controller类 构成生产者消费者模式
      • ReqQueue采用ArrayList<Floor>来分楼层建立队列,并且在每一个Floor中建立两个LinkedBlockingQueue<PersonRequest>,分别存储向上运行请求队列和向下运行请求队列,队列排序采用先来后到机制,ReqQueue由Input线程的输入实时更新请求队列并存储至具体的Floor
      • Elevator采用TreeMap<Integer, LinkedBlockingQueue<PersonRequest>>存储其中的乘客,根据Integer(乘客的目的楼层),为每一个目的楼层建立一个乘客队列。同时Elevator类还记录的电梯当前的状态,包括当前楼层(currentFloor)、当前乘客数量(PassNum)。
      • Controller同时根据ReqQueue和Elevator中的乘客队列,来控制Elevator的运行,包括goUp、goDown、openAndClose、exchangePassenger。采用的捎带策略是:
        • 每到达一个楼层,就判断是否有乘客需要下,或者有同方向请求的乘客需要上,如果是,则exchangePassenger(包括相反方向的乘客,尽量避免下一次经过需要再开关一次)。
        • 每到达一个楼层,就综合当前内外乘客队列,利用方法findNearestFloor来挑选出距离当前楼层最近的一个需要开关门的楼层,将其设定为当前的toFloor(当前电梯目的楼层),toFloor也是每到达一层就更新一次。
      • 任务结束判断:在ReqQueue中维护一个isEnd标记变量,当Input输入为null时就setIsEnd为true并结束线程,当Controller检测到当前电梯内外乘客均为空时,就检查ReqQueue的isEnd,如果为true,就结束线程,从而结束整个任务。
    • Metrics复杂度分析:经过合理的方法分解及类解耦,有效降低了复杂度,只有Controller.findNearestFloor(int currentFloor)存在硬伤,虽然它代码量仅仅只有20行,但是作为消费者,实现了队列为空时的线程等待,并且还有一个循环来获取当前最近的目的楼层。毕竟它是电梯运行及捎带策略的和核心部分,复杂度较高自然也很正常。

原文地址:https://www.cnblogs.com/LarryHawkingYoung/p/12590366.html

时间: 2024-10-09 07:37:04

OO_Unit2——电梯模拟的相关文章

电梯模拟 设计

今天为大家带来一个超级好玩的电梯模拟系统 ·题目概要 模拟某校九层教学楼的电梯系统.该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的"本垒层",电梯"空闲"时,将来到该层候命. 电梯一共有七个状态,即正在开门(Opening).已开门(Opened).正在关门(Closing).已关门(Closed).等待(Waiting).移动(Moving).减速(Decelerate). 乘客可随机地进出于任何层.对每个人来说,他有一个能容忍的最长等待时

电梯调度 结对开发项目

一:项目名称: 电梯调度模拟程序 二:项目参与人员: 周其范 胡宝月 三:项目开发语言和工具: Java语言和eclipse,涉及内容:面向对象技术.基于Swing的图形化用户界面.多线程启动和休眠 四:问题陈述: 1.电梯要正常运行,能响应内部.外部按钮 2.要怎样选择哪部电梯电梯,使乘坐者和电梯的距离更近,已达到更省电.更快.更经济. 3.同一部电梯可以响应多位乘客的请求 五:任务需求: 1.要模拟一栋6层楼中两部电梯的调度,模拟乘坐电梯的过程. 2.乘坐者在最低层楼:只能乘坐电梯上楼,在电

对结对作业的总结与体会

我们用了历时2周的时间进行了对电梯模拟程序的编写,我非常感谢我的合作伙伴王长同学(博客地址:http://www.cnblogs.com/naturewang/),在这个过程中他给我了 很大的帮助,没有他的帮助,我想我们是不容易把这个程序弄完的. 王长同学非常细心,也非常有耐心,在程序的编写过程中产生了一些问题,他都能耐心地和我一起解决,而且也能细心地对程序进行改进,在结对写程序的过程中,我们共同进行了需求分析,分析内容如下: 电梯的初始状态定义 (1)建筑共有21层,一共有四部电梯,其中两部是

2017面向对象程序设计寒假作业3!

实现简单电梯调度(2) GitHub:pullself 承接上文:2017面向对象程序设计寒假作业2! 上文调度方式的更新与优化 由于现在电梯可以在任意楼层停靠并且上下人.进行对应的修改. 建立在上文所使用的调度方式为基础,继续给出以预知和非预知为条件的两个程序. 代码行数 调试bug 编码时间 ?行 ?个 ?h ?行 ?个 ?h 预知版本 通过分析,我们可以知道,只需要对搜索方式进行修改即可,修改为通过接受到的请求,动态增加所需要搜索节点. 具体实现方式: 在搜索过程中加入目的地判断与记录.

用C++模拟电梯运行

首先假设有6个楼层.最初,电梯在顶层,先实现电梯从顶层到第一层的过程: #include <iostream>#include<stdio.h>#include<string.h>#include<time.h>#include<stdlib.h>#include<windows.h>using namespace std; struct node{int x,y;int color;};HANDLE Output=GetStdHan

自己动手C#模拟电梯的运行V1.0

电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 1.1先来先服务算法(FCFS) 先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法.它根据乘客请求乘坐电梯的先后次序进行调度.此算法的优点是公平.简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期

动画模拟实现电梯的载客运行过程

今天有个搞电子设计竞赛的来问我电梯的运行逻辑的C代码实现,我想到学数据结构那会用C/C++写过一个,不过好久自己现在也记不清了,直接就把源代码给他,让他自己看了. 想想自己马上要开始漫长艰苦的数模国赛集训,心情就不好啊. 这个测序运行后结果如下:(要源代码在下面,不过我把VS卸载了,今天本来想运行下那个.exe文件,结果没法运行了,说丢失MSVCP120.dll,不过有几张以前的截图) 这个代码可以以动画的形式: 1.实现电梯载人的逻辑规则 2.电梯实现开关门,保证该出去的人先出完然后该进来的人

Servlet+AJAX实现的模拟电梯调度

需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只画了9层: 同时有三座电梯等待调度: 按钮分为楼层按钮和电梯内按钮,电梯内按钮有楼层数字和关门按钮: 运行的要求: 1.电梯空闲时,电梯内按钮被点击,对应按钮被点亮,需要按关门键自动运行到最近的楼层: 2.电梯正在运行过程中,电梯内按钮被点击,如果离电梯更近,需要自动更改电梯目的停靠楼层为新添加的请

繁华模拟赛 Vicent坐电梯

/*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[step][1~i]的和­还是以B下侧为例­ f[step][i]=sum[step-1][i-1]+sum[step-1][k]-sum[step-1][i] */#include <cstdio> #include <cstring> #include <cstdlib> #