• [软件工程学习笔记]结对项目---电梯调度(一)


    本次结对项目小组成员:张永、吴盈盈

    电梯调度问题的结对项目是周一的软件工程课上老师给布置的,由于一周中都有各自的事情要忙,我们把这个初步讨论思路的问题放到了周六,并用两个小时的时间讨论出了我们对这个问题的构想。

     问题背景如下:

     我们正在构建一个高大的办公楼,它有大约电梯配置如下:大厦有21层, 4部电梯,很多乘客使用这些电梯的日常(旅客重量:平均70公斤最大120公斤,最小45公斤)。其他常量数据:电梯速度,开/关门时间,乘客的时间要在/走出电梯。

     

    该大楼有21层,从地面, ... 20 。地板0是地下停车场水平, 1楼是大堂的水平。大多数人走出大楼都要通过这2层。

    功能分析:

    这是一个电梯调度的程序,有四部电梯,当不同层的人有电梯请求的时候,应该有电梯来响应,也就是有电梯能够被请求者所用。为了能让乘客等的时间最短,选择合适的电梯就是最核心的问题了。

     由于项目有对界面的要求,我们初步的将编程语言定为C#。

    之后我们对这个项目提出了一个初步的构想。首先,永哥利用面向对象的思想提出了本次项目需要涉及的对象,它们分别是电梯(Elevator)、(人People)还有电梯调度中心(elevatorControlCenter),然后我们将这三个对象抽象成类,并根据各种情况为其添加属性。

    一、所涉及的对象

    1)电梯Elevator

    说明:  

        本题设计到四部电梯,为每个电梯分配一个ID号,1234;先不考虑的太过复杂,假设电梯的在每层停留的时间是相同的,根据当层的开门时间和电梯停留时间相加得到关门的时间;电梯的状态分为停止状态(0)和运行状态(1),若为停止状态则有停止楼层的属性,若是运行状态则分为上升(0)下降(1);由于电梯内的空间对乘坐电梯的人数有限制,而电梯又对重量有限制,所以我们要对电梯进行双重条件封顶,当前人数和重量其中之一达到电梯限制都当做满员处理,每部电梯对人数和重量的要求都不同,所以分别为其设置人数和重量的上限的常量。

    属性:

    电梯ID elevatorID   
    开门时间:openTime 
    关门时间:closeTime

    电梯状态:elevatorStatus

    停在楼层:stopFloor

    运行状态:runStatus上升下降up,down

    当前人数:curPeople

    当前重量:curWeight
    目标楼层:goalFloors[]
    乘客限制:PEOPLELIMIT
    重量限制:WEIGHTLIMIT

    停止电梯stopElevator()

     

    2)人People

    说明:

    这里的“人”是指将要搭乘电梯的,以及将要走出电梯的人。人的状态分为上升(0)和下降(1),如上升中的电梯只能响应试图通过电梯上升的人发出的信号;人的体重的属性要处在45kg-120kg的区间内,平均值是70kg随机生成;另外人当前所在楼层和将要到达的楼层都要进行设置。

    属性:

    人的数量:peopleNum[]

    人的状态:peopleStatus

    体重:weight
    所在楼层:peopleFloor
    将要到达的楼层:goalFloor

    3)电梯调度中心elevatorControlCenter

    说明:

        仅仅有电梯和人这两个对象是远远不够的,还应当设置一个调度中心对电梯进行调度,在此设计两个方法对电梯进行激活和调度,另外电梯停止是一个被动的属性,由电梯的运行状态和乘客将要到达的楼层产生,故把其放在了电梯的属性当中。

    激活电梯activateElevator(elevatorID)

    电梯调度 elevatorControl() (返回电梯的ID

     

    二、所涉及的方法:

    1、初始状态:initElevator()

    功能:生成四个电梯线程,设置初始状态

    1234号电梯:

    电梯状态:elevatorStatus=0;

    停在楼层:stopFloor=0;

    当前人数:curPeople=0;

    当前重量:curWeight=0
    目标楼层:goalFloors[]=NULL;

    2、随机产生乘客:initPeople( peopleStatus ,peopleFloor)

    功能:根据提供的参数,体重随机产生。返回一个People对象。

    3、电梯调度:elevatorControl()

    功能:根据随机产生的乘客的相关属性对电梯进行调度。

    激活电梯activateElevator(elevatorID)

    人的数量:peopleNum>=1 电梯被激活,若电梯状态一致按序号从小到大的顺序被激活,如四部电梯都处于初始状态,则激活电梯1。若四部电梯有运行的有静止的,则根据电梯的运行状态、人所在的层数,以及要上要下等因素选择合适的电梯进行调度。在这里就用到了电梯的调度。电梯调度的相关算法也将在电梯调度的方法中写出。

    电梯调度 elevatorControl() 

        电梯的调度与乘客的需求、电梯的当前状态还有调度所使用的电力有关。为了节约和方便着想,我们考虑到这样的一个原则:当需乘电梯的人数增加后,根据增加的人的状态,优先调度距离当前楼层最近的电梯(不包括反向运行中的),若在此相同条件下有不同状态的电梯,则优先调度正在向相同方向运行中的未满员电梯,其次调度静止的电梯,若都不满足条件则刷新运动状态继续找这两种状态。

    对于电梯的状态我们考虑到以下几种:

    1)静止无人状态

    说明:此状态类似于电梯的初始状态,唯一不同的是停在的楼层可以是020之前任意的数。

    电梯状态:elevatorStatus=0;

    停在楼层:stopFloor=0-20;

    当前人数:curPeople=0;

    当前重量:curWeight=0
    目标楼层:goalFloors[]=NULL;

     

    2)未满员运行状态

    说明:

    电梯状态:elevatorStatus=1;

    运行状态:runStatus=0/1;

    当前人数:curPeople<PEOPLELIMIT;

    当前重量:curWeight<WEIGHTLIMIT;
       目标楼层:goalFloors[]={...};

     

    3)静止超载状态

    说明:当前人数或当前重量其中之一超过电梯限制则发出超载警报,直至达到满员状态或未满员状态。

    电梯状态:elevatorStatus=0;

    停在楼层:stopFloor=0-20;

    当前人数或当前重量:curPeople>PEOPLELIMIT||curWeight>WEIGHTLIMIT;
    目标楼层:goalFloors[]={...};

     

    4)满员运行状态

    说明:满员运行中的电梯不再接收任何外部信号,直到到达一定目标楼层使电梯变为未满员运行状态,或静止无人状态。

    电梯状态:elevatorStatus=1;

    运行状态:runStatus=0/1;

    当前人数:curPeople=PEOPLELIMIT;

    当前重量:curWeight=WEIGHTLIMIT;
       目标楼层:goalFloors[]={...};

     

    以上就是我们对这个问题的一些前期的设计,之后会把具体的方法实现出来。

     

  • 相关阅读:
    窗口显示于parent控件上
    DELPHI SOCKET 通信编程要点小结
    dxBarManagerToDxNavBar方法
    DLL直接返回对象
    海量数据库的查询优化及分页算法方案
    excel怎么只打印某页?excel怎么只打印某几页
    HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
    excel中如何设置只打印第一页
    Navicat Premium 常用功能讲解
    laravel查询构造器DB还是ORM,这两者有什么区别,各该用在什么场景中
  • 原文地址:https://www.cnblogs.com/zhangyongJava/p/3590761.html
Copyright © 2020-2023  润新知