結對開發項目-電梯調度系統


小組成員:馬翔 & 胡佳奇

項目名稱:電梯調度系統

      經過了兩個多星期的結對開發過程,我們的電梯調度系統有了一個初步的面貌。現版本的調度系統和最初的設想還是有很大的區別的。最初的設想是有一個整體調度系統,每當乘客發出一個請求,調度系統就通過這個計算來為這個請求分配一部電梯。在實踐的過程中發現這樣不可行,復雜度很高,這個問題能有多復雜就有多復雜。后來通過實際調研和自己思考,決定將問題簡單話,即四部電梯只會沿着自己的方向來運行,某一層有顧客請求就停下。而調度程序只為處於ready狀態的電梯發出命令。通過這樣的思路來簡化問題,從而實現了電梯的運行。

      在電梯的實現過程中,使用了線程的技術。將每個電梯對象的run方法封裝成一個線程,這樣四部電梯就能不受互相影響的同時運行,並且接受調度。在編程環境上我們選擇使用visual studio 2010 下的C#,實現了界面的設計。目前項目尚有一些不足之處,如沒有一個整體觀察電梯運行的界面和人數檢測,我們會盡力將這些在以后進行完善。

項目時間管理表:

電梯運行截圖:

電梯調度系統運行調度部分代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace 電梯調度系統
{
    public struct Request   //請求結構體
    {
        public int pgFloor;//乘客請求樓層
        public string pgDir; //乘客請求方向
        public string pgIo;  //乘客請求進出方向
    }

    public struct outRequest
    {
        public int request;
        public int toUp;
        public int toDown;
    }

    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        //[STAThread]
        
        //電梯調度系統函數
        public static void Manager(int r)
        {

            if (fangWen.E1.direction=="Ready")
            {
                if (fangWen.E1.floorNow > r) fangWen.E1.direction = "Down";
                else if (fangWen.E1.floorNow < r) fangWen.E1.direction = "Up";
                else if (fangWen.E1.floorNow == r) fangWen.E1.Open();
            }
            else if(fangWen.E2.direction=="Ready")
            {
                if (fangWen.E2.floorNow > r) fangWen.E2.direction = "Down";
                else if (fangWen.E2.floorNow < r) fangWen.E2.direction = "Up";
                else if (fangWen.E2.floorNow == r) fangWen.E2.Open();
            }
            else if(fangWen.E3.direction=="Ready")
            {
                if (fangWen.E3.floorNow > r) fangWen.E3.direction = "Down";
                else if (fangWen.E3.floorNow < r) fangWen.E3.direction = "Up";
                else if (fangWen.E3.floorNow == r) fangWen.E3.Open();
            }
            else if(fangWen.E4.direction=="Ready")
            {
                if (fangWen.E4.floorNow > r) fangWen.E4.direction = "Down";
                else if (fangWen.E4.floorNow < r) fangWen.E4.direction = "Up";
                else if (fangWen.E4.floorNow == r) fangWen.E4.Open();
            }

        }


        //電梯類
        public class Elevator
        {
            public  int speed;       //速度
            public  int load;        //載重
            public  int people;      //乘客限制
            public  int openClose;   //開關門時間
            public  int inOut;       //進出門時間
            public  int floorNow;    //電梯當前樓層
            public  String direction;//電梯當前狀態
            public  int loadNow;     //電梯當前載重
            public  int peopleNow;   //電梯當前乘客數

            public int[] RespondQueue=new int [21];  //電梯內部響應隊列

            public static outRequest[] oR = new outRequest[21];  //電梯外請求隊列
            public static int Requestflag;   //電梯請求標記
            public int Rfront;
            public int Rrear;
 
            public Elevator(int sp,int lo,int pe,int oc,int io,int fln) //電梯構造函數
            {
                speed = sp;         //初始化電梯速度
                loadNow=load = lo;          //初始化電梯載重
                peopleNow=people = pe;        //初始化乘客限制
                openClose = oc;    //初始化電梯開關門時間
                inOut = io;        //初始化乘客進出時間
                floorNow = fln;    //初始化電梯當前樓層
                direction = "Ready";//初始化電梯狀態

                Requestflag = 0; //標記初始化為零,表示沒有外部請求
                Rfront = 0;
                Rrear = 0;
            }
            //電梯運行功能函數
            public int tanCeUp()   //向上探測函數
            {
                int i=0;
                if (this.direction == "Up")
                {
                    for (i = this.floorNow; i <= 20; i++)
                    { 
                        if((this.RespondQueue[i]==1)||(oR[i].request==1&&oR[i].toUp==1))break;
                    }
                    //if (i == 21) i = this.floorNow;
                }
                return i;
            }

            public int tanCeDown()   //向下探測函數
            {
                int i = 0;
                if (this.direction == "Down")
                {
                    for (i = this.floorNow; i >= 0; i--)
                    {
                        if ((this.RespondQueue[i] == 1) || (oR[i].request == 1 && oR[i].toDown == 1)) break;
                    }
                   
                }

                return i;
            }



            public void Run()
            {
                
                while (true)
                {
                    if (this.direction == "Up")
                    {
                        while (tanCeUp() != 21)
                        {
                            Thread.Sleep(1500);
                            this.floorNow++;
                            if ((this.RespondQueue[this.floorNow] == 1) || (oR[this.floorNow].request == 1 && oR[this.floorNow].toUp == 1))
                            {
                                this.Open();    
                            }
                        }
                        this.direction = "Ready";

                    }
                    if (this.direction == "Down")
                    {
                        while (tanCeDown() != -1)
                        {
                            Thread.Sleep(1500);
                            this.floorNow--;
                            if ((this.RespondQueue[this.floorNow] == 1) || (oR[this.floorNow].request == 1 && oR[this.floorNow].toDown == 1))
                            {
                                this.Open();
                            }
                        }
                        this.direction = "Ready";
                       
                    }
 
                 }
            }

            public void Open()
            {
                this.RespondQueue[this.floorNow] = 0;
                oR[this.floorNow].request = 0;
                if (this.direction == "Up") oR[this.floorNow].toUp = 0;
                if (this.direction == "Down") oR[this.floorNow].toDown = 0;
                Thread.Sleep(3000);
            }

        }

        public static class fangWen   //將四個電梯實例對象封裝在一個類里供其他窗體訪問
        {
            public static Elevator E1 = new Elevator(10, 800, 10, 5, 8, 1);
            public static Elevator E2 = new Elevator(10, 800, 10, 5, 8, 1);
            public static Elevator E3 = new Elevator(10, 1600, 20, 5, 8, 1);
            public static Elevator E4 = new Elevator(10, 2000, 20, 5, 8, 1);
        }

        public static void ThreadProc_1()  //創建電梯的線程函數
        {
            fangWen.E1.Run();
        }
        public static void ThreadProc_2()
        {
            fangWen.E2.Run();
        }
        public static void ThreadProc_3()
        {
            fangWen.E3.Run();
        }
        public static void ThreadProc_4()
        {
            fangWen.E4.Run();
        }

        static void Main()
        {
            Thread t1 = new Thread(new ThreadStart(ThreadProc_1)); //各個電梯線程開始運行
            t1.Start();

            Thread t2 = new Thread(new ThreadStart(ThreadProc_2));
            t2.Start();

            Thread t3 = new Thread(new ThreadStart(ThreadProc_3));
            t3.Start();

            Thread t4 = new Thread(new ThreadStart(ThreadProc_4));
            t4.Start();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}

 


免責聲明!

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



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