鄭雲飛--韓亞華
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 及多線程編程