zoukankan      html  css  js  c++  java
  • 电梯调度问题模型分析及程序设计(一)

    电梯调度问题模型分析及程序设计(一)

    一.电梯调度问题分析

    • 问题描述

       现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示:

    电梯编号

    可服务楼层

    最大乘客数量

     

    最大载重量

     1

    全部楼层

    10

    800 kg

     2

    单层

    10

    800 kg

     3

    双层

    20

    1600 kg

     4

    全部楼层

    20

    2000 kg

       其使用规定如下:

    1. 楼层号为0~20,其中0号为地下一层;
    2. 有楼层限制的电梯不在响应楼层停靠,如单双层;
    3. 所有电梯采用统一按钮控制。
    • 需求分析
    1. 需要设计四部电梯,而且需要注意四部电梯所需要具备的功能;
    2. 考虑电梯单双层调度,有楼层限制的电梯不在响应楼层停靠(即单层电梯只能在奇数楼层之间调度,双层电梯只在偶数楼层之间调度);
    3. 外部电梯按钮响应事件,所有楼层采用统一按钮;且0层只设有“Up”按钮,20层只设有“Down”按钮;其余楼层设置两个按钮;
    4. 每一部电梯具有不同的属性,比如乘客数量和电梯承重,对于乘客的体重属性我们才有随机数产生每一名乘客体重,最后通过人数计算总重量;
    5. 电梯调度应该依照一定的优先级进行操作;比如我们规定奇数层乘客到奇数楼层,这里我们优先考虑单层电梯;
    6. 当电梯中无人乘坐时,我们将电梯停至电梯最后一次运行所到达的楼层。

    二.电梯调度功能实现

    • 电梯功能设计
    1. 当电梯外部乘客点击乘坐电梯按钮事件时,我们对乘客当前楼层以及点击操作进行判断;
    2. 当乘客进入电梯内部之后,乘客选择自己所要到达的楼层,并且我们需要判断是否电梯中乘客数量超限以及电梯是否超载?如果电梯超载我们将调用另一部合适的电梯将剩余的乘客送往相应楼层;
    3. 并且我们判断对于同一方向运行的电梯是否乘客需要到达的楼层之间有交叉重复区域,这样我们可以将乘客依次送往需要到达楼层;
    4. 对于不同方向的乘客我们优先判断是否有空电梯,如果没有空电梯,则等待;
    5. 对于电梯的设置我们采用结构体数组方式来存放四部电梯,在结构体中设置相应电梯属性。
    • 电梯功能流程模拟
    1. 外部功能实现

    • 电梯外部应该具有按键功能,判断是否有乘客乘坐电梯,并且应有乘客数量属性;这里我们以流程图的方式向大家展示外部功能的实现:

     

    /*显示电梯当前状态函数*/
    void printstatus(struct Lift lift[])
    {
        for(int i=0;i<4;i++)
        {
            cout<<i+1<<"号电梯当前所在楼层:";
            cout<<lift[i].status<<endl;
        }
        cout<<endl;
    }
    
    /*初始化电梯运行方向*/
    void StartDir(struct Lift lift[])
    {
        for(int i=0;i<4;i++)
        {
            lift[i].dir=1;
        }
    }
    
    /*判断电梯所处楼层,确定按键设置*/
    void Keyset(int i)
    {
        if(i==0)
        {
            cout<<"选择操作 (1.Up  0.无人):";
        }
        else if(i==20)
        {
            cout<<"选择操作 (2.Down  0.无人):";
        }
        else if(i>0&&i<20)
        {
            cout<<"选择操作(1.Up  2.Down  0.无人):";
        }
    }

       2.内部功能实现

    • 电梯内部我们采用在结构体数组中定义二维数组lift[i].floor[r][2]用来存放是否某一楼层有乘客乘坐电梯,并且记录乘客人数。并且判断乘客呼叫电梯操作的先后顺序,对于不同方向的乘客我们采用调用空电梯的策略来实现,如果没有空电梯则等待。

           通过这样的实现方式我们模拟出电梯的运行方式,这两部分是整个电梯调度问题的核心。而这与我们平时乘坐电梯时的调度方式时有很大差距的,据笔者了解到需要实现一部电梯的实际调度,我们需要引入Java中线程的相关概念。但通过上述的这种调方式也能实现四电梯的运转。

    三.电梯调度测试

    • 本次我们采用C/C++语言来实现整个程序的功能,我们对于电梯的调度情况进行一个简单的测试;首先是乘客选择电梯以及乘客需要到达的楼层进行性测试,我们假设同一楼层的所有人到达相同的楼层,在这部分测试中我们只输入一组乘客信息,而且我们将调度电梯的当前层数显示在屏幕上:
    • 第二部分对电梯的单双层进行调度,我们假设三种情况:1.单层用户到达单号楼层,这时候我们需要调用单层电梯(2号电梯);2.双层用户到达偶数楼层,这时候我们需要调用双层电梯(3号电梯);3.单层用户到达双层,或者双层用户到达单层,这时候我们需要调用通用电梯(1号电梯、4号电梯):
    • 第三部分是电梯混合调度,比如在5楼的乘客去15楼,而与此同时有楼的乘客到达 17楼,我们大概实现这样的混合调度,个人觉得在整个调度过程中在应该还有考虑不全面的地方,但基本实现功能,在这里需要考虑的情况实际比较复杂,我们将其简化:

    四.总结

        这部分我们主要为大家讲述了我们团队对于电梯调度问题的一个基本思想,并对于问题模型的建立过程以及最终功能的实现向大家做了一个基础的展示;总的来说,我们团队完成了这次合作任务,虽然只是两个人的一个小小的合作,但通过这样的形式让我们学习到了对方在解决问题上的不同想法以及对于解决问题时我们提出的不同思路,这有利于我们更好的解决问题。如果我们一个人思考,很有可能自己对于问题的考虑在某一方面存在欠缺,而通过合作的方式,我们可以将问题出错情况降到最低,这样对于我们以后思考问题的方式也有很大的借鉴意义。在这部分主要为大家介绍了关于设计方面的思路。我们将在接下来的篇章中为大家介绍在这次开发过程每个人所承担的责任以及扮演的角色。

  • 相关阅读:
    [Lua]可变参数:"arg"和"..."
    三维模型obj文件的格式解析与读取
    多线程:如果在调用线程时传递参数
    C#正则表达式类Match和Group类的理解
    利用带关联子查询Update语句更新数据
    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
    ASP.NET如何防止页面重复提交
    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
    委托和事件:从猫和老鼠的故事看事件
    .NET Remoting学习点滴(一):简单示例
  • 原文地址:https://www.cnblogs.com/199489KPY/p/5364383.html
Copyright © 2011-2022 走看看