结对项目开发-电梯调度
郑云飞--韩亚华
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 及多线程编程