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

    郑云飞--韩亚华

    1 、背景 该大楼有21层,从地面0 , 1 ​​, ... 20 。地板0是地下停车场水平, 1楼是大堂的水平。大多数人都在

    走出大楼通过这些2层。一个关于电梯调度提示:当总重量在45公斤的最大限制,或乘客的数量已经在最大,电梯不需

    要更多的外部请求停止。 电梯调度程序不知道有多少乘客等待每层,它不知道有多少乘客将出现。这与现实世界的情

    况是一样的。

       得到这个题目后,我和飞哥商议后决定用C#完成这个模拟程序,这样可以利用以利用它的可视化编程缩短时间,

    于是我们花了四天时间了粗略解了C#的语法。然后要构思如何实现电梯调度。通过各种假设我们充分认识到了这个问

    题的复杂性,如果各种情况都考虑到,我们感觉到对我们来说太有挑战性了,而且网上说的各种算法我们也看不懂。所

    以我们把问题人为地简化,让它实现有限的调度和模拟。为了简化难度我们规定对电梯的调度时每个请求只进行一次最

    优计算。也就是电梯不会动态的选择电梯,这样虽然降低了电梯的效率,但也会简化电梯调度的难度。而我们计算最优

    解的方法是时间最短原则,既让顾客等的时间最短。同时遵守同向优先,而且顾客不会出现和自己目的相反的方向的运行

    。至于重量限制和人数限制在电梯里设计个标志位即可。

    时间 2014.3.4-2014.3.7 2014.3.8 2014.3.9
    韩亚华 学习C#的简单语法和案例,了解我们可能用到的部分 思考电梯的时间方案,并上网了解相关资料。 共同讨人我们对电梯设计的看法,制定共同的方案
    郑云飞 查阅资料了解各种电梯调度的算法

     

     

     

     

     

    2014-03-17

         经过一周的时间我们终于完成了电梯的一部分功能,能实现电梯的外部电动。如下图:

    部分代码:

     

      

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace text1
    {
        public partial class elevator1 : Form
        {
            public elevator1()
            {
                InitializeComponent();
            }
            public void showMessage(Dianti eleavtor)
            {
                //eleavtor001=new Form5();
                 textBox1.Text = "电梯1已到达" + eleavtor.getCurrentFloor().ToString() + "楼,到达的乘客请出楼梯。" + "
    ";
                 textBox1.AppendText("请选择要去的楼层。
    ");
                Application.Run(Program.pElevator.elevator001);
                //eleavtor001.Show();
                //eleavtor001.Hide();
    
            }
            public void warnMessage()
            {
                textBox1.AppendText("不合法的请求!");
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(6);
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(5);
            }
    
            private void button9_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(9);
            }
    
            private void button20_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(13);
            }
    
            private void button16_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(17);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(2);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(1);
            }
    
            private void button10_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(10);
            }
    
            private void button19_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(14);
            }
    
            private void button15_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(18);
            }
    
            private void button22_Click(object sender, EventArgs e)
            {
                this.Hide();
            }
    
            private void button23_Click(object sender, EventArgs e)
            {
                this.Hide();
            }
    
            private void button14_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(19);
            }
    
            private void button18_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(15);
            }
    
            private void button11_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(11);
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(7);
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(3);
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(4);
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(8);
            }
    
            private void button12_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(12);
            }
    
            private void button17_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(16);
            }
    
            private void button13_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(20);
            }
    
            private void Form5_Load(object sender, EventArgs e)
            {
                label1.BackColor = Color.DarkGray;
                label2.BackColor = Color.DarkGray;
                label3.BackColor = Color.DarkGray;
                timer1.Interval = 500;
                timer1.Start();
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button21_Click(object sender, EventArgs e)
            {
                Program.pElevator.scheduing1.getelevator1().getInMessage(0);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
               
                if (Program.pElevator.scheduing1.getelevator1().getInRequestNum() == 0&&Program.pElevator.scheduing1.getelevator1().getOutRequestNum()==0)
                {
                    label1.BackColor = Color.DarkGray;
                    label3.BackColor = Color.DarkGray;
                    if (label2.BackColor == Color.DarkGray)
                    {
                        label2.BackColor = Color.DarkOrange;
                    }
                    else 
                    {
                        label2.BackColor = Color.DarkGray;
                    }
                }
                else if (Program.pElevator.scheduing1.getelevator1().getStase() == elevatorstase.moveUp)
                {
                    label2.BackColor = Color.DarkGray;
                    label3.BackColor = Color.DarkGray;
                    if (label1.BackColor == Color.DarkGray)
                    {
                        label1.BackColor = Color.DarkOrange;
                    }
                    else
                    {
                        label1.BackColor =Color.DarkGray;
                    }
                }
                else if (Program.pElevator.scheduing1.getelevator1().getStase() == elevatorstase.moveDown)
                {
                    label1.BackColor=Color.DarkGray;
                    label2.BackColor=Color.DarkGray;
                    if (label3.BackColor == Color.DarkGray)
                    {
                        label3.BackColor = Color.DarkOrange;
                    }
                    else
                    {
                        label3.BackColor = Color.DarkGray;
                    }
                }
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace text1
    {
       
        public class Scheduing
        {
            
            public Scheduing()
            {
            }
            public class message
            {
                public int requestFloor;
                public elevatorstase goDirection;
                public message()
                {
                    requestFloor = 0;
                    goDirection = elevatorstase.weit;
                }
            }
            //public struct[100] newMassage1=new massage();
            public bool chooseSstrt = false;
            //message lastMessgge=new message();
            private Queue<message> newMessage1 = new Queue<message>();
            private Dianti elevator1=new Dianti();
            private Dianti elevator2=new Dianti();
            private Dianti elevator3=new Dianti();
            private Dianti elevator4=new Dianti();
            public Dianti getelevator1()
            {
                return elevator1;
            }
            public Dianti getelevator2()
            {
                return elevator2;
            }
            public Dianti getelevator3()
            {
                return elevator3;
            }
            public Dianti getelevator4()
            {
                return elevator4;
            }
            public void getRequest(int floor,elevatorstase stase)
            {
                message New=new message();
                New.requestFloor=floor;
                New.goDirection=stase;
                //if(!(floor==lastMessgge.requestFloor&&lastMessgge.goDirection==stase))
                newMessage1.Enqueue(New);
                if (chooseSstrt == false)
                {
                    chooseSstrt = true;
                    choose();
    
                 }
                
            }
            public void choose()
            {
                while (newMessage1.Count()!=0)
                {
                    message get = new message();
                    get = newMessage1.Dequeue();
                    int min, choce = 1;
                    min = compare(elevator1, get);
                    if (min > compare(elevator2, get))
                    {
                        min = compare(elevator2, get);
                        choce = 2;
                    }
                    if (min > compare(elevator3, get))
                    {
                        min = compare(elevator3, get);
                        choce = 3;
                    }
                    if (min > compare(elevator4, get))
                    {
                        min = compare(elevator4, get);
                        choce = 4;
                    }
                    if (min != 100)
                    {
                        switch (choce)
                        {
                            case 1:
                                {
                                    if (elevator1.getStase() == elevatorstase.weit)
                                    {
                                        if (get.requestFloor > elevator1.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveDown)
                                            {
                                                elevator1.theBusyState.lastDirection = get.goDirection;
                                                elevator1.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator1.theBusyState.busy= true;
                                            }
                                            elevator1.setStase(elevatorstase.moveUp);
                                        }
                                        else if (get.requestFloor < elevator1.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveUp)
                                            {
                                                elevator1.theBusyState.lastDirection = get.goDirection;
                                                elevator1.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator1.theBusyState.busy = true;
                                            }
                                            elevator1.setStase(elevatorstase.moveDown);
                                        }
                                        /*else
                                        {
                                            elevator1.setStase(elevatorstase.weit);
                                        }*/
                                    }
                                    elevator1.getRequset(get.requestFloor, 1);
                                } break;
                            case 2:
                                {
                                    if (elevator2.getStase() == elevatorstase.weit)
                                    {
                                        if (get.requestFloor > elevator2.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveDown)
                                            {
                                                elevator2.theBusyState.lastDirection = get.goDirection;
                                                elevator2.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator2.theBusyState.busy = true;
                                            }
                                            elevator2.setStase(elevatorstase.moveUp);
                                        }
                                        else if(get.requestFloor<elevator2.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveUp)
                                            {
                                                elevator2.theBusyState.lastDirection = get.goDirection;
                                                elevator2.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator2.theBusyState.busy = true;
                                            }
                                            elevator2.setStase(elevatorstase.moveDown);
                                        }
                                    }
                                    elevator2.getRequset(get.requestFloor, 2);
    
                                } break;
                            case 3:
                                {
                                    if (elevator3.getStase() == elevatorstase.weit)
                                    {
                                        if (get.requestFloor > elevator3.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveDown)
                                            {
                                                elevator3.theBusyState.lastDirection = get.goDirection;
                                                elevator3.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator3.theBusyState.busy = true;
                                            }
                                            elevator3.setStase(elevatorstase.moveUp);
                                        }
                                        else if(get.requestFloor<elevator3.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveUp)
                                            {
                                                elevator3.theBusyState.lastDirection = get.goDirection;
                                                elevator3.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator3.theBusyState.busy = true;
                                            }
                                            elevator3.setStase(elevatorstase.moveDown);
                                        }
                                    }
                                    elevator3.getRequset(get.requestFloor, 3);
    
                                } break;
                            case 4:
                                {
                                    if (elevator4.getStase() == elevatorstase.weit)
                                    {
                                        if (get.requestFloor > elevator4.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveDown)
                                            {
                                                elevator4.theBusyState.lastDirection = get.goDirection;
                                                elevator4.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator4.theBusyState.busy = true;
                                            }
                                            elevator4.setStase(elevatorstase.moveUp);
                                        }
                                        else if(get.requestFloor<elevator4.getCurrentFloor())
                                        {
                                            if (get.goDirection == elevatorstase.moveUp)
                                            {
                                                elevator4.theBusyState.lastDirection = get.goDirection;
                                                elevator4.theBusyState.lastRequestFloor = get.requestFloor;
                                                elevator4.theBusyState.busy = true;
                                            }
                                            elevator4.setStase(elevatorstase.moveDown);
                                        }
                                    }
                                    elevator4.getRequset(get.requestFloor, 4);
                                } break;
                        }
                    }
                }
                chooseSstrt = false;
            }
            public int compare(Dianti elevator,message Get)
            {
                if (elevator.theBusyState.busy == true)
                {
                    if (Get.requestFloor == elevator.theBusyState.lastRequestFloor && elevator.theBusyState.lastDirection == Get.goDirection)
                    {
                        return 0;
                    }
                    else
                    {
                        return 100;
                    }
                }
                else if (elevator.getStase() == Get.goDirection)
                {
                    if (elevator.getStase() == elevatorstase.moveUp && elevator.getCurrentFloor() < Get.requestFloor)
                    {
                        return Get.requestFloor - elevator.getCurrentFloor();
                    }
                    else if (elevator.getStase() == elevatorstase.moveDown && elevator.getCurrentFloor() > Get.requestFloor)
                    {
                        return elevator.getCurrentFloor() - Get.requestFloor;
                    }
                    else
                        return 100;
                }
                else if (elevator.getStase() == elevatorstase.weit)
                {
                    if (Get.goDirection == elevatorstase.moveUp)
                    {
                        if (Get.requestFloor >= elevator.getCurrentFloor())
                        {
                            return Get.requestFloor - elevator.getCurrentFloor();
                        }
                        else
                        {
                            return elevator.getCurrentFloor() - Get.requestFloor;
                        }
                    }
                    else
                    {
                        if (Get.requestFloor <= elevator.getCurrentFloor())
                        {
                            return elevator.getCurrentFloor() - Get.requestFloor;
                        }
                        else
                        {
                            return Get.requestFloor - elevator.getCurrentFloor();
                        }
                    }
    
    
                }
                else
                    return 100;
       
            }
        }
    }

    我们把电梯的请求分为了内部请求和外部请求,而我们的调度函数主要解决相对复杂的外部请求。同时为了实现四部电梯的同时

    运作。我们用使用timer调用线程池里的线程解决,同时还用到异步调用。

    参考相关文献

    http://www.cnblogs.com/mashang/archive/2009/08/01/1536730.html

    http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html

    http://www.csharpwin.com/csharpspace/6074r865.shtml

    细细品味C#
    ——Timer 及多线程编程

  • 相关阅读:
    vue(21)初识Vuex
    ESCMScript6(3)Promise对象
    vue(20)生命周期函数
    vue(19)嵌套路由
    vue(18)路由懒加载
    vue(17)vue-route路由管理的安装与配置
    vue(16)vue-cli创建项目以及项目结构解析
    vue(15)vue-cli介绍与安装
    webpack(11)配置文件分离为开发配置、生成配置和基础配置
    webpack(10)webpack-dev-server搭建本地服务器
  • 原文地址:https://www.cnblogs.com/hanyahua/p/3590531.html
Copyright © 2011-2022 走看看