组员 | 赵天20113007 | 李金吉20113008 |
时间 | 2014年3月7日14点00到15点00 | 初步设想,畅谈各自思路 |
时间 | 2014年3月9日14点00到17点00 | 初步定稿,电梯类初步实现 |
时间 | 2014年3月10日13点00 | 春晖楼实地考察 电梯 |
1 、背景
该大楼有21层,从地面0 , 1 , ... 20 。地板0是地下停车场水平, 1楼是大堂的水平。大多数人都在/走出大楼通过这些2层。
电梯名称 |
停靠层数 |
乘客限制 |
重量限制 |
1 |
所有楼层 |
10 |
800 kg |
2 |
所有楼层 |
10 |
800 kg |
3 |
所有楼层 |
20 |
1600 kg |
4 |
所有楼层 |
20 |
2000 kg |
避免出现 “公共汽车”最坏情况的算法。该算法把电梯作为总线,它从底部到顶部,停在每一层楼,打开门,让人们进出,然后把门关上,继续前进。之后到达顶层,它会下去。该算法能够满足所有的要求,但它显然不是最快的算法。
要快,这是主要目的。
2需求分析:
它具有生成0 (零)的代码分析警告和错误。它必须是正确的。
当总重量在45公斤的最大限制,或乘客的数量已经在最大,电梯不需要更多的外部请求停止。
亲身调研:
上课时王老师让我们亲身体验一下电梯的效果,让所编程序有实际意义。由于时间仓促,我们小组选择了本校春晖楼进行调研。我们仔细的研究了一下,春晖了两部电梯是独立的。
但是我们需要的是一个电梯调度系统,可以实现调度4部电梯的运行,外部调度4个电梯是一个整体,但是电梯的运行是相互独立的。
在外部,设置每层的上行按钮和下行按钮,在内部,设置需要到达楼层的按钮。比如,3层外部上行按钮激活时,调度系统分配某台电梯过来接人,直到这台电梯到达该层,调度系统不再分配给这个楼层更多的电梯上行的电梯。
①电梯调度系统可以监控每个电梯的实时状态,从而实现调度;
②每个电梯有自己的常量:载重,人数,开门时间,运行速度等到。。
3实现:
首先需要抽象一个电梯的类:
抽象的东西:电梯可以装人,有人数限制,有载重限制。但是每一个电梯都不一样。
常量的东西:电梯的层数,电梯可以向上走,可以向下走,可以停,停止的时间。
然后就是电梯调度算法了:
我们将电梯分为三种情况:
第一种是静止的,第二种是向上走,第三种是向下走;发现后两种很类似
当第一种静止情况是:需要判断的是现在状态下电梯里有几个人,多少重,还能上来几个人,如果超过限定人数或超重必须发出异常,知道异常被解决。在这期间,电梯无法 正常运作,也就是保持静止状态;
第二种情况,电梯处于下降状态,这时又要考虑两个问题,当电梯里现在有人时,还有没人时:
有认时:电梯向离现在最经的目标楼层下降,当中途有人有下降的请求并且可以此电梯可以到达时,改变目标楼层,使电梯在有人出停止。当到达目标楼层时,电梯转变问静止状态。
第三种情况与第二种情况类似。
在此之外,如果电梯里的人已经达到限定值,则电梯不能再响应外部请求;直到到达现在的目的楼层。
然后需要引入两个概念:1,外部请求,人在某层楼请求需要向上或向下;2,内部请求,进入电梯里的人选择需要去哪一层。 由于外部请求是不确定的,所以也不能确定最短时间。
我们的这个电梯调度其实就是由系统分配哪一台电梯去响应某一个外部请求:
采取就近原则,如果现在有两台电梯向上走,分别在3层和4层,有人分别在第6层和7层请求向上走,则4层的电梯去接6层的人,也就是4层的电梯的目标楼层改为6(假如原来的目标楼层比6层高),3层的电梯去接7层的人。
还有就是0层和1层是人出入比较多的楼层,我们的想法是,如果长时间电梯处于静止状态(可以设定一个常量),则电梯自动前往1层,这样可以减少人们的等待时间。
还有一个问题是有点电梯载重不同,这也就导致了电梯行走的效率不同,比如:20个人的电梯装了20个人,10人的电梯装了10人,这是20人的电梯肯定比10人的电梯慢。
后两点还没有想清楚,欢迎大神们提建议。
//Elevator.h #ifndef HEADER_ELEVATOR_H #define HEADER_ELEVATOR_H using namespace std; struct Node{ int floornow; struct Node *up; struct Node *down; }; class Elevator{ private : int layer;//电梯的高度 typedef struct Node *dt,ele; dt floor; public: Elevator():layer(2){ //默认电梯是两层的 dt sit=new ele; sit->floornow=1; floor=sit; dt p=sit; p->down=NULL; sit=new ele; sit->floornow=p->floornow+1; p->up=sit; sit->down=p; sit->up=NULL; // floor=sit;//不需要 } Elevator(int n):layer(n){//电梯必定大于两层 dt sit=new ele; sit->floornow=1; floor=sit; dt p=sit; p->down=NULL; while(p->floornow<layer) { sit=new ele; sit->floornow=p->floornow+1; p->up=sit; sit->down=p; p=sit; } sit->up=NULL; } int getfloornow() { cout<<floor->floornow; return floor->floornow; } void upfloornow() { floor=floor->up; } void downfloornow() { floor=floor->down; } void display_floornow() { cout<<floor->floornow; } }; #endif //HEADER_ELEVATOR_H
#ifndef OFFICE_BUILDING_H #define OFFICE_BUILDING_H #include "Elevator.h" class Office_Building{ private: Elevator dianti1; Elevator dianti2; public: Office_Building() { dianti1=Elevator(20); dianti2=Elevator(20); } int Now_Stairs1() { return dianti1.getfloornow(); } void Up_Stairs1() { dianti1.upfloornow(); dianti1.display_floornow(); } void Down_Stairs1() { dianti1.downfloornow(); dianti1.display_floornow(); } void Now_Stairs2() { dianti2.getfloornow(); } void Up_Stairs2() { dianti2.upfloornow(); dianti2.display_floornow(); } void Down_Stairs2() { dianti2.downfloornow(); dianti2.display_floornow(); } }; #endif
单元测试代码:
#include<iostream> #include"Elevator.h" #include"Office_Building.h" //单元测试程序 using namespace std; void main() { Office_Building teacher_room; int c; do { if(teacher_room.Now_Stairs1()==1) cout<<"up:1"<<endl; else if(teacher_room.Now_Stairs1()==20) cout<<"down:2"<<endl; else cout<<"up:1 or down:2"<<endl; cin>>c; if(c==1)teacher_room.Up_Stairs1(); else if(c==2)teacher_room.Down_Stairs1(); }while(1); }