zoukankan      html  css  js  c++  java
  • 结对开发:电梯调度

    组员 赵天20113007 李金吉20113008
    时间 2014年3月7日14点00到15点00 初步设想,畅谈各自思路
    时间 2014年3月9日14点00到17点00 初步定稿,电梯类初步实现

     

    、背景

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

    电梯名称

    停靠层数

    乘客限制

    重量限制

    1

    所有楼层

    10

    800 kg

    2

    所有楼层

    10

    800 kg

    3

    所有楼层

    20

    1600 kg

    4

    所有楼层

    20

    2000 kg

     亲身调研:

    上课时王老师让我们亲身体验一下电梯的效果,让所编程序有实际意义。由于时间仓促,我们小组选择了本校春晖楼进行调研。我们仔细的研究了一下,春晖了两部电梯是独立的,我们分别选择了早上班高峰、下班高峰、中午和夜间进行了考察:我们总结了以下6种模式:

     (1)上行高峰交通模式:当主要的客流是上行方向,即全部或者大多数乘客从建筑物的门厅进入电梯且上行,这种状况被定义为上行高峰交通状况。

     (2)下行高峰交通模式:当主要的客流是下行方向,即全部或者大多数乘客乘电梯下行到门厅离开电梯,这种状况被定义为下行高峰交通状况。

     (3) 二路交通模式:当主要的客流是朝着某一层或从某一层而来,而该层不是门厅,这种状况被定义为二路交通状况。二路交通状况多是由于在大楼的某一层设会议室,在一天的某一时刻该层吸引了相当多的到达。所以二路交通状况发生在上午和下午休息期间或会议期间。

     (4)四路交通模式:当主要的客流是朝着某两个特定的楼层而来,而其中的一个楼层可能是门厅,这种交通状况被定义为四路交通状况。当中午休息期间,会出现客流上行和下行两个方向的高峰状况。午饭时客流主要是下行,朝门厅和食堂。午休快结束时,主要是从门厅和餐厅上行。所以四路交通多发生在午休期间。四路交通又可分为午饭前交通和午饭后交通模式。此两类交通模式和早晨与晚上发生的上行、下行高峰不同,虽然主要客流都为上行和下行模式,但此两类交通模式 同时还有相当比例的层间交通和相反方向的交通。各交通量的比例还与午休时间的长短,食堂的位置和大楼的使用情况有关。四路交通时不但要考虑主要交通客流, 还要考虑其他客流,与单纯的上、下行高峰期不同。

    (5) 平衡的层间交通模式:当上行和下行乘客数量大致相同,并且各层之间的交通需求基本平衡时,此时的交通模式是处于一种普通的双向层间交通状况,它存在于一天中的大部分时间,乘客通常要求最小的候梯时间和乘梯时间。

    (6) 空闲交通模式:空闲交通模式通常发生在假日、深夜、黎明等情况下,此时大楼的客流稀少、乘客的到达间隔很长,在这种状况下群控系统中仅仅有部分电梯进行工作,而其余电梯轿厢则空闲等候。

    2要求:它具有

    避免出现 “公共汽车”最坏情况的算法。该算法把电梯作为总线,它从底部到顶部,停在每一层楼,打开门,让人们进出,然后把门关上,继续前进。之后到达顶层,它会下去。该算法能够满足所有的要求,但它显然不是最快的算法。

    要快,这是主要目的。

    生成(零)的代码分析警告和错误。它必须是正确的。

    当总重量在45公斤的最大限制,或乘客的数量已经在最大,电梯不需要更多的外部请求停止。

     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
    复制代码

    单元测试代码:

    复制代码
    #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()==12)
                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);
    
    
    
    }
  • 相关阅读:
    internet信息服务(iis)无法删除的解决方法
    JQuery和ASP.NET分别实现级联下拉框效果
    解决为应用程序池 提供服务的进程关闭时间超过了限制
    VS2015|Visual Studio Enterprise 2015简体中文版(企业版)
    ASP.NET MVC 4 (十) 模型验证
    基于.NET平台常用的框架整理
    业务逻辑层的设计(三)——事务的考虑
    业务逻辑层的设计(二)——让领域模型支持验证
    业务逻辑层的设计(一)——逻辑是谁的职责
    添加<!doctype html>后造成JS写的定位失效
  • 原文地址:https://www.cnblogs.com/lijinji/p/3592382.html
Copyright © 2011-2022 走看看