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

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

 问题背景如下:

 我们正在构建一个高大的办公楼,它有大约电梯配置如下:大厦有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[]={...};

 

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

 

Copyright © 2024 我编程我快乐
Powered by .NET 8.0 on Kubernetes