zoukankan      html  css  js  c++  java
  • [软件工程学习笔记]结对项目---电梯调度(二)---外部控制

          结对项目小组成员:张永、吴盈盈    

          又是一周过去了,在上周对电梯调度问题做过大概的分析之后,本周末我们开始对这个项目进行实现,因为时间紧迫,我们目前只实现了其中的电梯的外部调度的部分,也是较为重要的一部分。

          周五白天和永哥进行了一番商量,下午因为永哥要练车,于是我开始了对界面进行设计。

          我们的界面分为三个部分,一是电梯外部控制模块,二是电梯内部的控制模块,三是电梯运行状态的显示模块。在外部控制模块中有0-20层,每层(除0和20外)都有上下键按钮,用于乘客向电梯发出请求;在电梯的内部控制模块中,都有0-20的按键用于乘客选择目的楼层;在电梯运行状态的模块,我们用了四个电梯门来表示电梯门的运动状态,当到达知道指定楼层时,电梯门会开启,电梯门上面显示的是当前的楼层,旁边则记录着当前人数和重量,如遇超载则发出警报。

          其中电梯按键都是用的checkbox,因为可以支持多选。电梯门用的panel。

          周六的上午,永哥开始为我们的程序填充内容。

          首先按照我们之前的设想建立了如下几个类:

    因为本次项目楼层众多,电梯数目也较多,算法和思想虽并不难理解,但重复的代码较为繁杂。

    我们首先实现的是电梯的外部控制。

    在电梯的外部控制中,我们对其算法的设想是:

    准备:我们把电梯的运行状态分为以下五种,(1)静止STOP,(2)向上运行UP,(3)向下运行DOWN,(4)向上运行暂停UP_STOP,(5)向下运行暂停DOWN_STOP。

    第一步:用电梯的当前楼层减去乘客发出请求的楼层,并对其差值进行比较排序,按差值从小到达存入数组a[]中。

    代码实现如下:

      public static ElevatorObject choseElevator(People people, ElevatorObject elevator1, ElevatorObject elevator2, ElevatorObject elevator3, ElevatorObject elevator4)
            {
                ElevatorObject chosenElevator=new ElevatorObject(0) ;
                ElevatorObject testElevator=null;
                ElevatorObject[] a_Elevator = new ElevatorObject[]{elevator1,elevator2,elevator3,elevator4};
                int test = 0;
                int elevator1_distance=elevator1.getCurFloor()-people.getPeopleFloor();//1号电梯现在的楼层距当前乘客的距离
                int elevator2_distance=elevator2.getCurFloor()-people.getPeopleFloor();//2号电梯现在的楼层距当前乘客的距离
                int elevator3_distance=elevator3.getCurFloor()-people.getPeopleFloor();//3号电梯现在的楼层距当前乘客的距离
                int elevator4_distance=elevator4.getCurFloor()-people.getPeopleFloor();//4号电梯现在的楼层距当前乘客的距离
                int[] a = new int[] { elevator1_distance, elevator2_distance, elevator3_distance, elevator4_distance };
                for (int i = 0; i < 3; i++)
                {
                    for (int j = 0; j < 3 - i; j++)
                    {
                        if (a[j] > a[j + 1])
                        {
                            test = a[j];
                            testElevator = a_Elevator[j];
                            a[j] = a[j + 1];
                            a_Elevator[j] = a_Elevator[j + 1];
                            a[j + 1] = test;
                            a_Elevator[j + 1] = testElevator;
                        }
                    }
                }

    第二步:以电梯上升时为例,分情况进行调度。

    1、当四部电梯的当前楼层都在乘客指定楼层之下时,选定a[0]对其运动状态进行判断,当其的运动状态为(1)(2)(4)时,则对它进行调度,若为其他状态则判断a[1],以此类推。

     case Number.UP:
                       
                        if (a[3] < 0)
                        {
                            for (int i = 3; i >= 0; i--)
                            {
                                if (a_Elevator[i].getElevatorStates() == Number.UP || a_Elevator[i].getElevatorStates() == Number.UP_STOP || a_Elevator[i].getElevatorStates() == Number.STOP)
                                {
                                    chosenElevator = a_Elevator[i];
                                    i = -1;//跳出for循环
                                }
                            }
                        }

    2、当只有三部电梯的当前楼层在乘客指定楼层之下时,首先判断第四部电梯a[3]是否在指定楼层及其以上(<a[2])停止,若不是则继续按1中判断进行调度。

                        else if (a[2] < 0)
                        {
                            if ((a[3] == 0&&a_Elevator[3].getElevatorStates()==Number.UP_STOP)||(a_Elevator[3].getElevatorStates()==Number.STOP&&a[3]<(0-a[2])))
                            {
                                chosenElevator = a_Elevator[3];
                            }
                            else
                            {
                                for (int i = 2; i >= 0; i--)
                                {
                                    if (a_Elevator[i].getElevatorStates() == Number.UP || a_Elevator[i].getElevatorStates() == Number.UP_STOP || a_Elevator[i].getElevatorStates() == Number.STOP)
                                    {
                                        chosenElevator = a_Elevator[i];
                                        i = -1;//跳出for循环
                                    }
                                }
                            }
                        }

    3、当只有两部电梯的当前楼层在乘客指定的楼层之下时,首先判断距离指定楼层最近的a[2]是在指定楼层及其以上(<|a[1]|)停止,其次再判断a[3](<|a[2]|),都不是则继续按1中判断进行调度。

     else if (a[1] < 0)
                        {
                            if ((a[2] == 0 && a_Elevator[2].getElevatorStates() == Number.UP_STOP) || (a_Elevator[3].getElevatorStates()==Number.STOP && a[2] < (0 - a[1])))
                            {
                                chosenElevator = a_Elevator[2];
                            }
                            else if((a[3] == 0&&a_Elevator[3].getElevatorStates()==Number.UP_STOP)||(a_Elevator[3].getElevatorStates()==Number.STOP&&a[3]<(0-a[2])))
                            {
                                chosenElevator = a_Elevator[3];
                            }
                            else
                            {
                                for (int i = 1; i >= 0; i--)
                                {
                                    if (a_Elevator[i].getElevatorStates() == Number.UP || a_Elevator[i].getElevatorStates() == Number.UP_STOP || a_Elevator[i].getElevatorStates() == Number.STOP)
                                    {
                                        chosenElevator = a_Elevator[i];
                                        i = -1;//跳出for循环
                                    }
                                }
                            }
                        }

    4、当只有一部电梯的当前楼层在乘客的指定楼层之下时,首先判断距离指定楼层最近的a[1]是在指定楼层及其以上(<|a[0]|)停止,其次再判断a[2](<|a[1]|),在判断a[3](<|a[2]|)都不是则继续按1中判断进行调度。

    else if (a[0] < 0)
                        {
                            if ((a[1] == 0 && a_Elevator[1].getElevatorStates() == Number.UP_STOP) || (a_Elevator[1].getElevatorStates()==Number.STOP && a[1] < (0 - a[0])))
                            {
                                chosenElevator = a_Elevator[1];
                            }
                            else if ((a[2] == 0 && a_Elevator[2].getElevatorStates() == Number.UP_STOP) || (a_Elevator[3].getElevatorStates() == Number.STOP && a[2] < (0 - a[1])))
                            {
                                chosenElevator = a_Elevator[2];
                            }
                            else if ((a[3] == 0 && a_Elevator[3].getElevatorStates() == Number.UP_STOP) || (a_Elevator[3].getElevatorStates() == Number.STOP && a[3] < (0 - a[2])))
                            {
                                chosenElevator = a_Elevator[3];
                            }

    5、当所有电梯都在指定楼层之上时,则选择静止状态的进行调度。

        else
                        {
                            if ((a[0] == 0 && a_Elevator[0].getElevatorStates() == Number.UP_STOP) || a_Elevator[0].getElevatorStates()==Number.STOP )
                            {
                                chosenElevator = a_Elevator[0];
                                a_Elevator[0].setElevatorStates(Number.UP);
                            }
                            else if ((a[1] == 0 && a_Elevator[1].getElevatorStates() == Number.UP_STOP) || (a_Elevator[1].getElevatorStates() == Number.STOP && a[1] < (0 - a[0])))
                            {
                                chosenElevator = a_Elevator[1];
                            }
                            else if ((a[2] == 0 && a_Elevator[2].getElevatorStates() == Number.UP_STOP) || (a_Elevator[3].getElevatorStates() == Number.STOP && a[2] < (0 - a[1])))
                            {
                                chosenElevator = a_Elevator[2];
                            }
                            else if ((a[3] == 0 && a_Elevator[3].getElevatorStates() == Number.UP_STOP) || (a_Elevator[3].getElevatorStates() == Number.STOP && a[3] < (0 - a[2])))
                            {
                                chosenElevator = a_Elevator[3];
                            }
                        }


    在多次调试之后,电梯的外部控制的调度告一段落。

    以下是运行的截图。

    相比外部控制,内部的控制更为容易一些,我们已经实现了电梯一的内部控制,还没来得及给剩下的三部添加。还有对人的类的随机从产生人数和体重的功能还没有实现,在接下来的开发中我们会慢慢的实现。

    PS.跟着永哥做项目特别有收获,我们在结对开发的过程中,绝大多数都是永哥作飞行员,我做导航的学员,在看他调试程序的过程中学到很多,同时也会提出一些可能存在的问题,或是出现问题的原因,永哥总是能按部就班的进行测试发现问题所在并很快的改正,这份踏实和机智是我特别应该学习的。OK,今天就先到这吧。

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/wingwyy511/p/3604255.html
Copyright © 2011-2022 走看看