您的位置:首页 > 其它

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

2014-03-09 22:12 183 查看
本次结对项目小组成员:张永、吴盈盈

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

问题背景如下:

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

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

功能分析:

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

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

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

一、所涉及的对象

(1)电梯Elevator:

说明:

本题设计到四部电梯,为每个电梯分配一个ID号,1、2、3、4;先不考虑的太过复杂,假设电梯的在每层停留的时间是相同的,根据当层的开门时间和电梯停留时间相加得到关门的时间;电梯的状态分为停止状态(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()

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

1、2、3、4号电梯:

电梯状态:elevatorStatus=0;

停在楼层:stopFloor=0;

当前人数:curPeople=0;

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

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

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

3、电梯调度:elevatorControl()

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

激活电梯activateElevator(elevatorID)

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

电梯调度 elevatorControl()

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

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

(1)静止无人状态

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

电梯状态: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[]={...};

以上就是我们对这个问题的一些前期的设计,之后会把具体的方法实现出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: