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)
174 trang |
Chia sẻ: tueminh09 | Ngày: 24/01/2022 | Lượt xem: 648 | Lượt tải: 0
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 = "";
}
}
}