小組成員:馬翔 & 胡佳奇
項目名稱:電梯調度系統
經過了兩個多星期的結對開發過程,我們的電梯調度系統有了一個初步的面貌。現版本的調度系統和最初的設想還是有很大的區別的。最初的設想是有一個整體調度系統,每當乘客發出一個請求,調度系統就通過這個計算來為這個請求分配一部電梯。在實踐的過程中發現這樣不可行,復雜度很高,這個問題能有多復雜就有多復雜。后來通過實際調研和自己思考,決定將問題簡單話,即四部電梯只會沿着自己的方向來運行,某一層有顧客請求就停下。而調度程序只為處於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()); } } }