Uploaded by Nguyễn Tiến Minh

Bài-toán-người-du-lịch-bằng-phương-pháp-nhánh-cận

advertisement
Giải thích:
Đoạn code trên giải quyết bài toán tìm đường đi ngắn nhất trong một đồ thị có trọng số. Đồ
thị trong bài toán này có 4 đỉnh, được đánh số từ 0 đến 3. Ma trận trọng số graph lưu trữ
trọng số của các cạnh giữa các đỉnh.
Đoạn code sử dụng thuật toán hoán vị để tìm ra tất cả các đường đi có thể trong đồ thị. Hàm
permute() thực hiện hoán vị các đỉnh trong mảng a. Sau mỗi lần hoán vị, hàm copy_array()
được gọi để tính toán tổng trọng số của đường đi tương ứng với thứ tự các đỉnh trong mảng a.
Hàm main() khởi tạo ma trận trọng số graph và mảng a chứa các đỉnh. Sau đó, hàm permute()
được gọi với các tham số a, 0 và 3. Hàm permute() sẽ thực hiện hoán vị các đỉnh trong mảng
a và gọi hàm copy_array() để tính toán tổng trọng số của đường đi tương ứng với mỗi thứ tự
đỉnh.
Sau khi tất cả các đường đi đã được xét đến, hàm main() sẽ in ra trọng số tối ưu.
Dưới đây là một số điểm cần lưu ý khi giải thích đoạn code:
Hàm swap() được sử dụng để hoán đổi giá trị của hai biến.
Hàm copy_array() được sử dụng để tính toán tổng trọng số của một đường đi.
Hàm permute() được sử dụng để thực hiện thuật toán hoán vị.
Hàm main() khởi tạo ma trận trọng số graph và mảng a và gọi hàm permute() để tìm ra đường
đi ngắn nhất.
Code:
1. #include<stdio.h>
2. #include<conio.h>
3. #include<iostream>
4. using namespace std;
5. int c = 0,cost = 999;
6. int graph[4][4] = { {0, 10, 15, 20},
7.
{10, 0, 35, 25},
8.
{15, 35, 0, 30},
9.
{20, 25, 30, 0}
10.
};
11.
void swap (int *x, int *y)
12.
{
13.
int temp;
14.
temp = *x;
15.
*x = *y;
16.
*y = temp;
17.
}
18.
void copy_array(int *a, int n)
19.
{
20.
int i, sum = 0;
21.
for(i = 0; i <= n; i++)
22.
{
23.
sum += graph[a[i % 4]][a[(i + 1) % 4]];
24.
}
25.
if (cost > sum)
26.
{
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
cost = sum;
}
}
void permute(int *a, int i, int n)
{
int j, k;
if (i == n)
{
copy_array(a, n);
}
else
{
for (j = i; j <= n; j++)
{
swap((a + i), (a + j));
permute(a, i + 1, n);
swap((a + i), (a + j));
}
}
}
int main()
{
int i, j;
int a[] = {0, 1, 2, 3};
permute(a, 0, 3);
cout<<"minimum cost:"<<cost<<endl;
getch();
}
Download