BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC SƯ PHẠM TP... Cài đặt.Hướng dẫn chạy chương trình:Sau khi giải nén thầy chọn mục Grap_Theory.sln và chạy bằng MS Visual StudioSau đó sẽ được như hình
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM TP HCM KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ MÔN PHÂN TÍCH THIẾT
KẾ VÀ GIẢI THUẬT CHỦ ĐỀ THUẬT TOÁN QUY HOẠCH ĐỘNG
Giảng viên hướng dẫn: GV Văn Thế Thành
Sinh viên thực hiện: Lê Phan Gia Minh
Lớp học phần: COMP140101
MSSV: 45.01.104.143
Năm 2021 – 2022
1
Trang 2Mục lục
1 Trình bày thuật toán:……… 3
Input……….………3
Output……… 3
Xử lý……… 3
2 Phân tích độ phức tạp……… 3
3 Ứng dụng cụ thể………5
4 Thiết kế……… 5
5 Cài đặt………7
Hướng dẫn sử dụng……….7
Kết quả các test case………9
Trang 31 Trình bày thuật toán.
In put:
Gồm 1 ma trận của đồ thị
Ví dụ:
Out put:
Xuất ra đường đi ngắn nhất giữa 2 điểm
bất kì
Ví dụ:
Xét điểm 1 -> 3 của đồ thị trên
Đường đi ngắn nhất: 1 -> 2 -> 3
Xử lý:
Khởi tạo lấy điểm 1 làm điểm xuất phát
C1: từ điểm 1 ta có đường đi đến điểm 2 và điểm 4 => ở điểm 2 và điểm 4 lần lượt
ta có (3,1), (10,1) với 3 và 10 là khoảng cách giữa 2 điểm lần lượt là 2 và 4 so với điểm 1 Và do khoảng cách từ 1 -> 2 ngắn hơn từ 1 -> 4 nên tại đây ta chốt ở điểm 2
C2: từ điểm 2 có 2 đường đi đến là 3 và 4 và do đã có khoảng cách từ 1 ->2 ở C1 nên ta sẽ cộng dồn vào khoảng cách ở tại điểm 3, 4 lần lượt là (4, 2), (6, 2) Khoảng cách từ 2->3 ngắn hơn nên ta sẽ chốt tại 3 với (4, 2)
C3: tương tự như C1, C2 ta có 4 (11, 4) và kết thúc
Yêu cầu tìm đường đi ngắn nhất từ 1->3 nên ta có:
=>lấy đường đi 1 -> 2 -> 3
2 Phân tích độ phức tạp.
3
Trang 4C2=1 public int[,] maTran = new int[100, 100];
public void dijkstra(int dinhDau, int dinhCuoi)
{
dinhDau;
dinhCuoi;
{
length[i] = voCuc;
lastV[i] = -1;
}
thuocT[dinhDau] = false;
lastV[dinhDau] = dinhDau;
int v = dinhDau;
int t = dinhDau;
{
C9= (n+1) /22 for (int k = 0; k < soDinh; ++k)
{
C10= n(n+1)/2 if (maTran[v, k] != 0 && thuocT[k] == true &&
(length[k] == voCuc || length[k] > length[v] + maTran[v, k])) {
C11=3n(n+1)/4 length[k] = length[v] + maTran[v, k];
lastV[k] = v;
}
}
C13= (n+1) /22 for (i = 0; i < soDinh; ++i)
{
C14= n(n+1)/2 if (thuocT[i] == true && length[i] != voCuc)
{
C15= n(n+1)/4 if (v == -1 || length[v] > length[i])
C16= n(n+1)/8 v = i;
}
}
}
Trang 5O(n)= C1+C2+C3+…+C17 = 4+ n+1 + 3n + 5 + (n+1)/2 + (n+1) /2 + n(n+1)/2 +
O(n)= 11 + n + 7n + (13n + 17n + 4)/82 2
=>Bài thuật toán có độ phức tạp là O(n )2
3 Ứng dụng cụ thể.
Khi ta có 1 đồ thị như hình, ta có quy về 1
ma trận với số đỉnh và giá trị khoảng cách
của từng cạnh như ví dụ ở Input và tìm
đường đi ngắn nhất giữa các đỉnh bất kì
Input:
Gồm 1 ma trận của đồ thị
Ví dụ:
Output:
Xuất ra đường đi ngắn nhất giữa 2 điểm bất kì
Ví dụ:
Xét điểm 1 -> 3 của đồ thị trên
Đường đi ngắn nhất: 1 -> 2 -> 3
4 Thiết kế
- Đặt số đỉnh cho ma trận
- Gán vô cực = -1 (vô cực khi không có đường đi giữa 2 điểm)
- Khởi tạo mảng 2 chiều cho ma trận [100,100]
- Tạo hàm đọc tạo ma trận [i,j] của đồ thị
public void docMaTran( [,] _maTran, _soDinh) int int
{
soDinh = _soDinh;
for int ( i = 0; i < soDinh; ++i)
{
for int ( j = 0; j < soDinh; ++j)
{
maTran[i, j] = _maTran[i, j];
}
}
}
- Hàm tìm đường đi ngắn nhất
public void dijkstra( dinhDau, dinhCuoi) int int
{
i = 0; int
dinhDau;
dinhCuoi;
for (i = 0; i < soDinh; ++i)
5
Trang 6thuocT[i] = true ;
length[i] = voCuc;
lastV[i] = -1;
}
length[dinhDau] = 0;
thuocT[dinhDau] = false ;
lastV[dinhDau] = dinhDau;
v = dinhDau; int
t = dinhDau; int
while (thuocT[dinhCuoi])
{
for int ( k = 0; k < soDinh; ++k)
{
(maTran[v, k] != 0 && thuocT[k] == if true && (length[k] == voCuc ||
length[k] > length[v] + maTran[v, k]))
{
length[k] = length[v] + maTran[v, k];
lastV[k] = v;
}
}
v = -1;
for (i = 0; i < soDinh; ++i)
{
(thuocT[i] == if true && length[i] != voCuc)
{
(v == -1 || length[v] > length[i]) v = i; if
}
}
thuocT[v] = false ;
}
}
- Hàm xuất
public void xuat( dinhDau, dinhCuoi) int int
{
dinhDau;
dinhCuoi;
v = dinhCuoi; int
while (v != dinhDau)
{
duongDi[id] = v;
v = lastV[v];
++id;
}
duongDi[id] = dinhDau;
}
Trang 75 Cài đặt.
Hướng dẫn chạy chương trình:
Sau khi giải nén thầy chọn mục Grap_Theory.sln và chạy bằng MS Visual Studio
Sau đó sẽ được như hình:
7
Trang 8Sau khi bấm start:
Trang 9Ngoài ra còn có các tính năng “xóa đỉnh”, “xóa cạnh”, “Set/Đổi trọng số”(thay đổi
“Đỉnh cuối”, “Trọng số” sau đó double click vào “Set/Đổi trọng số” )
(Do đây là phần code em đã làm bên môn lý thuyết đồ thị ở học kỳ trước nên còn một số tính năng em chưa kịp remove em mong thầy thông cảm giúp em ạ)
Kết quả các test case:
Test case1:
Test case 2:
9
Trang 10Test case 3:
Test case 4:
Test case 5:
Trang 11Test case 6:
Test case 7:
Test case 8:
11
Trang 12Test case 9:
Test case 10: