Luận án Một số dạng hàng đợi và các nguyên lý xử lý

Từ nhận xét 3.1 thì phân phối xác suất của trạng thái tại các nút mạng sau một bước sẽ phụ thuộc vào phân phối xác suất của trạng thái tại các nút mạng ở bước trước và phụ thuộc vào phân phối xác suất của dòng job từ bên ngoài mạng vào các nút mạng. Vì vậy trong mục này luận án tập trung nghiên cứu tìm điều kiện để quá trình trạng thái tại các nút mạng là quá trình Markov (thực chất là tìm điều kiện của dòng job từ bên ngoài vào mạng hàng đợi để quá trình trạng thái của các nút mạng là quá trình Markov vì ma trận xác suất định tuyến P p =     ij i j J , 0, = trong mạng hàng đợi không đổi và xem như đã biết)

pdf174 trang | Chia sẻ: tueminh09 | Ngày: 24/01/2022 | Lượt xem: 648 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Luận án Một số dạng hàng đợi và các nguyên lý xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 P 1 1 N ú t 5 (0 ,0 ) (1 ,2 ) (1 ,3 ) (1 ,4 ) (1 ,5 ) (2 ,1 ) (2 ,3 ) (2 ,4 ) (2 ,5 ) (3 ,1 ) (3 ,2 ) (3 ,4 ) (3 ,5 ) (4 ,1 ) (4 ,2 ) (4 ,3 ) (4 ,5 ) (5 ,1 ) (5 ,2 ) (5 ,3 ) (5 ,4 ) (5 ,5 ) (0 ,0 ) (1 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (1 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (1 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (1 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (2 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (3 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (4 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,1 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,2 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,3 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,4 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 (5 ,5 ) 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 0 .1 P12 PHỤ LỤC 2 CHƢƠNG TRÌNH PHẦN MỀM TÍNH TOÁN LƢU LƢỢNG DÒNG JOB LUÂN CHUYỂN TRONG MẠNG HÀNG ĐỢI TỔNG QUÁT 1. Thiết kế giao diện chƣơng trình tính toán lƣu lƣợng dòng job luân chuyển trong mạng hàng đợi Chương trình được thiết kế cho phép tạo lập một mạng hàng đợi với tổng số nút mạng tùy ý. Các tham số của mạng hàng đợi có thể tùy biến và cho phép lưu vào các tệp tin cấu hình. Tệp tin cấu hình này sẽ được tái sử dụng lại trong các lần chạy phần mềm thay vì phải thiết lập tham số mỗi khi chạy phần mềm. 1.1. Thiết kế giao diện thiết lập tham số mạng hàng đợi - Giao diện thiết lập ma trận xác suất định tuyến trong các mạng thành phần: P13 - Giao diện thiết lập ma trận xác suất luân chuyển job giữa các mạng thành phần tại mỗi nút mạng: - Giao diện thiết lập lưu lượng dòng job vào các nút mạng hàng đợi: P14 1.2. Thiết kế giao diện tính toán lƣu lƣợng dòng job luân chuyển trong mạng hàng đợi - Giao diện tính toán và vẽ biểu đồ lưu lượng dòng job luân chuyển trong các mạng thành phần (cột màu xanh thể hiện lưu lượng dòng job có trong các mạng thành phần và cột màu cam thể hiện lưu lượng dòng job từ các mạng thành phần ra khỏi mạng tại mỗi bước): - Giao diện tính toán và vẽ biểu đồ lưu lượng dòng job luân chuyển tại các nút mạng hàng đợi (cột màu xanh thể hiện lưu lượng dòng job có trong các mạng thành phần tại mỗi nút và cột màu cam thể hiện lưu lượng dòng job từ các mạng thành phần tại mỗi nút ra khỏi mạng ở mỗi bước): P15 - Giao diện tính và vẽ biểu đồ lưu lượng dòng job luân chuyển trong mạng hàng đợi tổng quát (cột màu xanh thể hiện lưu lượng dòng job có trong mạng hàng đợi và cột màu cam thể hiện lưu lượng dòng job ra khỏi mạng tại mỗi bước): P16 2. Chƣơng trình nguồn tính toán lƣu lƣợng dòng luân chuyển trong mạng hàng đợi 2.1. Khai báo các biến sử dụng trong chƣơng trình int J;//Tổng số nút mạng string[] L;//Tập các mạng thành phần double[,] b;//Lưu lượng dòng job tại các nút double[,] v;//Lưu lượng dòng job vào mạng double[, ,] p;//Ma trận xác suất định tuyến tại các mạng thành phần double[, ,] S;//Ma trận xác suất luân chuyển job giữa các mạng thành phần double[,] Tong_V;//Tổng lưu lượng dòng job từ ngoài vào mạng double[,] d;//Lưu lượng dòng job ra khỏi mạng double[,] a;//Lưu lượng dòng job đến các nút double[,] r;//Lưu lượng dòng job luân chuyển giữa các mạng hàng đợi double[,] Tong_R;//Tổng luuw lượng dòng job luân chuyển giữa các mạng thành phần double[,] Tong_D;//Tổng lưu lượng dòng job ra khỏi mạng hàng đợi DataTable[] LuuLuong; //Chứa lưu lượng job mạng thành phần dùng để vẽ biểu đồ double[] max_area_y; string[] mang_thanh_phan; Int64 n;//Bước chạy thuật toán DataTable[,] LuuLuong_Nut;//Chứa lưu lượng dòng job tại các nút để vẽ biểu đồ double[,] nut_max_area_y; DataTable LuuLuong_mang;// Chứa lưu lượng dòng job mạng hàng đợi vẽ biểu đồ double mang_max_area_y; 2.2. Các Modul khởi tạo giao diện thiết lập tham số mạng hàng đợi 2.2.1. Modul khởi tạo các tham số mạng hàng đợi tại bƣớc 0 private void Khoi_Tao_Cac_Tham_So() { n = 0; J = int.Parse(txtSO_NUT.Text); a = new double[J + 1, J * J + 1]; r = new double[J + 1, J * J + 1]; L = new string[J + 1]; b = new double[J + 1, J * J + 1]; d = new double[J + 1, J * J + 1]; v = new double[J + 1, J * J + 1]; Tong_V = new double[J + 1, J * J + 1]; Tong_D = new double[J + 1, J * J + 1]; Tong_R = new double[J + 1, J * J + 1]; //Bảng chứa số liệu về lưu lượng dòng job dùng để vẽ biểu đồ LuuLuong = new DataTable[J * J + 1]; max_area_y = new double[J * J + 1]; for (int index_mang = 1; index_mang <= J * J; index_mang++) { LuuLuong[index_mang] = new DataTable(); P17 DataColumn col = new DataColumn("b"); col.DataType = System.Type.GetType("System.Double"); LuuLuong[index_mang].Columns.Add(col); col = new DataColumn("d"); col.DataType = System.Type.GetType("System.Double"); LuuLuong[index_mang].Columns.Add(col); col = new DataColumn("n"); col.DataType = System.Type.GetType("System.Double"); LuuLuong[index_mang].Columns.Add(col); } LuuLuong_Nut = new DataTable[J + 1, J * J + 1]; nut_max_area_y = new double[J + 1, J * J + 1]; for (int nut = 1; nut < J + 1; nut++) { for (int index_mang = 1; index_mang <= J * J; index_mang++) { LuuLuong_Nut[nut, index_mang] = new DataTable(); DataColumn col = new DataColumn("b"); col.DataType = System.Type.GetType("System.Double"); LuuLuong_Nut[nut, index_mang].Columns.Add(col); col = new DataColumn("d"); col.DataType = System.Type.GetType("System.Double"); LuuLuong_Nut[nut, index_mang].Columns.Add(col); col = new DataColumn("n"); col.DataType = System.Type.GetType("System.Double"); LuuLuong_Nut[nut, index_mang].Columns.Add(col); } } mang_max_area_y = 0; LuuLuong_mang = new DataTable(); DataColumn col1 = new DataColumn("b"); col1.DataType = System.Type.GetType("System.Double"); LuuLuong_mang.Columns.Add(col1); col1 = new DataColumn("d"); col1.DataType = System.Type.GetType("System.Double"); LuuLuong_mang.Columns.Add(col1); col1 = new DataColumn("n"); col1.DataType = System.Type.GetType("System.Double"); LuuLuong_mang.Columns.Add(col1); } 2.2.2. Modul tạo đối tƣợng lƣới thể hiện ma trận xác suất định tuyến của các mạng thành phần private void Create_Control_MaTranDinhTuyen() { int TongsomangThanhphan = int.Parse(txtSO_NUT.Text) * int.Parse(txtSO_NUT.Text); mang_thanh_phan = new string[TongsomangThanhphan + 1]; P18 mang_thanh_phan[0] = "(0,0)"; DataGridView[] grid = new DataGridView[TongsomangThanhphan]; tabControlMatranDinhtuyen.TabPages.Clear(); int index_mang = 0; for (int i = 1; i <= int.Parse(txtSO_NUT.Text); i++) { for (int j = 1; j <= int.Parse(txtSO_NUT.Text); j++) { mang_thanh_phan[index_mang + 1] = "(" + i.ToString() + "," + j.ToString() + ")"; tabControlMatranDinhtuyen.TabPages.Add("(" + i.ToString() + "," + j.ToString() + ")"); tabControlMatranDinhtuyen.TabPages[index_mang].BackColor = Color.White; //Tạo grid chứa ma trận xác suất định tuyến grid[index_mang] = new DataGridView(); if (i == j) { grid[index_mang].ColumnCount = 2; grid[index_mang].RowCount = 3; } else { grid[index_mang].ColumnCount = int.Parse(txtSO_NUT.Text) + 1; grid[index_mang].RowCount = int.Parse(txtSO_NUT.Text) + 2; } grid[index_mang].Parent = tabControlMatranDinhtuyen.TabPages[index_mang]; grid[index_mang].Anchor = AnchorStyles.Top; grid[index_mang].Anchor = AnchorStyles.Bottom; grid[index_mang].Anchor = AnchorStyles.Left; grid[index_mang].Anchor = AnchorStyles.Right; grid[index_mang].Width = tabControlMatranDinhtuyen.TabPages[index_mang].Width; grid[index_mang].Height = tabControlMatranDinhtuyen.TabPages[index_mang].Height; grid[index_mang].BackgroundColor = Color.Beige; grid[index_mang].ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; grid[index_mang].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; grid[index_mang].Name = "MaTranDinhTuyen_Mang" + index_mang.ToString(); if (i == j) { grid[index_mang].Columns[0].HeaderText = "Nút 0"; grid[index_mang].Rows[0].HeaderCell.Value = "Nút 0"; P19 grid[index_mang].Columns[1].HeaderText = "Nút " + i.ToString(); grid[index_mang].Rows[1].HeaderCell.Value = "Nút " + i.ToString(); grid[index_mang].Rows[0].Cells[0].Value = 0; grid[index_mang].Rows[0].Cells[1].Value = 0; } else { for (int k = 0; k < grid[index_mang].ColumnCount; k++) { grid[index_mang].Columns[k].HeaderText = "Nút " + k.ToString(); grid[index_mang].Rows[k].HeaderCell.Value = "Nút " + k.ToString(); grid[index_mang].Rows[0].Cells[k].ReadOnly = true; grid[index_mang].Rows[k].Cells[0].ReadOnly = true; if (k == i) { grid[index_mang].Rows[0].Cells[k].Value = 1; } else { grid[index_mang].Rows[0].Cells[k].Value = 0; } if (k == j) { grid[index_mang].Rows[k].Cells[0].ReadOnly = false; } else { grid[index_mang].Rows[k].Cells[0].Value = 0; } } } grid[index_mang].AllowUserToAddRows = false; index_mang = index_mang + 1; } } } 2.2.3. Modul tạo đối tƣợng lƣới thể hiện ma trận xác suất luân chuyển giữa các mạng thành phần tại các nút mạng private void Create_Control_MaTranLuanChuyen() { DataGridView[] grid = new DataGridView[int.Parse(txtSO_NUT.Text)]; tabControlMatranLuanChuyen.TabPages.Clear(); for (int i = 1; i <= int.Parse(txtSO_NUT.Text); i++) { tabControlMatranLuanChuyen.TabPages.Add("Nút " + i.ToString()); tabControlMatranLuanChuyen.TabPages[i - 1].BackColor = Color.White; P20 //Tạo grid chứa ma trận xác suất luân chuyển giữa các mạng thành phần grid[i - 1] = new DataGridView(); grid[i - 1].ColumnCount = mang_thanh_phan.Length - int.Parse(txtSO_NUT.Text) + 1; grid[i - 1].RowCount = mang_thanh_phan.Length - int.Parse(txtSO_NUT.Text) + 2; grid[i - 1].Parent = tabControlMatranLuanChuyen.TabPages[i - 1]; grid[i - 1].Anchor = AnchorStyles.Top; grid[i - 1].Anchor = AnchorStyles.Bottom; grid[i - 1].Anchor = AnchorStyles.Left; grid[i - 1].Anchor = AnchorStyles.Right; grid[i - 1].Width = tabControlMatranLuanChuyen.TabPages[i - 1].Width; grid[i - 1].Height = tabControlMatranLuanChuyen.TabPages[i - 1].Height; grid[i - 1].BackgroundColor = Color.Beige; grid[i - 1].ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; grid[i - 1].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; grid[i - 1].Name = "MaTranLuanChuyen_Nut" + i.ToString(); //Thiết lập độ rộng các cột for (int k = 0; k < grid[i - 1].ColumnCount; k++) { grid[i - 1].Columns[k].Width = 50; } string ds_mang_k_chua_nut_i = ""; for (int j = 1; j <= int.Parse(txtSO_NUT.Text); j++) { if (i != j) ds_mang_k_chua_nut_i = ds_mang_k_chua_nut_i + "(" + j.ToString() + "," + j.ToString() + ")"; } int index_row_col = 0; for (int i_mang = 0; i_mang < mang_thanh_phan.Length; i_mang++) { if (ds_mang_k_chua_nut_i.IndexOf(mang_thanh_phan[i_mang]) == -1) { grid[i - 1].Columns[index_row_col].HeaderText = mang_thanh_phan[i_mang]; grid[i - 1].Rows[index_row_col].HeaderCell.Value = mang_thanh_phan[i_mang]; if (mang_thanh_phan[i_mang].IndexOf("," + i.ToString() + ")") == -1) { grid[i - 1].Rows[index_row_col].Cells[0].ReadOnly = true; } //Lưu danh sách các mạng thành phần if (i_mang != 0) { if (string.IsNullOrEmpty(L[i])) L[i] = i_mang.ToString(); P21 else L[i] = L[i] + "*" + i_mang.ToString().Trim(); } index_row_col = index_row_col + 1; } } grid[i - 1].AllowUserToAddRows = false; } } 2.2.4. Modul tạo đối tƣợng lƣới thể hiện lƣu lƣợng dòng job từ ngoài vào mạng private void Create_Control_Dong_Job_Vao_Mang() { DataGridView[] grid = new DataGridView[int.Parse(txtSO_NUT.Text)]; tabControlLuu_Luong_Dong_Vao.TabPages.Clear(); for (int i = 1; i <= int.Parse(txtSO_NUT.Text); i++) { tabControlLuu_Luong_Dong_Vao.TabPages.Add("Nút " + i.ToString()); tabControlLuu_Luong_Dong_Vao.TabPages[i - 1].BackColor = Color.White; //Tạo grid chứa lưu lượng dòng job từ bên ngoài vào mạng grid[i - 1] = new DataGridView(); grid[i - 1].ColumnCount = 2; grid[i - 1].RowCount = mang_thanh_phan.Length + 1; grid[i - 1].Parent = tabControlLuu_Luong_Dong_Vao.TabPages[i - 1]; grid[i - 1].Anchor = AnchorStyles.Top; grid[i - 1].Anchor = AnchorStyles.Bottom; grid[i - 1].Anchor = AnchorStyles.Left; grid[i - 1].Anchor = AnchorStyles.Right; grid[i - 1].Width = tabControlLuu_Luong_Dong_Vao.TabPages[i - 1].Width; grid[i - 1].Height = tabControlLuu_Luong_Dong_Vao.TabPages[i - 1].Height; grid[i - 1].BackgroundColor = Color.Beige; grid[i - 1].ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; grid[i - 1].RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; grid[i - 1].Name = "MaTranDongVao_Nut" + i.ToString(); grid[i - 1].Columns[0].HeaderText = "Lưu lượng dòng vào"; grid[i - 1].Columns[0].Width = 200; grid[i - 1].Columns[1].HeaderText = "Phân phối xác suất dòng vào"; grid[i - 1].Columns[1].Width = 500; grid[i - 1].Columns[1].Visible = false; for (int i_mang = 0; i_mang < mang_thanh_phan.Length; i_mang++) { grid[i - 1].Rows[i_mang].HeaderCell.Value = mang_thanh_phan[i_mang]; if (mang_thanh_phan[i_mang].IndexOf("(" + i.ToString() + ",") == -1) { grid[i - 1].Rows[i_mang].Cells[0].ReadOnly = true; grid[i - 1].Rows[i_mang].Cells[0].Value = 0; } P22 } grid[i - 1].AllowUserToAddRows = false; } } 2.2.5. Mo dul tạo lập mạng hàng đợi có số nút mạng tùy ý cho trƣớc private void Create_MangHangDoi() { Khoi_Tao_Cac_Tham_So(); Create_Control_MaTranDinhTuyen(); Create_Control_MaTranLuanChuyen(); Create_Control_Dong_Job_Vao_Mang(); Create_Control_Ketqua_MoPhong_Mang_Thanh_Phan(); Create_Control_Ketqua_MoPhong_NutMang(); } 2.3. Các Modul tính toán lƣu lƣợng dòng job luân chuyển trong mạng 2.3.1. Modul xác định ma trận xác suất định tuyến của các mạng thành phần private void Xac_Dinh_Ma_Tran_Xac_Suat_Dinh_Tuyen_Cua_Mang_Thanh_Phan() { p = new double[J * J + 1, J + 1, J + 1]; for (int index_mang = 0; index_mang < tabControlMatranDinhtuyen.TabPages.Count; index_mang++) { for (int i = 0; i < tabControlMatranDinhtuyen.TabPages[index_mang].Controls.Count; i++) { if (tabControlMatranDinhtuyen.TabPages[index_mang].Controls[i].Name.IndexO f("MaTranDinhTuyen_Mang") >= 0) { string[] nut = tabControlMatranDinhtuyen.TabPages[index_mang].Text.Replace("(", "").Replace(")", "").Split(','); DataGridView grid = (DataGridView)tabControlMatranDinhtuyen.TabPages[index_mang].Contr ols[i]; if (nut[0] == nut[1]) { double value = 0; double.TryParse((grid.Rows[0].Cells[1].Value == null ? "0" : grid.Rows[0].Cells[1].Value.ToString()), out value); p[index_mang + 1, 0, int.Parse(nut[0])] = value; value = 0; double.TryParse((grid.Rows[1].Cells[0].Value == null ? "0" : grid.Rows[1].Cells[0].Value.ToString()), out value); p[index_mang + 1, int.Parse(nut[0]), 0] = value; P23 value = 0; double.TryParse((grid.Rows[1].Cells[1].Value == null ? "0" : grid.Rows[1].Cells[1].Value.ToString()), out value); p[index_mang + 1, int.Parse(nut[0]), int.Parse(nut[0])] = value; } else { for (int row = 0; row < grid.Rows.Count; row++) { for (int col = 0; col < grid.Columns.Count; col++) { double value; double.TryParse((grid.Rows[row].Cells[col].Value == null ? "0" : grid.Rows[row].Cells[col].Value.ToString()), out value); p[index_mang + 1, row, col] = value; } } } } } } } 2.3.2. Modul xác định ma trận xác suất luân chuyển job giữa các mạng thành phần tại các nút private void Xac_Dinh_Ma_Tran_Xac_Suat_Luan_Chuyen_Job_Giua_Cac_Mang_Thanh_Phan() { S = new double[J + 1, J * J + 1, J * J + 1]; for (int index_nut = 0; index_nut < tabControlMatranLuanChuyen.TabPages.Count; index_nut++) { for (int i = 0; i < tabControlMatranLuanChuyen.TabPages[index_nut].Controls.Count; i++) { if (tabControlMatranLuanChuyen.TabPages[index_nut].Controls[i].Name.Index Of("MaTranLuanChuyen_Nut") >= 0) { DataGridView grid = (DataGridView)tabControlMatranLuanChuyen.TabPages[index_nut].Contr ols[i]; for (int row = 0; row < grid.Rows.Count; row++) { for (int col = 0; col < grid.Columns.Count; col++) { double value; double.TryParse((grid.Rows[row].Cells[col].Value == null ? "0" : grid.Rows[row].Cells[col].Value.ToString()), out value); S[index_nut + 1, Index_Mang_Thanh_Phan(grid.Rows[row].HeaderCell.Value.ToString P24 ()), Index_Mang_Thanh_Phan(grid.Columns[col].HeaderCell.Value.ToStri ng())] = value; } } } } } } private int Index_Mang_Thanh_Phan(string kyhieu_mang) { int index = 0; while (mang_thanh_phan[index].IndexOf(kyhieu_mang) == -1) index = index + 1; return index; } 2.3.3. Modul xác định lƣu lƣợng dòng job từ bên ngoài vào mạng private void Xac_Dinh_Luu_Luong_Job_Tu_Ngoai_Mang_Den_Cac_Mang_Than_Phan() { v = new double[J + 1, J * J + 1]; for (int index_nut = 0; index_nut < tabControlLuu_Luong_Dong_Vao.TabPages.Count; index_nut++) { for (int i = 0; i < tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Controls.Count; i++) { if (tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Controls[i].Name.Ind exOf("MaTranDongVao_Nut") >= 0) { DataGridView grid = (DataGridView)tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Co ntrols[i]; for (int row = 0; row < grid.Rows.Count; row++) { double value; double.TryParse((grid.Rows[row].Cells[0].Value == null ? "0" : grid.Rows[row].Cells[0].Value.ToString()), out value); v[index_nut + 1, Index_Mang_Thanh_Phan(grid.Rows[row].HeaderCell.Value.ToString()) ] = value; } } } } } 2.3.4. Modul tính lƣu lƣợng dòng job đến các nút mạng tại các bƣớc private void Tinh_Luu_Luong_Job_Den_Cac_Nut() { a = new double[J + 1, J * J + 1]; P25 for (int nut_i = 1; nut_i <= J; nut_i++) { string[] c = L[nut_i].Split('*'); for (int index_mang = 0; index_mang < c.Length; index_mang++) { double luong_job = 0; for (int nut_j = 1; nut_j <= J; nut_j++) { if (nut_j != nut_i) { luong_job = luong_job + b[nut_j, int.Parse(c[index_mang])] * p[int.Parse(c[index_mang]), nut_j, nut_i]; } } a[nut_i, int.Parse(c[index_mang])] = Math.Round(luong_job + v[nut_i, int.Parse(c[index_mang])], 6); } } } 2.3.5. Modul tính lƣu lƣợng dòng job luân chuyển giữa các mạng thành phần tại các bƣớc private void Tinh_Luu_Luong_Job_Luan_Chuyen_Giua_Cac_Mang_ThanhPhan_Trong_Mot_Nut( ) { r = new double[J + 1, J * J + 1]; d = new double[J + 1, J * J + 1]; for (int nut_i = 1; nut_i <= J; nut_i++) { string[] c = L[nut_i].Split('*'); for (int k = 0; k < c.Length; k++) { double luong_job = 0; for (int k1 = 0; k1 < c.Length; k1++) { luong_job = luong_job + a[nut_i, int.Parse(c[k1])] * S[nut_i, int.Parse(c[k1]), int.Parse(c[k])]; } r[nut_i, int.Parse(c[k])] = Math.Round(luong_job, 6); Tong_R[nut_i, int.Parse(c[k])] = Tong_R[nut_i, int.Parse(c[k])] + r[nut_i, int.Parse(c[k])]; //Lưu lượng dòng job ra khỏi mạng sau một bước d[nut_i, int.Parse(c[k])] = Math.Round(a[nut_i, int.Parse(c[k])] * S[nut_i, int.Parse(c[k]), 0] + b[nut_i, int.Parse(c[k])] * p[int.Parse(c[k]), nut_i, 0], 6); //Tổng lưu lượng dòng job ra khỏi mạng tính đến bước hiện tại Tong_D[nut_i, int.Parse(c[k])] = Tong_D[nut_i, int.Parse(c[k])] + d[nut_i, int.Parse(c[k])]; P26 } } } 2.3.6. Modul tính lƣu lƣợng dòng job có trong các mạng thành phần tại các nút private void Tinh_Luu_Luong_Job_Co_Trong_Cac_Nut() { double[,] b1 = new double[J + 1, J * J + 1]; for (int nut_i = 1; nut_i <= J; nut_i++) { string[] c = L[nut_i].Split('*'); for (int index_mang = 0; index_mang < c.Length; index_mang++) { b1[nut_i, int.Parse(c[index_mang])] = Math.Round(r[nut_i, int.Parse(c[index_mang])] + b[nut_i, int.Parse(c[index_mang])] * p[int.Parse(c[index_mang]), nut_i, nut_i], 6); } } b = b1; } 2.3.7. Tính tổng lƣu lƣợng dòng job từ ngoài vào các nút mạng private void Tinh_Luu_Luong_Job_Vao_Mang() { for (int nut = 1; nut <= J; nut++) { for (int mang = 1; mang < J * J + 1; mang++) { Tong_V[nut, mang] = Tong_V[nut, mang] + v[nut, mang]; } } } 2.3.8. Tính lƣu lƣợng dòng job luân chuyển trong mạng tại các bƣớc private void ThucThi() { if (int.Parse(txtTongBuoc.Text) == n) return; n = n + 1; txtBuoc.Text = n.ToString(); //1. Xác định ma trận xác suất định tuyến của các mạng thành phần Xac_Dinh_Ma_Tran_Xac_Suat_Dinh_Tuyen_Cua_Mang_Thanh_Phan(); //2. Xác định ma trận xác suất luân chuyển job giữa các mạng thành phần tại mỗi nút Xac_Dinh_Ma_Tran_Xac_Suat_Luan_Chuyen_Job_Giua_Cac_Mang_Thanh_Phan(); //3. Xác định lưu lượng dòng job từ bên ngoài vào các mạng thành phần Xac_Dinh_Luu_Luong_Job_Tu_Ngoai_Mang_Den_Cac_Mang_Than_Phan(); //4. Xác định lưu lượng dòng job đến các nút P27 Tinh_Luu_Luong_Job_Den_Cac_Nut(); //5. Xác định lưu lượng dòng job luân chuyển giữa các mạng thành phần tại mỗi nút Tinh_Luu_Luong_Job_Luan_Chuyen_Giua_Cac_Mang_ThanhPhan_Trong_Mot_Nut(); //6. Xác định lưu lượng dòng job có trong các mạng thành phần tại mỗi nút Tinh_Luu_Luong_Job_Co_Trong_Cac_Nut(); //7. Xác định tổng lưu lượng dòng job từ bên ngoài vào các mạng thành phần Tinh_Luu_Luong_Job_Vao_Mang(); //8. Vẽ biểu đồ lưu lượng dòng job tại các mạng thành phần Ketqua_MoPhong_mang_thanh_phan(); //9. Vẽ biểu đồ lưu lượng dòng job tại các nút mạng Ketqua_MoPhong_nut_mang(); //10. Vẽ biểu đồ lưu lượng dòng job của mạng hàng đợi Ketqua_MoPhong_Toan_mang_hang_doi(); } 2.4. Các modul thể hiện kết quả tính toán bằng biểu đồ 2.4.1. Modul vẽ biểu đồ lƣu lƣợng dòng job luân chuyển trong mạng thành phần private void Create_Control_Ketqua_MoPhong_Mang_Thanh_Phan() { tabControlMophong_Mang_Thanh_Phan.TabPages.Clear(); for (int index_mang = 1; index_mang < mang_thanh_phan.Length; index_mang++) { tabControlMophong_Mang_Thanh_Phan.TabPages.Add(mang_thanh_phan[ind ex_mang]); tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1].BackColor = Color.Beige; } } 2.4.2. Modul vẽ biểu đồ lƣu lƣợng dòng job luân chuyển tại các nút mạng của mạng hàng đợi private void Create_Control_Ketqua_MoPhong_NutMang() { tabControlMophong_NutMang.TabPages.Clear(); for (int nut = 1; nut <= J; nut++) { tabControlMophong_NutMang.TabPages.Add("Nút " + nut.ToString()); tabControlMophong_NutMang.TabPages[nut - 1].BackColor = Color.Beige; TabControl Tab_Mang_Of_Nut = new TabControl(); Tab_Mang_Of_Nut.Name = "MangTP_Of_Nut" + nut.ToString(); Tab_Mang_Of_Nut.Parent=tabControlMophong_NutMang.TabPages[nut - 1]; Tab_Mang_Of_Nut.Anchor = AnchorStyles.Top; Tab_Mang_Of_Nut.Anchor = AnchorStyles.Bottom; P28 Tab_Mang_Of_Nut.Anchor = AnchorStyles.Left; Tab_Mang_Of_Nut.Anchor = AnchorStyles.Right; Tab_Mang_Of_Nut.Location = new Point(6, 6); Tab_Mang_Of_Nut.Width = tabControlMophong_NutMang.TabPages[nut - 1].Width - 5; Tab_Mang_Of_Nut.Height = tabControlMophong_NutMang.TabPages[nut - 1].Height - 5; string[] list_mang_thanh_phan = L[nut].Split('*'); for (int index_mang = 0; index_mang < list_mang_thanh_phan.Length; index_mang++) { Tab_Mang_Of_Nut.TabPages.Add(mang_thanh_phan[int.Parse(list_mang_t hanh_phan[index_mang])]); Tab_Mang_Of_Nut.TabPages[index_mang].BackColor = Color.Beige; } } } 2.4.3. Modul vẽ biểu đồ lƣu lƣợng dòng job luân chuyển trong mạng thành phần private void Ketqua_Mophong_mang_thanh_phan() { double Tong_Luu_Luong = 0; for (int index_mang = 1; index_mang < mang_thanh_phan.Length; index_mang++) { tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1].Controls.Clear(); DataRow row = LuuLuong[index_mang].NewRow(); //1. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần sau một bước Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { Tong_Luu_Luong = Tong_Luu_Luong + v[nut, index_mang]; } Label labelLuuLuong_ngoaivao_mot_buoc = new Label(); labelLuuLuong_ngoaivao_mot_buoc.AutoSize = true; labelLuuLuong_ngoaivao_mot_buoc.Text = "1. Tổng lưu lượng job từ bên ngoài vào mạng thành phần sau một bước: " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao_mot_buoc.Location = new Point(15, 15); labelLuuLuong_ngoaivao_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao_mot_buoc.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; //2. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần tính đến thời điểm hiện tại Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { P29 Tong_Luu_Luong = Tong_Luu_Luong + Tong_V[nut, index_mang]; } Label labelLuuLuong_ngoaivao = new Label(); labelLuuLuong_ngoaivao.AutoSize = true; labelLuuLuong_ngoaivao.Text = "2. Tổng lưu lượng job từ bên ngoài vào mạng thành phần tính đến thời điểm hiện tại: " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao.Location = new Point(15, 35); labelLuuLuong_ngoaivao.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; //3. Tổng lưu lượng job có trong mạng thành phần Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { Tong_Luu_Luong = Tong_Luu_Luong + b[nut, index_mang]; } Label labelTong_LuuLuong_Co_Trong_Mang = new Label(); labelTong_LuuLuong_Co_Trong_Mang.AutoSize = true; labelTong_LuuLuong_Co_Trong_Mang.Text = "3. Tổng lưu lượng job có trong mạng thành phần: " + Tong_Luu_Luong.ToString(); labelTong_LuuLuong_Co_Trong_Mang.Location = new Point(15, 55); labelTong_LuuLuong_Co_Trong_Mang.ForeColor = Color.MidnightBlue; labelTong_LuuLuong_Co_Trong_Mang.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; if (max_area_y[index_mang] < Tong_Luu_Luong) max_area_y[index_mang] = Tong_Luu_Luong; row["b"] = Tong_Luu_Luong; //4. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi sau một bước Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { Tong_Luu_Luong = Tong_Luu_Luong + d[nut, index_mang]; } Label labelLuuLuongRa_mot_buoc = new Label(); labelLuuLuongRa_mot_buoc.AutoSize = true; labelLuuLuongRa_mot_buoc.Text = "4. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi sau một bước: " + Tong_Luu_Luong.ToString(); labelLuuLuongRa_mot_buoc.Location = new Point(15, 75); labelLuuLuongRa_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuongRa_mot_buoc.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; if (max_area_y[index_mang] < Tong_Luu_Luong) max_area_y[index_mang] = Tong_Luu_Luong; row["d"] = Tong_Luu_Luong; //5. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi P30 Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { Tong_Luu_Luong = Tong_Luu_Luong + Tong_D[nut, index_mang]; } Label labelLuuLuongRa = new Label(); labelLuuLuongRa.AutoSize = true; labelLuuLuongRa.Text = "5. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi tính đến thời điểm hiện tại: " + Tong_Luu_Luong.ToString(); labelLuuLuongRa.Location = new Point(15, 95); labelLuuLuongRa.ForeColor = Color.MidnightBlue; labelLuuLuongRa.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; //Vẽ biểu đồ row["n"] = n; LuuLuong[index_mang].Rows.Add(row); LuuLuong[index_mang].AcceptChanges(); Chart chart = new Chart(); chart.DataSource = LuuLuong[index_mang]; chart.ChartAreas.Add("ChartArea1"); chart.ChartAreas["ChartArea1"].AxisX.Title = "Bước"; chart.ChartAreas["ChartArea1"].AxisY.Title = "Lưu lượng"; chart.Series.Add("b"); chart.Series.Add("d"); chart.Series["b"].IsVisibleInLegend = true; chart.Series["d"].IsVisibleInLegend = true; chart.Series["b"].XValueMember = "n"; chart.Series["b"].YValueMembers = "b"; chart.Series["d"].XValueMember = "n"; chart.Series["d"].YValueMembers = "d"; chart.Parent = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1]; chart.Location = new Point(15, 150); chart.Width = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1].Width - chart.Location.X - 15; chart.Height = tabControlMophong_Mang_Thanh_Phan.TabPages[index_mang - 1].Height - chart.Location.Y; chart.ChartAreas["ChartArea1"].AxisY.Maximum = max_area_y[index_mang] + 1; chart.ChartAreas["ChartArea1"].AxisX.Maximum = n + 1; } } private void Ketqua_MoPhong_nut_mang() { P31 double Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int k = 0; k < tabControlMophong_NutMang.TabPages[nut - 1].Controls.Count; k++) { TabControl Tab_MangTP = (TabControl)tabControlMophong_NutMang.TabPages[nut - 1].Controls[k]; Tab_MangTP.Width = tabControlMophong_NutMang.TabPages[nut - 1].Width; Tab_MangTP.Height = tabControlMophong_NutMang.TabPages[nut - 1].Height; Tab_MangTP.Location = new Point(6, 6); for (int h = 0; h < Tab_MangTP.TabPages.Count; h++) { Tab_MangTP.TabPages[h].Height = Tab_MangTP.Height; Tab_MangTP.TabPages[h].Width = Tab_MangTP.Width; Tab_MangTP.TabPages[h].Controls.Clear(); string[] list_mang = L[nut].Split('*'); int index_mang = int.Parse(list_mang[h]); DataRow row = LuuLuong_Nut[nut, index_mang].NewRow(); //1. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần sau một bước Tong_Luu_Luong = v[nut, index_mang]; Label labelLuuLuong_ngoaivao_mot_buoc = new Label(); labelLuuLuong_ngoaivao_mot_buoc.AutoSize = true; labelLuuLuong_ngoaivao_mot_buoc.Text = "1. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần sau một bước tại nút " + nut.ToString() + ": " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao_mot_buoc.Location = new Point(15, 15); labelLuuLuong_ngoaivao_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao_mot_buoc.Parent = Tab_MangTP.TabPages[h]; //2. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần tính đến thời điểm hiện tại Tong_Luu_Luong = Tong_V[nut, index_mang]; Label labelLuuLuong_ngoaivao = new Label(); labelLuuLuong_ngoaivao.AutoSize = true; labelLuuLuong_ngoaivao.Text = "2. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần tính đến thời điểm hiện tại tại nút " + nut.ToString() + ": " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao.Location = new Point(15, 35); labelLuuLuong_ngoaivao.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao.Parent = Tab_MangTP.TabPages[h]; P32 //3. Tổng lưu lượng job có trong mạng thành phần Tong_Luu_Luong = b[nut, index_mang]; Label labelTong_LuuLuong_Co_Trong_Mang = new Label(); labelTong_LuuLuong_Co_Trong_Mang.AutoSize = true; labelTong_LuuLuong_Co_Trong_Mang.Text = "3. Tổng lưu lượng job có trong mạng thành phần tại nút " + nut.ToString() + ": " + Tong_Luu_Luong.ToString(); labelTong_LuuLuong_Co_Trong_Mang.Location = new Point(15, 55); labelTong_LuuLuong_Co_Trong_Mang.ForeColor = Color.MidnightBlue; labelTong_LuuLuong_Co_Trong_Mang.Parent = Tab_MangTP.TabPages[h]; row["b"] = Tong_Luu_Luong; if (nut_max_area_y[nut, index_mang] < Tong_Luu_Luong) nut_max_area_y[nut, index_mang] = Tong_Luu_Luong; Tong_Luu_Luong = d[nut, index_mang]; Label labelLuuLuongRa_mot_buoc = new Label(); labelLuuLuongRa_mot_buoc.AutoSize = true; labelLuuLuongRa_mot_buoc.Text = "4. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi sau một bước tại nút " + nut.ToString() + ": " + Tong_Luu_Luong.ToString(); labelLuuLuongRa_mot_buoc.Location = new Point(15, 75); labelLuuLuongRa_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuongRa_mot_buoc.Parent = Tab_MangTP.TabPages[h]; row["d"] = Tong_Luu_Luong; if (nut_max_area_y[nut, index_mang] < Tong_Luu_Luong) nut_max_area_y[nut, index_mang] = Tong_Luu_Luong; //5. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi Tong_Luu_Luong = Tong_D[nut, index_mang]; Label labelLuuLuongRa = new Label(); labelLuuLuongRa.AutoSize = true; labelLuuLuongRa.Text = "5. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi tính đến thời điểm hiện tại tại nút " + nut.ToString() + ": " + Tong_Luu_Luong.ToString(); labelLuuLuongRa.Location = new Point(15, 95); labelLuuLuongRa.ForeColor = Color.MidnightBlue; labelLuuLuongRa.Parent = Tab_MangTP.TabPages[h]; //vẽ biểu đồ row["n"] = n; LuuLuong_Nut[nut, index_mang].Rows.Add(row); LuuLuong_Nut[nut, index_mang].AcceptChanges(); Chart chart = new Chart(); chart.DataSource = LuuLuong_Nut[nut, index_mang]; chart.ChartAreas.Add("ChartArea1"); P33 chart.ChartAreas["ChartArea1"].AxisX.Title = "Bước"; chart.ChartAreas["ChartArea1"].AxisY.Title = "Lưu lượng"; chart.Series.Add("b"); chart.Series.Add("d"); chart.Series["b"].IsVisibleInLegend = true; chart.Series["d"].IsVisibleInLegend = true; chart.Series["b"].XValueMember = "n"; chart.Series["b"].YValueMembers = "b"; chart.Series["d"].XValueMember = "n"; chart.Series["d"].YValueMembers = "d"; chart.Parent = Tab_MangTP.TabPages[h]; chart.Location = new Point(15, 150); chart.Width = Tab_MangTP.TabPages[h].Width - chart.Location.X - 15; chart.Height = Tab_MangTP.TabPages[h].Height - chart.Location.Y; chart.ChartAreas["ChartArea1"].AxisY.Maximum = nut_max_area_y[nut, index_mang] + 1; chart.ChartAreas["ChartArea1"].AxisX.Maximum = n + 1; } } } } 2.4.4. Modul vẽ biểu đồ lƣu lƣợng dòng job luân chuyển trong mạng hàng đợi private void Ketqua_MoPhong_Toan_mang_hang_doi() { double Tong_Luu_Luong = 0; tabPageMophong_MangHangDoi.Controls.Clear(); DataRow row = LuuLuong_mang.NewRow(); //1. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần sau một bước Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int index_mang = 1; index_mang < J * J + 1; index_mang++) { Tong_Luu_Luong = Tong_Luu_Luong + v[nut, index_mang]; } } Label labelLuuLuong_ngoaivao_mot_buoc = new Label(); labelLuuLuong_ngoaivao_mot_buoc.AutoSize = true; labelLuuLuong_ngoaivao_mot_buoc.Text = "1. Tổng lưu lượng job từ bên ngoài mạng hàng đợi sau một bước: " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao_mot_buoc.Location = new Point(15, 15); P34 labelLuuLuong_ngoaivao_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao_mot_buoc.Parent = tabPageMophong_MangHangDoi; //2. Tổng lưu lượng job từ bên ngoài mạng vào mạng thành phần tính đến thời điểm hiện tại Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int index_mang = 1; index_mang < J * J + 1; index_mang++) { Tong_Luu_Luong = Tong_Luu_Luong + Tong_V[nut, index_mang]; } } Label labelLuuLuong_ngoaivao = new Label(); labelLuuLuong_ngoaivao.AutoSize = true; labelLuuLuong_ngoaivao.Text = "2. Tổng lưu lượng job từ bên ngoài mạng vào mạng hàng đợi tính đến thời điểm hiện tại: " + Tong_Luu_Luong.ToString(); labelLuuLuong_ngoaivao.Location = new Point(15, 35); labelLuuLuong_ngoaivao.ForeColor = Color.MidnightBlue; labelLuuLuong_ngoaivao.Parent = tabPageMophong_MangHangDoi; //3. Tổng lưu lượng job có trong mạng thành phần Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int index_mang = 1; index_mang < J * J + 1; index_mang++) { Tong_Luu_Luong = Tong_Luu_Luong + b[nut, index_mang]; } } Label labelTong_LuuLuong_Co_Trong_Mang = new Label(); labelTong_LuuLuong_Co_Trong_Mang.AutoSize = true; labelTong_LuuLuong_Co_Trong_Mang.Text = "3. Tổng lưu lượng job có trong mạng hàng đợi: " + Tong_Luu_Luong.ToString(); labelTong_LuuLuong_Co_Trong_Mang.Location = new Point(15, 55); labelTong_LuuLuong_Co_Trong_Mang.ForeColor = Color.MidnightBlue; labelTong_LuuLuong_Co_Trong_Mang.Parent = tabPageMophong_MangHangDoi; if (mang_max_area_y < Tong_Luu_Luong) mang_max_area_y = Tong_Luu_Luong; row["b"] = Tong_Luu_Luong; //4. Tổng lưu lượng job ra khỏi mạng hàng đợi sau một bước Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int index_mang = 1; index_mang < J * J + 1; index_mang++) { Tong_Luu_Luong = Tong_Luu_Luong + d[nut, index_mang]; } P35 } Label labelLuuLuongRa_mot_buoc = new Label(); labelLuuLuongRa_mot_buoc.AutoSize = true; labelLuuLuongRa_mot_buoc.Text = "4. Tổng lưu lượng job ra khỏi mạng hàng đợi sau một bước: " + Tong_Luu_Luong.ToString(); labelLuuLuongRa_mot_buoc.Location = new Point(15, 75); labelLuuLuongRa_mot_buoc.ForeColor = Color.MidnightBlue; labelLuuLuongRa_mot_buoc.Parent = tabPageMophong_MangHangDoi; if (mang_max_area_y < Tong_Luu_Luong) mang_max_area_y = Tong_Luu_Luong; row["d"] = Tong_Luu_Luong; //5. Tổng lưu lượng job từ trong mạng thành phần ra khỏi mạng hàng đợi Tong_Luu_Luong = 0; for (int nut = 1; nut <= J; nut++) { for (int index_mang = 1; index_mang < J * J + 1; index_mang++) { Tong_Luu_Luong = Tong_Luu_Luong + Tong_D[nut, index_mang]; } } Label labelLuuLuongRa = new Label(); labelLuuLuongRa.AutoSize = true; labelLuuLuongRa.Text = "5. Tổng lưu lượng job ra khỏi mạng hàng đợi tính đến thời điểm hiện tại: " + Tong_Luu_Luong.ToString(); labelLuuLuongRa.Location = new Point(15, 95); labelLuuLuongRa.ForeColor = Color.MidnightBlue; labelLuuLuongRa.Parent = tabPageMophong_MangHangDoi; //Vẽ biểu đồ row["n"] = n; LuuLuong_mang.Rows.Add(row); LuuLuong_mang.AcceptChanges(); Chart chart = new Chart(); chart.DataSource = LuuLuong_mang; chart.ChartAreas.Add("ChartArea1"); chart.ChartAreas["ChartArea1"].AxisX.Title = "Bước"; chart.ChartAreas["ChartArea1"].AxisY.Title = "Lưu lượng"; chart.Series.Add("b"); chart.Series.Add("d"); chart.Series["b"].IsVisibleInLegend = true; chart.Series["d"].IsVisibleInLegend = true; chart.Series["b"].XValueMember = "n"; chart.Series["b"].YValueMembers = "b"; chart.Series["d"].XValueMember = "n"; P36 chart.Series["d"].YValueMembers = "d"; chart.Parent = tabPageMophong_MangHangDoi; chart.Location = new Point(15, 150); chart.Width = tabPageMophong_MangHangDoi.Width - chart.Location.X - 15; chart.Height = tabPageMophong_MangHangDoi.Height - chart.Location.Y; chart.ChartAreas["ChartArea1"].AxisY.Maximum = mang_max_area_y + 1; chart.ChartAreas["ChartArea1"].AxisX.Maximum = n + 1; } 2.5. Các modul lƣu tham số mạng hàng đợi ra tệp cấu hình mạng hàng đợi 2.5.1. Modul lƣu số nút mạng ra tệp cấu hình private void Save_Nut_Mang(string folder) { richTextBox1.Text = J.ToString(); richTextBox1.SaveFile(folder + "\\SoNutMang.dat", RichTextBoxStreamType.RichText); } 2.5.2. Modul lƣu ma trận xác suất định tuyến của các mạng thành phần ra tệp cấu hình private void Save_Ma_Tran_Xac_Suat_Dinh_Tuyen(string folder) { string value_xac_suat = ""; for (int index_mang = 0; index_mang < tabControlMatranDinhtuyen.TabPages.Count; index_mang++) { for (int i = 0; i < tabControlMatranDinhtuyen.TabPages[index_mang].Controls.Count; i++) { if (tabControlMatranDinhtuyen.TabPages[index_mang].Controls[i].Name.Index Of("MaTranDinhTuyen_Mang") >= 0) { DataGridView grid = (DataGridView)tabControlMatranDinhtuyen.TabPages[index_mang].Control s[i]; for (int row = 0; row < grid.Rows.Count; row++) { for (int col = 0; col < grid.Columns.Count; col++) { double value; double.TryParse((grid.Rows[row].Cells[col].Value == null ? "0" : grid.Rows[row].Cells[col].Value.ToString()), out value); if (string.IsNullOrEmpty(value_xac_suat)) value_xac_suat = index_mang.ToString() + "*" + row.ToString() + "*" + col.ToString() + "*" + value.ToString(); P37 else value_xac_suat = value_xac_suat + ";" + index_mang.ToString() + "*" + row.ToString() + "*" + col.ToString() + "*" + value.ToString(); } } } } } richTextBox1.Text = value_xac_suat; richTextBox1.SaveFile(folder + "\\MatranDinhtuyen_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); } 2.5.3. Modul lƣu ma trận xác suất luân chuyển giữa các mạng thành phần tại nút mạng ra tệp cấu hình private void Save_Ma_Tran_Xac_Suat_Luan_Chuyen_Giua_Cac_mang_Thanh_Phan(string folder) { string value_xac_suat = ""; for (int index_nut = 0; index_nut < tabControlMatranLuanChuyen.TabPages.Count; index_nut++) { for (int i = 0; i < tabControlMatranLuanChuyen.TabPages[index_nut].Controls.Count; i++) { if (tabControlMatranLuanChuyen.TabPages[index_nut].Controls[i].Name.Index Of("MaTranLuanChuyen_Nut") >= 0) { DataGridView grid = (DataGridView)tabControlMatranLuanChuyen.TabPages[index_nut].Contr ols[i]; for (int row = 0; row < grid.Rows.Count; row++) { for (int col = 0; col < grid.Columns.Count; col++) { double value; double.TryParse((grid.Rows[row].Cells[col].Value == null ? "0" : grid.Rows[row].Cells[col].Value.ToString()), out value); if (string.IsNullOrEmpty(value_xac_suat)) value_xac_suat = index_nut.ToString() + "*" + row.ToString() + "*" + col.ToString() + "*" + value.ToString(); else value_xac_suat = value_xac_suat + ";" + index_nut.ToString() + "*" + row.ToString() + "*" + col.ToString() + "*" + value.ToString(); } } } } } richTextBox1.Text = value_xac_suat; P38 richTextBox1.SaveFile(folder + "\\MatranLuanChuyen_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); } 2.5.4. Modul lƣu lƣu lƣợng dòng job từ ngoài vào mạng thành phần ra tệp cấu hình private void Save_Luu_Luong_Job_Vao_Mang(string folder) { string value_xac_suat = ""; for (int index_nut = 0; index_nut < tabControlLuu_Luong_Dong_Vao.TabPages.Count; index_nut++) { for (int i = 0; i < tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Controls.Count; i++) { if (tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Controls[i].Name.In dexOf("MaTranDongVao_Nut") >= 0) { DataGridView grid = (DataGridView)tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Co ntrols[i]; for (int row = 0; row < grid.Rows.Count; row++) { double value; double.TryParse((grid.Rows[row].Cells[0].Value == null ? "0" : grid.Rows[row].Cells[0].Value.ToString()), out value); if (string.IsNullOrEmpty(value_xac_suat)) value_xac_suat = index_nut.ToString() + "*" + row.ToString() + "*" + value.ToString(); else value_xac_suat = value_xac_suat + ";" + index_nut.ToString() + "*" + row.ToString() + "*" + value.ToString(); } } } } richTextBox1.Text = value_xac_suat; richTextBox1.SaveFile(folder + "\\Luu_Luong_Job_Vao_Mang_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); } 2.6. Các modul mở mạng hàng đợi từ tệp cấu hình 2.6.1. Modul mở mạng hàng đợi từ tệp cấu hình private void button5_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowDialog(); string folder = folderBrowserDialog1.SelectedPath; if (folder != "") { Open_Nut_Mang(folder); P39 Open_Ma_Tran_Xac_Suat_Dinh_Tuyen(folder); Open_Ma_Tran_Xac_Suat_Luan_Chuyen_Giua_Cac_mang_Thanh_Phan(folde r); Open_Luu_Luong_Job_Vao_Mang(folder); } } 2.6.2. Modul load nút mạng hàng đợi từ tệp cấu hình private void Open_Nut_Mang(string folder) { richTextBox1.LoadFile(folder + "\\SoNutMang.dat", RichTextBoxStreamType.RichText); txtSO_NUT.Text = richTextBox1.Text; if (folder != "") { //Khởi tạo các tham số và các đối tượng thể hiện các tham số mạng hàng đợi Khoi_Tao_Cac_Tham_So(); Create_Control_MaTranDinhTuyen(); Create_Control_MaTranLuanChuyen(); Create_Control_Dong_Job_Vao_Mang(); Create_Control_Ketqua_MoPhong_Mang_Thanh_Phan(); Create_Control_Ketqua_MoPhong_NutMang(); } } 2.6.3. Modul load ma trận xác suất định tuyến của các mạng thành phần từ tệp cấu hình private void Open_Ma_Tran_Xac_Suat_Dinh_Tuyen(string folder) { string value_xac_suat = ""; richTextBox1.LoadFile(folder + "\\MatranDinhtuyen_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); value_xac_suat = richTextBox1.Text; string[] arr_value_xac_suat = value_xac_suat.Split(';'); for (int index = 0; index < arr_value_xac_suat.Length; index++) { string[] row_col_value = arr_value_xac_suat[index].Split('*'); int index_mang = int.Parse(row_col_value[0]); int row = int.Parse(row_col_value[1]); int col = int.Parse(row_col_value[2]); double value = double.Parse(row_col_value[3]); DataGridView grid = (DataGridView)tabControlMatranDinhtuyen.TabPages[index_mang].Controls[0]; if (value > 0) grid.Rows[row].Cells[col].Value = value; else grid.Rows[row].Cells[col].Value = ""; } } 2.6.4. Modul load ma trận xác suất job luân chuyển giữa các mạng thành phần tại các nút mạng từ tệp cấu hình P40 private void Open_Ma_Tran_Xac_Suat_Luan_Chuyen_Giua_Cac_mang_Thanh_Phan(string folder) { string value_xac_suat = ""; richTextBox1.LoadFile(folder + "\\MatranLuanChuyen_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); value_xac_suat = richTextBox1.Text; string[] arr_value_xac_suat = value_xac_suat.Split(';'); for (int index = 0; index < arr_value_xac_suat.Length; index++) { string[] row_col_value = arr_value_xac_suat[index].Split('*'); int index_nut = int.Parse(row_col_value[0]); int row = int.Parse(row_col_value[1]); int col = int.Parse(row_col_value[2]); double value = double.Parse(row_col_value[3]); DataGridView grid = (DataGridView)tabControlMatranLuanChuyen.TabPages[index_nut].Controls[0]; if (value > 0) grid.Rows[row].Cells[col].Value = value; else grid.Rows[row].Cells[col].Value = ""; } } 2.6.5. Modul load lƣu lƣợng dòng job từ bên ngoài vào các mạng thành phần từ tệp cấu hình private void Open_Luu_Luong_Job_Vao_Mang(string folder) { string value_xac_suat = ""; richTextBox1.LoadFile(folder + "\\Luu_Luong_Job_Vao_Mang_" + J.ToString() + "_nut.dat", RichTextBoxStreamType.RichText); value_xac_suat = richTextBox1.Text; string[] arr_value_xac_suat = value_xac_suat.Split(';'); for (int index = 0; index < arr_value_xac_suat.Length; index++) { string[] row_col_value = arr_value_xac_suat[index].Split('*'); int index_nut = int.Parse(row_col_value[0]); int row = int.Parse(row_col_value[1]); double value = double.Parse(row_col_value[2]); DataGridView grid = (DataGridView)tabControlLuu_Luong_Dong_Vao.TabPages[index_nut].Controls[ 0]; if (value > 0) grid.Rows[row].Cells[0].Value = value; else grid.Rows[row].Cells[0].Value = ""; } } }

Các file đính kèm theo tài liệu này:

  • pdfluan_an_mot_so_dang_hang_doi_va_cac_nguyen_ly_xu_ly.pdf
  • docThongTin KetLuanMoi LuanAn NCS NguyenTrungDung.doc
  • docTrichYeu LuanAn NCS NguyenTrungDung.doc
Luận văn liên quan