小组成员:马翔 & 胡佳奇
项目名称:电梯调度系统
经过了两个多星期的结对开发过程,我们的电梯调度系统有了一个初步的面貌。现版本的调度系统和最初的设想还是有很大的区别的。最初的设想是有一个整体调度系统,每当乘客发出一个请求,调度系统就通过这个计算来为这个请求分配一部电梯。在实践的过程中发现这样不可行,复杂度很高,这个问题能有多复杂就有多复杂。后来通过实际调研和自己思考,决定将问题简单话,即四部电梯只会沿着自己的方向来运行,某一层有顾客请求就停下。而调度程序只为处于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()); } } }