软件工程基础大作业

软件工程基础大作业,第1张

软件工程基础大作业 电梯调度算法

在本次软件工程基础大作业——电梯调度中,我们采用两种调度算法,基准调度算法(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;
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5711476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存