Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài toán

§ Có n thành phố ký hiệu: • Hãy tìm hành trình


T1, T2,…, Tn (chu trình) với chi phí
§ Cij là chi phí từ thành phố Ti nhỏ nhất
đế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.

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Phân tích

• Xét đồ thị có trọng: § Nhận xét:


G = (V, E) § Đồ thị ứng dụng có thể
§ Mỗi thành phố là một có hướng hoặc vô
đỉnh của đồ thị hướng;
§ Mỗi đường đi giữa các § Các cặp đỉnh không có
thành phố là một cạnh đường đi gán trọng số
nối giữa các đỉnh của đồ ∞,
thị § Tạo nên một chu trình (
đỉnh xuất phát trùng với
đỉnh kết thúc)

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Phân tích

• Xét đồ thị có trọng: § Đường đi tìm được:


G = (V, E) x1, x2, …, xn, x1
§ Mỗi thành phố là một với xi là đỉnh,
đỉnh của đồ thị
(xi, xi+1) là cạnh
§ Mỗi đường đi giữa các
thành phố là một cạnh § Bài toán người du lịch:
nối giữa các đỉnh của đồ f(x1…xn)=c[x1,x2]+…+c[xn, x1]
thị à min

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ý tưởng
ü Thực hiện quá trình
phân nhánh
Tập tất cả các
hành trình ü Tính giá trị cận
dưới trên mỗi tập
ü Thủ tục cứ tiếp tục
Tập hành trình cho đến lúc nhận
Tập hành trình
không chứa
chứ (i,j) được một hành trình
(i,j)
đầy đủ

CuuDuongThanCong.com https://fb.com/tailieudientucntt
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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Cơ sở lý luận Cơ sở lý luận
§ Hành trình của người du lịch: § Độ dài của tất cả các hành
§ Chứa đúng một phần tử của trình sẽ giảm đi a đơn vị
mỗi dòng của ma trận chi phí. § Hoặc nếu bớt mỗi phần tử của
§ Chứa đúng một phần tử của một dòng đi cùng một số a.
mỗi cột của ma trận chi phí. § Hoặc nếu bớt mỗi phần tử của
một cột đi cùng một số a

Nhận xét
Hành trình tối ưu sẽ không bị thay đổi

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục Khái niệm


§ Ma trận rút gọn § Thủ tục chuyển từ ma trận
§ Các phần tử của ma trận chi phí về ma trận rút gọn
không âm; gọi là thủ tục rút gọn;
§ Mỗi hàng chứa ít nhất một § Hàng số trừ ở mỗi dòng
phần tử 0;
hoặc mỗi cột gọi là hằng số
§ Mỗi cột chứa ít nhất một phần
tử 0; rút gọn;
§ 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ố
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Nhận xét Thủ tục


§ Ma trận rút gọn: Input: ma trận chi phí C
§ Các phần tử của ma trận Output:
không âm;
Ø ma trận rút gọn;
§ Mỗi hàng chứa ít nhất một
phần tử 0; Ø tổng hằng số rút gọn.
§ Mỗi cột chứa ít nhất một
phần tử 0;

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục a. Rút gọn dòng


Input: ma trận chi phí C § Khởi tạo: Sum = 0
Output: § Ứng với mỗi dòng:
Ø ma trận rút gọn; § Tìm phần tử nhỏ nhất của
dòng: ví dụ là r
Ø tổng hằng số rút gọn.
§ Trừ tất cả các phần tử trên
dòng bởi phần tử r
§ Sum = Sum + r

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục a. Rút gọn trên dòng


Input: ma trận chi phí C
¥ 3 93 13 33 9 3
Output:
4 ¥ 77 42 21 16 4
Ø ma trận rút gọn;
Ø tổng hằng số rút gọn. 45 17 ¥ 36 16 28 16
39 90 80 ¥ 56 7 7
28 46 88 33 ¥ 25 25

3 88 18 46 92 ¥ 3

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục a. Rút gọn trên dòng


Input: ma trận chi phí C
¥ 0 90 10 30 6 3
Output:
0 ¥ 73 38 17 12 4
Ø ma trận rút gọn;
Ø tổng hằng số rút gọn. 29 1 ¥ 20 0 12 16
32 83 73 ¥ 49 0 7
3 21 63 8 ¥ 0 25

0 85 15 43 89 ¥ 3

Sum = 58

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục b. Rút gọn trên cột


Input: ma trận chi phí C Sum = 58
Output: ¥ 0 90 10 30 6
Ø ma trận rút gọn; 0 ¥ 73 38 17 12
Ø tổng hằng số rút gọn.
29 1 ¥ 20 0 12
32 83 73 ¥ 49 0
3 21 63 8 ¥ 0
0 85 15 43 89 ¥
15 8

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục b. Rút gọn trên cột


Input: ma trận chi phí C Sum = 58
Output: ¥ 0 75 2 30 6
Ø ma trận rút gọn; 0 ¥ 58 30 17 12
Ø tổng hằng số rút gọn.
29 1 ¥ 12 0 12
32 83 58 ¥ 49 0
3 21 48 0 ¥ 0
0 85 0 35 89 ¥
15 8 Sum = 81

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
1. Thủ tục rút gọn để tính cận dưới

Thủ tục b. Rút gọn cột


Input: § Khởi tạo: Sum = Sum (từ
Ma trận chi phí C thủ tục rút gọn hàng)

Output: § Ứng với mỗi cột:


§ Tìm phần tử nhỏ nhất của cột:
Ø ma trận rút gọn;
ví dụ c;
Ø tổng hằng số rút gọn. § Trừ tất cả các phần tử trên cột
bởi phần tử c
§ Sum = Sum + c

CuuDuongThanCong.com https://fb.com/tailieudientucntt
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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
2. Thủ tục chọn cạnh phân nhánh

Ý tưởng Thủ tục


§ Chọn (r,s) sao cho cận dưới Input:
của tập phân nhánh không Ma trận rút gọn
chứ (r,s) tăng lớn nhất Output:
Cạnh phân nhánh (r,s)

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
2. Thủ tục chọn cạnh phân nhánh

Thủ tục Thủ tục


Input: § Khởi tạo: 𝛼 := −∞
Ma trận rút gọn § Với mỗi cặp i, j với Aij = 0 (i,j
=1,…,n) tính
Output:
§ Xác định:
Cạnh (r,s) • minr = min {Ai h :h ≠ j}
(tính giá trị nhỏ nhất trên hàng i)
• mins = min{Ah j :h ≠ j}
(tính giá trị nhỏ nhất trên cột j)
§ Nếu 𝜶 < minr + mins,
• 𝜶 := minr + mins,
• r = i, s = j;

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
2. Thủ tục chọn cạnh phân nhánh

Thủ tục Thủ tục


Input: r = 6, s = 3
Ma trận rút gọn ¥ 0 75 10 30 6
Output: 0 ¥ 58 38 17 12
Cạnh (r,s)
29 1 ¥ 20 0 12
32 83 58 ¥ 49 0
3 21 48 8 ¥ 0
0 85 0 43 89 ¥
𝛼 = 48

CuuDuongThanCong.com https://fb.com/tailieudientucntt
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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
3. Thủ tục phân nhánh

Thủ tục
r = 6, s = 3
§ Giả sử ở bước 2 đã
P
chọn cạnh (r,s) để phân (81)P1
(6,3)
nhánh thì đặt:
P2
§ P1 -hành trình đi qua (r,s)

§ P2 không đi qua (r,s)

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
3. Thủ tục phân nhánh

a. Thủ tục trên P1 a. Thủ tục trên P1


§ Cận dưới là sum (giá trị từ thủ tục § Rút gọn ma trận chi phí
rút gọn) § Và tính cận dưới:
§ Giảm cấp ma trận: sum += tổng hằng số rút gọn
§ Loại hàng r,
§ Loại cột s.
=> Tiếp tục thực hiện thủ tục
§ Ngăn cấm tạo hành trình con: phân nhánh theo nhánh này
§ Cấm (s, r) gán:Csr = ∞
§ Nếu (r,s) là cạnh phân nhánh thứ hai
trở đi thì phải xét các cạnh đã chọn
nối trước và sau cạnh (r,s) thành dãy
nối tiếp các cạnh như:
(i,j) à …à(r,s)à…à(k,h)
thì cấm (h,i) tức Ch i = ∞
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
3. Thủ tục phân nhánh

a. Thủ tục trên P1

¥ 0 75 10 30 6
0 ¥ 58 38 17 12
29 1 ¥ 20 0 ¥
32 83 58 ¥ 49 0
3 21 48 8 ¥ 0
0 85 0 43 89 ¥

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
3. Thủ tục phân nhánh

Thủ tục b. Thủ tục trên P2


§ Cận dưới là sum (giá trị từ thủ tục
§ Giả sử ở bước 2 đã rút gọn)

chọn cạnh (r,s) để phân § Cấm cạnh (r,s) bằng Cr s = ∞


§ Thực hiện thủ tục rút gọn ma
nhánh thì đặt: trận chi phí
§ Tính cận dưới:
§ P1 chứa (r,s)
sum += tổng hằng số rút gọn
§ P2 không chứa (r,s) => Tiếp tục thực hiện phân
nhánh theo nhánh này

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
3. Thủ tục phân nhánh

b. Thủ tục trên P2

¥ 0 75 10 30 6
0 ¥ 58 38 17 12
29 1 ¥ 20 0 ¥
32 83 58 ¥ 49 0
3 21 48 8 ¥ 0
0 85 ¥ 43 89 ¥

CuuDuongThanCong.com https://fb.com/tailieudientucntt
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

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thuật giải
4. Thủ tục chọn hai cạnh cuối cùng

Thủ tục Thủ tục


§ Sau khi đã chọn n-2
u v u v
cạnh, chúng ta phải p ¥ 0
p 0 ¥
chọn tiếp hai cạnh còn q 0 ¥
q ¥ 0
lại.
§ Lúc này ma trận rút gọn bậc
hai có 1 trong hai dạng:

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ minh họa

¥ 3 93 13 33 9
4 ¥ 77 42 21 16
45 17 ¥ 36 16 28
39 90 80 ¥ 56 7
28 46 88 33 ¥ 25
3 88 18 46 92 ¥

CuuDuongThanCong.com https://fb.com/tailieudientucntt
ĐS
P
(81)P1
(6,3) (81)P11
(4,6)

(129) P2 (2,1) (84)P111


(113)P12
(1,4)
(101)P112
(104)P1111
(5,1) (112)P1112

(127)P1122 (103)P1121

(1,4)

(114)P11212 (104)P11211

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập 1

¥ 27 43 16 30 26
7 ¥ 14 1 30 25
20 13 ¥ 35 5 0
21 16 25 ¥ 18 18
12 46 27 48 ¥ 5
23 5 5 9 5 ¥

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Bài tập

CuuDuongThanCong.com https://fb.com/tailieudientucntt
THAT’S ALL; THANK YOU

What NEXT?
Bài toán luồng cực đại trên mạng
CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like