1. BÀI TOÁN NGƯỜI DU
LỊCH
Giáo viên: TS. Nguy n Văn Hi u
ễ ệ
Email: nvhieuqt@dut.udn.vn
2. Nội dung
• Phát biểu bài toán
• Phân tích
• Ý tưởng
• Thuật giải của bài toán
– Thủ tục rút gọn để tính cận dưới
– Thủ tục phân nhánh
– Thủ tục chọn cận phân nhánh
– Thủ tục chọn hai cạnh cuối cùng
3. Bài toán
▪ Có n thành phố ký hiệu:
T1, T2,…, Tn
▪ Cij là chi phí từ thành phố Ti
đến Tj
▪ Xuất phát từ một thành phố
nào đó đi qua tất cả các
thành phố mỗi thành phố
đúng một lần, rồi quay trở
lại thành phố xuất phát.
• Hãy tìm hành trình
(chu trình) với chi phí
nhỏ nhất
4. Phân tích
• Xét đồ thị có trọng:
G = (V, E)
▪ Mỗi thành phố là một
đỉnh của đồ thị
▪ Mỗi đường đi giữa các
thành phố là một cạnh
nối giữa các đỉnh của đồ
thị
•
5. Phân tích
• Xét đồ thị có trọng:
G = (V, E)
▪ Mỗi thành phố là một
đỉnh của đồ thị
▪ Mỗi đường đi giữa các
thành phố là một cạnh
nối giữa các đỉnh của đồ
thị
▪ Đường đi tìm được:
x1, x2, …, xn, x1
với xi là đỉnh,
(xi, xi+1) là cạnh
▪ Bài toán người du lịch:
f(x1…xn)=c[x1,x2]+…+c[xn, x1]
🡪 min
6. Ý tưởng
Tập tất cả các
hành trình
Tập hành trình
chứ (i,j)
Tập hành trình
không chứa
(i,j)
✔ Thực hiện quá trình
phân nhánh
✔ Tính giá trị cận
dưới trên mỗi tập
✔ Thủ tục cứ tiếp tục
cho đến lúc nhận
được một hành trình
đầy đủ
7. Thuật giải
1. Thủ tục rút gọn để tính cận dưới
2. Thủ tục chọn cạnh phân nhánh
3. Thủ tục phân nhánh
4. Thủ tục chọn hai cạnh cuối cùng
8. Thuật giải
Cơ sở lý luận
▪ Hành trình của người du lịch:
▪ Chứa đúng một phần tử của
mỗi dòng của ma trận chi phí.
▪ Chứa đúng một phần tử của
mỗi cột của ma trận chi phí.
Cơ sở lý luận
▪ Độ dài của tất cả các hành
trình sẽ giảm đi a đơn vị
▪ Hoặc nếu bớt mỗi phần tử của
một dòng đi cùng một số a.
▪ Hoặc nếu bớt mỗi phần tử của
một cột đi cùng một số a
1. Thủ tục rút gọn để tính cận dưới
Nhận xét
Hành trình tối ưu sẽ không bị thay đổi
9. Thuật giải
Thủ tục
▪ Ma trận rút gọn
▪ Các phần tử của ma trận
không âm;
▪ Mỗi hàng chứa ít nhất một
phần tử 0;
▪ Mỗi cột chứa ít nhất một
phần tử 0;
▪ Ma trận chi phí về ma trận
rút gọn: giảm các phần tử
của mỗi dòng và của mỗi
cột đi một hằng số
Khái niệm
▪ Thủ tục chuyển từ ma trận
chi phí về ma trận rút gọn
gọi là thủ tục rút gọn;
▪ Hàng số trừ ở mỗi dòng
hoặc ở mỗi cột gọi là hằng
số rút gọn;
1. Thủ tục rút gọn để tính cận dưới
10. Thuật giải
Nhận xét
▪ Ma trận rút gọn:
▪ Các phần tử của ma trận
không âm;
▪ Mỗi hàng chứa ít nhất một
phần tử 0;
▪ Mỗi cột chứa ít nhất một
phần tử 0;
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
1. Thủ tục rút gọn để tính cận dưới
11. Thuật giải
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
a. Rút gọn dòng
▪ Khởi tạo: Sum = 0
▪ Ứng với mỗi dòng:
▪ Tìm phần tử nhỏ nhất của
dòng: ví dụ là r
▪ Trừ tất cả các phần tử trên
dòng bởi phần tử r
▪ Sum = Sum + r
1. Thủ tục rút gọn để tính cận dưới
12. Thuật giải
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
a. Rút gọn trên dòng
1. Thủ tục rút gọn để tính cận dưới
3
4
16
7
25
3
13. Thuật giải
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
a. Rút gọn trên dòng
1. Thủ tục rút gọn để tính cận dưới
3
4
16
7
25
Sum = 58
3
14. Thuật giải
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
b. Rút gọn trên cột
1. Thủ tục rút gọn để tính cận dưới
Sum = 58
15 8
15. Thuật giải
Thủ tục
Input: ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
b. Rút gọn trên cột
1. Thủ tục rút gọn để tính cận dưới
Sum = 58
15 8 Sum = 81
16. Thuật giải
Thủ tục
Input:
Ma trận chi phí C
Output:
⮚ ma trận rút gọn;
⮚ tổng hằng số rút gọn.
b. Rút gọn cột
▪ Khởi tạo: Sum = Sum (từ
thủ tục rút gọn hàng)
▪ Ứng với mỗi cột:
▪ Tìm phần tử nhỏ nhất của cột:
ví dụ c;
▪ Trừ tất cả các phần tử trên cột
bởi phần tử c
▪ Sum = Sum + c
1. Thủ tục rút gọn để tính cận dưới
17. Thuật giải
1. Thủ tục rút gọn để tính cận dưới
2. Thủ tục chọn cạnh phân nhánh
3. Thủ tục phân nhánh
4. Thủ tục chọn hai cạnh cuối cùng
18. Thuật giải
Ý tưởng
▪ Chọn (r,s) sao cho cận dưới
của tập phân nhánh không
chứ (r,s) tăng lớn nhất
Thủ tục
Input:
Ma trận rút gọn
Output:
Cạnh phân nhánh (r,s)
2. Thủ tục chọn cạnh phân nhánh
20. Thuật giải
Thủ tục
Input:
Ma trận rút gọn
Output:
Cạnh (r,s)
Thủ tục
r = 6, s = 3
2. Thủ tục chọn cạnh phân nhánh
21. Thuật giải
1. Thủ tục rút gọn để tính cận dưới
2. Thủ tục chọn cạnh phân nhánh
3. Thủ tục phân nhánh
4. Thủ tục chọn hai cạnh cuối cùng
22. Thuật giải
Thủ tục
▪ Giả sử ở bước 2 đã
chọn cạnh (r,s) để phân
nhánh thì đặt:
▪ P1 -hành trình đi qua (r,s)
▪ P2 không đi qua (r,s)
3. Thủ tục phân nhánh
P
P2
(81)P1
(6,3)
r = 6, s = 3
23. Thuật giải
a. Thủ tục trên P1
•
a. Thủ tục trên P1
▪ Rút gọn ma trận chi phí
▪ Và tính cận dưới:
sum += tổng hằng số rút gọn
=> Tiếp tục thực hiện thủ tục
phân nhánh theo nhánh này
3. Thủ tục phân nhánh
25. Thuật giải
Thủ tục
▪ Giả sử ở bước 2 đã
chọn cạnh (r,s) để phân
nhánh thì đặt:
▪ P1 chứa (r,s)
▪ P2 không chứa (r,s)
b. Thủ tục trên P2
•
3. Thủ tục phân nhánh
27. Thuật giải
1. Thủ tục rút gọn để tính cận dưới
2. Thủ tục chọn cạnh phân nhánh
3. Thủ tục phân nhánh
4. Thủ tục chọn hai cạnh cuối cùng
28. Thuật giải
Thủ tục
▪ Sau khi đã chọn n-2
cạnh, chúng ta phải
chọn tiếp hai cạnh còn
lại.
▪ Lúc này ma trận rút gọn bậc
hai có 1 trong hai dạng:
Thủ tục
4. Thủ tục chọn hai cạnh cuối cùng