在本次软件工程基础大作业——电梯调度中,我们采用两种调度算法,基准调度算法(BUS算法)和更高性能的调度算法(LOOK算法),两种算法的描述如下:
1. BUS算法: 1.1 BUS算法思想:BUS算法的思想是:将电梯当作公交车,从-1层一直到最高层(20层),每一层都停,并且开门,让乘客进出,然后关门,继续向上走。直到最高层,再向下。BUS算法是电梯调度算法中性能最差的算法。
1.2 BUS算法代码:void Elevator::Busrun() { while (1) { while (CurrentFloor < 20) { moveto(CurrentFloor + 1); waitpeople(); } while (CurrentFloor > 0) {//0层代表-1层 moveto(CurrentFloor - 1); waitpeople(); } } } void Elevator::waitpeople() { int floor = CurrentFloor; if (CurrentFloor == 0) { floor = -1; } cout << "在第" << floor << "层等待乘客进出电梯" << endl; while (!in_ele[CurrentFloor].empty() && PeopleCount < MaxNum && WeightCount < MaxWeight) { //如果进入这一层的人不为空且能让此人进入,就持续让他们进入; Passenger people = in_ele[CurrentFloor].back(); cout << "乘客" << people.ID << "进入电梯" << ID << endl; in_ele[CurrentFloor].pop_back(); PeopleCount++; WeightCount += people.GetWeight(); int Des = people.Destinationfloor; serve(Des); out_ele[Des].push_back(people); } while (!out_ele[CurrentFloor].empty()) { Passenger people = out_ele[CurrentFloor].back(); cout << "乘客" << people.ID << "走出电梯" << ID << endl; out_ele[CurrentFloor].pop_back(); PeopleCount--; WeightCount = WeightCount - people.GetWeight(); cout << "完成乘客" << people.ID << "的请求" << endl; } Sleep(1);//这里暂时设置等待1ms,之后正式运行改为相应的时间 } void Elevator::moveto(int floor) { //此函数仅限于从一个楼层到另一个楼层的移动(其中不能停靠) int temp = CurrentFloor; if (CurrentFloor == 0) { temp = -1; } cout << "电梯从第" << temp << "层移动至第" << floor << "层" << endl; Sleep(abs(CurrentFloor - floor)); CurrentFloor = floor; return; }2. LOOK算法描述: 2.1 LOOK算法思想:
LOOK算法是 *** 作系统中磁盘调度的一种算法。LOOK算法用于磁盘调度中时,是指读/写头在开始由磁盘的一端向另一端移动时,随时处理所到达的任何磁道上的服务请求,直到移到最远的一个请求的磁道上。一旦在前进的方向上没有请求到达,磁头就反向移动。在磁盘另一端上,磁头的方向反转,继续完成各磁道上的服务请求。这样,磁头总是连续不断地在磁盘的两端之间移动。
LOOK算法用于电梯调度中,电梯其实就是LOOK算法中的磁头,楼层上的请求就是磁道上的服务请求。这就是磁盘调度LOOK算法用于电梯调度的思想。
2.2 LOOK算法代码://其中 downsequence 和 upsequence 是一个 vector变量,downsequence用于存放下行楼层的请求,upsequence用于存放上行楼层的请求。 //downsequence按照从大到小排序,upsequence按照从小到大排序,用于实现LOOK算法。 void Elevator::run() { cout << "电梯" << ID << "号开始运行" << endl; while (1) { //如果没有楼层需求,且不在1层,直接回到1层 if (Status != 0 && upsequence.empty() && downsequence.empty()) { moveto(1); Status = 0;//设置状态为静止 } if (Status == 0) { //如果这个时候在1层: if (!downsequence.empty()) { setstatus(2);//设置状态为下行 } else if (!upsequence.empty()) { setstatus(1);//设置状态为上行 } } if (Status == 1) { //如果在上行状态中: while (!upsequence.empty()) { moveto(upsequence[0]); upsequence.erase(upsequence.begin());//upsequence.popfront() waitpeople(); } Status = 2;//转为下行 } if (Status == 2) { //如果在下行状态中: while (!downsequence.empty()) { moveto(downsequence[0]); downsequence.erase(downsequence.begin());//downsequence.popfront() waitpeople(); } Status == 1; } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)