結對項目開發-電梯調度


鄭雲飛--韓亞華

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() + "樓,到達的乘客請出樓梯。" + "\n";
             textBox1.AppendText("請選擇要去的樓層。\n");
            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 及多線程編程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM