Tải bản đầy đủ (.doc) (30 trang)

bài toán người du lịch lý thuyết đồ thị và ứng dụng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (221.91 KB, 30 trang )

Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
MỤC LỤC
MỤC LỤC 1
MỞ ĐẦU 1
MỞ ĐẦU
Lý thuyết đồ thị là ngành khoa học phát triển từ lâu đời nhưng lại có nhiều ứng
dụng hiện đại. Những ý tưởng cơ bản của nó đã được nhà Toán học Thụy sĩ vĩ đại
Leonhard Euler đưa ra từ thế kỷ 18. Ngày nay, lý thuyết đồ thị đã phát triển thành
Toán học có vị trí đăc biệt quan trọng về mặt lý thuyết cũng như ứng dụng, đặc biệt
là ứng dụng vào giải các bài toán tối ưu.
Bài toán Người du lịch (Travelling Salesman Problem) là một trong những bài
toán kinh điển và khó trong tin học. Có rất nhiều cách tiếp cận giải bài toán này
ngay từ khi nó mới ra đời, như sử dụng quy hoạch tuyến tính, nhánh và cận, nhưng
mới chỉ dừng lại ở các bộ dữ liệu nhỏ, không tìm được cách giải tối ưu và vẫn đang
được tiếp tục nghiên cứu và phát triển.
Với mong muốn bước đầu nghiên cứu về những bài toán tối ưu và cách giải
một số bài toán tối ưu cũng như tìm kiếm những phương pháp có thể giải tốt những
bài toán tối ưu, nhóm 5 chúng tôi đã chọn: “Bài toán người du lịch” (Traveling
salesman problem) cho đề tài nghiên cứu của môn học “Lý thuyết đồ thị và ứng
dụng”.
Đề tài gồm 2 chương xoay quanh nguyên lý bù trừ. Chương 1 nêu đại cương về
cơ sở lý thuyết của lý thuyết đồ thị, chương 2 nghiên cứu sâu về bài toán người du
lịch .

STT Họ tên Công việc
(theo mục lục)
Chữ ký Nhận xét của
giáo viên
1
2
3


4
Trần Thị Ngân
( Nhóm trưởng)
Hà Thị Thu Sương
Phạm Đức Khanh
Nguyễn Tấn Duy
Chương 1, chương 2
Chương 1, chương 2
Chương 1
Chương 1
Đề tài: Bài toán người du lịch 1 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1 CÁC KHÁI NIỆM CƠ BẢN
1.1.1. Đồ thị, đỉnh, cạnh, cung
 Định nghĩa 1.1.1.
Đồ thị vô hướng G = (V, E) gồm một tập V các đỉnh và tập E các cạnh.
Mỗi cạnh e

E được liên kết với một cặp đỉnh v, w (không kể thứ tự).
 Định nghĩa 1.1.2.
Đồ thị có hướng G = (V, E) gồm một tập V các đỉnh và tập E các cạnh có
hướng gọi là cung.
Mỗi cạnh e

E được liên kết với một cặp đỉnh (v, w) có thứ tự.
Ghi chú:
- Cạnh có hai đỉnh liên kết trùng nhau gọi là khuyên.
- Đỉnh không kề với đỉnh khác gọi là đỉnh cô lập.
 Định nghĩa 1.1.3.

Đồ thị hữu hạn là đồ thị có số cạnh (cung) hữu hạn.
 Định nghĩa 1.1.4.
Đồ thị đơn là đồ thị không có khuyên và không có cạnh song song.
 Định nghĩa 1.1.5.
Đồ thị vô hướng đủ là đồ thị mà mọi cặp đỉnh đều kề nhau.
 Định nghĩa 1.1.6.
Bậc của đỉnh v

V là tổng số cạnh liên thuộc với nó và ký hiệu là deg(v). Nếu
đỉnh có khuyên thì mỗi khuyên được tính là 2 khi tính bậc, như vậy:
deg(v):= Số cạnh + 2*Số khuyên
Từ định nghĩa suy ra đỉnh cô lập là đỉnh có bậc bằng 0.
 Định nghĩa 1.1.7.
Đỉnh treo là đỉnh có bậc bằng 1.
 Định nghĩa 1.1.8.
Cho G = (V, E) là đồ thị có hướng nửa bậc ra của đỉnh v

V, ký hiệu là deg
o
(v),
là số cung đi ra từ đỉnh v (v là đỉnh đầu) và nửa bậc vào của đỉnh v

V, ký hiệu là
deg
1
(v), là số cung đi tới đỉnh v (v là đỉnh cuối).
 Hệ quả 1.1.9.
Cho đồ thị G = (V, E). Khi đó số đỉnh bậc lẻ của đồ thị vô hướng là số chẵn.
Đề tài: Bài toán người du lịch 2 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến

 Định nghĩa 1.1.10.
Đồ thị K
n
là đồ thị đơn, đủ n đỉnh (mỗi cặp đỉnh đều có duy nhất một cạnh liên
kết).
 Định nghĩa 1.1.11.
Đồ thị lưỡng phân G = (V, E) là đồ thị mà tập các đỉnh được phân làm hai tập
rời nhau V
1
và V
2
sao cho mỗi cạnh của nó liên kết với một đỉnh thuộc V
1
và một
đỉnh thuộc V
2
, ký hiệu
G = ({V
1
,V
2
},E)
Đồ thị K
m,n
là đồ thị lưỡng phân ({V
1
,V
2
}, E) với tập V
1

có m đỉnh và tập V
2

n đỉnh và mỗi đỉnh của V
1
được nối với mỗi đỉnh của V
2
bằng một cạnh duy nhất.
1.1.2. Đường đi, chu trình, tính liên thông
 Định nghĩa 1.1.12. Cho đồ thị G = (V, E)
Dây
µ
từ đỉnh v đến w là tập hợp các đỉnh và cạnh nối tiếp nhau bắt đầu từ
đỉnh v và kết thúc tại đỉnh w. Số cạnh trên dây
µ
gọi là độ dài của dây
µ
.
Đường đi từ đỉnh v đến đỉnh w độ dài n đựợc biễu diễn như sau

µ
= (v,e
1
,v
1
,e
2
,v
2
, ,v

n-1
,e
n
, w)
trong đó v
i
(i = 1, , n-1) là các đỉnh trên đường đi và e
i
(i = 1, , n) là các cạnh trên
đường đi liên thuộc đỉnh kề trước và sau nó.
Đường đi sơ cấp : là đường đi không đi qua một đỉnh quá một lần
Vòng là dãy có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình là đường đi có đỉnh đầu và đỉnh cuối trùng nhau
Chu trình sơ cấp : là chu trình không đi qua một đỉnh quá một lần.
Dãy có hướng : trong đồ thị có hướng là dãy các đỉnh và cung nối tiếp nhau
(e
1
,e
2
,…,e
n
) thỏa mãn đỉnh cuối của cung e
i
là đỉnh đầu của cung e
i+1
,
i=1, n-1.
Đường đi có hướng trong đồ thị có hướng là dãy có hướng, trong đó các cung
không lặp lại.
Đường đi có hướng sơ cấp là đường đi có hướng không đi qua một đỉnh quá

một lần.
Vòng có hướng là dãy có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình có hướng là đường đi có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình có hướng sơ cấp là chu trình có hướng không đi qua một đỉnh quá
một lần .
Đồ thị có hướng gọi là liên thông, nếu mọi cặp đỉnh của nó đều có đường đi nối
chúng với nhau.
Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh của nó đều có đường
đi có hướng nối chúng với nhau.
Đồ thị có hướng gọi là liên thông yếu, nếu đồ thị lót (vô hướng) của nó liên
thông.
Đồ thị có hướng gọi là bán liên thông, nếu với mọi cặp đỉnh (u,v) bao giờ cũng
tồn tại đường đi có hướng từ u đến v hoặc từ v đến u.
Đề tài: Bài toán người du lịch 3 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
 Định lý 1.1.13.
• Trong đồ thị vô hướng mỗi dãy từ đỉnh v đến w chứa đường đi sơ cấp từ v đến
w
• Trong đồ thị có hướng mỗi dãy có hướng từ đỉnh v đến w chứa đường đi có
hướng sơ cấp từ v đến w.
 Định lý 1.1.14.
Đồ thị G lưỡng phân khi và chỉ khi G không chứa chu trình độ dài lẻ.
 Định nghĩa 1.1.15.
Trọng đồ (có hướng) là đồ thị (có hướng) mà mỗi cạnh (cung) của nó được gán
một số.
Trọng đồ được biễu diễn bởi G = (V, E, w), trong đó V là tập các đỉnh, E là tập
các cạnh (cung) và w: E

R là hàm số trên E, w(e) là trọng số của cạnh (cung) e với
mọi e


E.
Trong trọng đồ độ dài trọng số của đường đi
µ
là tổng các trọng số trên đường
đi đó.
 Định nghĩa 1.1.16.
Cho đồ thị G = (V, E). Đồ thị G’= (V’, E’) gọi là đồ thị con của G nếu
V’

V và E’

E.
 Định nghĩa 1.1.17.
Thành phần liên thông của đồ thị G là đồ thị con liên thông tối đại của G.
 Định lý 1.1.18.
Cho đồ thị đơn G = (V, E) với n đỉnh và k thành phần liên thông. Khi đó số
cạnh m của đồ thị thỏa bất đẳng thức

2
)1)(( +−−
≤≤−
knkn
mkn
 Hệ quả 1.1.19.
Mọi đồ thị đơn n đỉnh với số cạnh lớn hơn
2
)2)(1( −− nn
là liên thông.
 Định nghĩa 1.1.20.

Tập hợp tách cạnh của đồ thị liên thông G là tập hợp các cạnh của nó mà khi
loại bỏ chúng thì G trở thành không liên thông.
 Định nghĩa 1.1.21.
Lát cắt là tập hợp tách cách cực tiểu.
 Định nghĩa 1.1.22.
Cầu là lát cắt có duy nhất một cạnh.
1.2. BIỂU DIỄN ĐỒ THỊ
1.2.1. Ma trận kề
1.2.1.1. Đồ thị vô hướng
 Định nghĩa 1.2.1.
Đề tài: Bài toán người du lịch 4 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Cho đồ thị vô hướng G = (V, E) có n đỉnh theo thứ tự v
1
,v
2
,v
3
, ,v
n
. Ma trận kề
của đồ thị G là ma trận vuông A=
nnij
a
×
)(
, trong đó
ij
a
là số cạnh nối

i
v
với
j
v
. Lưu
ý rằng mỗi khuyên được tính là hai cạnh.
Từ định nghĩa suy ra rằng ma trận kề của đồ thị vô hướng luôn đối
xứng qua đường chéo chính.
 Định lý 1.2.2.
Cho đồ thị G = (V, E) có n đỉnh V = {v
1,
v
2,
v
3
, ,v
n
} và ma trận kề của đồ thị G
là ma trận
nnij
aA
×
= )(
. Giả sử A
k
=
nnij
c
×

)(
. Khi đó
jic
ij
≠ ,
là số các đường đi chiều
dài k từ đỉnh V
i
đến đỉnh
j
V
.
 Hệ quả 1.2.3.
Cho đồ thị G = (V, E) có n đỉnh, V={v
1
,v
2
,v
3
,…,v
n
} và ma trận kề của đồ thị G
là ma trận
nnij
aA
×
= )(
. Ký hiệu
T = A+A
2

+…+A
n-1
Khi đó ta có:
(i) Đồ thị G liên thông khi và chỉ khi các phần tử ngoài đường chéo chính của ma
trận T lớn hơn 0.
(ii) Đồ thị G có chu trình khi và chỉ khi tồn tại phần tử lớn hơn 0 trên đường chéo
chính của ma trận T.
+ Chú ý: Nếu đồ thị có hai thành phần liên thông thì có thể đánh số lại các đỉnh và
có ma trận kề dạng


A
1
0
0 A
2

1.2.1.2. Đồ thị có hướng
 Định nghĩa 1.2.4.
Cho đồ thị có hướng G = (V, E) có n đỉnh theo thứ tự v
1
,v
2
,v
3
, ,v
n
. Ma trận kề
của đồ thị G là ma trận vuông
nnij

aA
×
= )(
, trong đó
ij
a
là số cung đi từ
i
v
tới
j
v
.
 Định lý 1.2.5.
Cho đồ thị có hướng G = (V, E) có n đỉnh,V={v
1
,v
2
,v
3
, ,v
n
} và ma trận kề của
đồ thị G là ma trận
nnij
aA
×
= )(
. Giả sử A
k

=
nnij
c
×
)(
. Khi đó
ij
c
,
ji ≠
, là số các đường
đi có hướng chiều dài k từ đỉnh
i
v
đến
j
v
 Hệ quả 1.2.6.
Cho đồ thị có hướng G = (V,E) có n đỉnh, V={v
1
,v
2
,v
3
,…,v
n
} và ma trận kề
của đồ thị G là ma trận
nnij
aA

×
= )(
. Ký hiệu
T = A+A
2
+…+A
n-1
Khi đó
(i) Đồ thị G liên thông mạnh khi và chỉ khi các phần tử ngoài đường chéo chính
của ma trận T đều lớn hơn 0.
Đề tài: Bài toán người du lịch 5 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
(ii) Đồ thị G có chu trình có hướng khi và chỉ khi tồn tại phần tử lớn hơn 0 trên
đường chéo chính của ma trận T.
1.2.2. Ma trận liên thuộc
1.2.2.1. Đồ thị vô hướng
 Định nghĩa 1.2.7.
Cho đồ thị G=(V,E) có n đỉnh,V= {v
1
,v
2
,v
3
, ,v
n
} và m cạnh E={e
1
,e
2
,e

3
,…,e
m
}.
Ma trận liên thuộc của đồ thị G là ma trận A= (
nnij
a
×
)
thỏa mãn:
1, nếu đỉnh v
i
liên thuộc cạnh
j
e

ij
a
=
0, nếu đỉnh v
i
không liên thuộc cạnh
j
e
 Mệnh đề 1.2.8. Cho đồ thị đơn G = (V, E) với ma trận liên thuộc
)(
ij
a
. Khi đó
V)(

1
∈∀=

=
i
n
j
iji
vavd
.
Chú ý: Nếu đồ thị có 2 thành phần liên thông thì ta có thể đánh lại các đỉnh và
các cạnh kề có ma trận dạng
A
1
0
0 A
2

1.2.2.2.Đồ thị có hướng
 Định nghĩa 1.2.9.
Cho đồ thị có hướng G = (V, E) có n đỉnh.V={v
1
,v
2
,v
3
,…,v
n
} và m cung E={e
1

,
e
2
, e
3
,…, e
m
}. Ma trận liên thuộc của đồ thị G là ma trận A= (
nnij
a
×
)
thỏa mãn
1, nếu đỉnh v
i
là đỉnh đầu của cung e
i

ij
a
= -1, nếu đỉnh v
i
là đỉnh cuối của cung e
i
0, nếu đỉnh v
i
không kề cung e
i

1.2. ĐƯỜNG ĐI VÀ ĐỒ THỊ HAMILTON

1.2.1. Định nghĩa 1.2.9
Cho đồ thị (có hướng) G = (V, E).
Chu trình (có hướng) Hamilton là chu trình sơ cấp qua mọi đỉnh của đồ thị.
Đường đi (có hướng) Hamilton là đường đi sơ cấp qua mọi đỉnh đồ thị.
Như vậy, mọi chu trình Hamilton có độ dài bằng số đỉnh và mọi đường đi
Hamilton có độ dài bằng số đỉnh trừ 1.
Đồ thị chứa chu trình (có hướng) Hamilton gọi là đồ thị Hamilton.
1.2.2. Điều kiện cần
Giả sử đồ thị G có chu trình Hamilton C. Khi đó:
• Đồ thị G liên thông.
• Mọi đỉnh của G có bậc lớn hơn hoặc bằng 2 và có đúng hai cạnh kề thuộc
chu trình C.
Đề tài: Bài toán người du lịch 6 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
• Nếu xóa đi k đỉnh bất kỳ cùng các cạnh liên thuộc chúng thì đồ thị còn lại
sẽ có tối đa k thành phần liên thông.
1.2.3. Điều kiện đủ
 Định lý 1.2.10.
Đồ thị K
n
với n lẻ n

3 có (n-1)/2 chu trình Hamilton từng đôi một không giao
nhau.
 Định lý 1.2.11. (Dirac)
Cho G là đồ thị đơn n đỉnh (n
)3≥
. Nếu bậc deg(v)
2
n


với mọi đỉnh v của G thì
G có chu trình Hamilton.
 Định lý 1.2.13.
Cho G là đồ thị đơn n đỉnh (n

3). Nếu bậc deg(v)
2
1−

n
với mọi đỉnh v của G
thì G có đường đi Hamilton.
 Định lý 1.2.14.
Cho G là đồ thị đơn n đỉnh (n

3). Giả sử u và v là hai đỉnh không kề nhau của
G sao cho
deg(u)+deg(v)

n .
Khi đó G có chu trình Hamilton khi và chỉ khi đồ thị G+(u,v) (đồ thị G thêm
cạnh (u, v)) có chu trình Hamilton.
 Định lý 1.2.15.
Cho G là đồ thị đơn n đỉnh. Giả sử G’ và G’’ là hai đồ thị thu được từ G bằng
cách quy nạp nối tất cả cặp đỉnh không kề nhau có tổng các bậc ít nhất bằng n. Khi
đó ta có G’= G’’.
 Định nghĩa bao đóng
Bao đóng C(G) của đồ thị G n đỉnh là đồ thị thu được từ G bằng cách, theo quy
nạp, nối tất cả các cặp đỉnh không kề nhau mà tổng số bậc ít nhất bằng n cho đến khi

không còn cặp đỉnh nào như vậy nữa.
 Định lý 1.2.16.
Đồ thị G có chu trình Hamilton khi và chỉ khi bao đóng của G có chu trình
Hamilton.
 Định lý 1.2.17.
Nếu bao đóng C (G) = K
n
(n
3

) thì đồ thị G có chu trình Hamilton.
 Định lý 1.2.18. (Định lý Ore)
Cho G là đơn đồ thị n đỉnh (n

3). Nếu deg(u)+deg(v)

n với mọi cặp đỉnh
không kề nhau thì đồ thị G có chu trình Hamilton.
 Định lý 1.2.1.9.
Cho G là đơn đồ thị n đỉnh (n

3) và m cạnh. Nếu m

C(n-1,2)+2 thì đồ thị G
có chu trình Hamilton.
 Định lý 1.2.20.
Cho đồ thị G là đồ thị lưỡng phân với hai tập đỉnh V
1
và V
2

sao cho
Đề tài: Bài toán người du lịch 7 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
V
1
= V
2
= n

2
Nếu bậc deg(v)

n/2 với mọi đỉnh v của G thì G có chu trình Hamilton.
 Định lý 1.2.21.
Nếu đồ thị G là đồ thị có hướng liên thông mạnh và
deg
1
(v)

n/2 & deg
0
(v)

n/2 ,

v

G
thì G có chu trình Hamilton. .
1.2.4. Đồ thị có hướng

 Định lý 1.2.22. (Konig)
Mọi đồ thị có hướng đầy đủ đều có đường đi Hamilton.
CHƯƠNG 2 : BÀI TOÁN NGƯỜI DU LỊCH
2.1. PHÁT BIỂU BÀI TOÁN
Một người du lịch muốn đi tham quan n thành phố 1,2,…,n. Xuất phát từ một
thành phố nào đó người du lịch đi qua tất cả các thành phố, mỗi thành phố chỉ qua
đúng một lần, rồi quay về thành phố ban đầu. Hỏi nên đi theo trình tự nào để độ dài
tổng cộng các đoạn đường đi qua là ngắn nhất (khoảng cách giữa hai thành phố có
thể hiểu là cự ly thông thường hoặc thời gian cần đi hoặc chi phí của hành trình và
xem như cho trước). Trò chơi này được Hamilton nghĩ ra năm 1859. Ông biểu diễn
các thành phố và các đường đibằng đa diện đều 20 đỉnh
Xét đồ thị đủ G = (V, E), với V={1, 2, , n}, có trọng số với trọng số c
ij
= c(i,j)
có thể khác c
ji
= c(j,i). Như vậy, ta có thể xem G như là một đồ thị có hướng đầy đủ
“mạnh” theo nghĩa với mọi i, j=1, 2, , n, i≠j, luôn có (i,j), (j,i)∈E. Bài toán trở
thành tìm chu trình Hamilton có độ dài ngắn nhất trong G.
2.2. GIẢI QUYẾT BÀI TOÁN
Hiện nay, phương pháp duy nhất được biết đến đảm bảo giải quyết tối ưu TSP
trong mọi trường hợp là xét tất cả các hành trình có thể và tìm ra hành trình nào có
chi phí nhỏ nhất. Mỗi hành trình như thế là một hoán vị của 1, 2, 3, , n với n là số
thành phố, do đó số hành trình là n!. Khi n lớn, số hành trình bùng nổ quá lớn ta
không thể tìm ra lời giải cho bài toán. Nhiều phương pháp tối ưu khác nhau được
dùng để giải quyết TSP và ta sẽ tìm hiểu chúng trong các mục sau:
2.2.1. Một số phương pháp giải
Xét bài toán người du lịch. Gọi C = {c
ij
: i,j = 1,2, ,n} là ma trận chi phí.

Mỗi hành trình V = v(1)→v(2)→ →v(n-1)→v(n)→v(1) có thể viết dưới dạng
v = (v(1),v(2)), (v(2),v(3)), , (v(n-1),v(n)), (v(n),v(1)).
Trong đó mỗi thành phần (v(i-1),v(i)) gọi là một cạnh của hành trình.
Đối với bài toán người du lịch, nếu áp dụng phương pháp tham ăn thì phương
án tìm được là tốt, nhưng trong một số trường hợp chưa hẳn là phương án tối ưu.
Đối với phương pháp quy hoạch động thì không hiệu quả do số lượng bài toán con
tăng theo hàm mũ. Mặt khác, bài toán người du lịch có không gian các phương án
Đề tài: Bài toán người du lịch 8 Nhóm thực hiện: Nhóm 5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
quá lớn. Do vậy, khi áp dụng thuật toán vét cạn không đảm bảo về thời gian cũng
như kĩ thuật. Khi nghiên cứu đề tài này chúng tôi giới thiệu phương pháp đánh giá
nhánh cận. Đây là phương pháp có thể hạn chế số phương án phải duyệt của bài
toán. Trong quá trình duyệt ta luôn giữ lại 1 phương án là phương án mẫu, phương
án mẫu là phương án có giá nhỏ nhất tại thời điểm đó. Phương pháp đánh giá nhánh
cận là phương pháp tính giá của phương án ngay trong quá trình xây dựng các thành
phần của phương án, có nghĩa là ta sẽ tính xem việc xây dựng phương án theo
hướng đó có thể có thể tốt hơn phương án mẫu hay không. Nếu không tốt hơn ta lựa
chọn hướng khác. Bằng cách này ta đã hạn chế được nhiều phương án mà chắc rằng
trong đó không chứa phương án tối ưu. Một yêu cầu đặt ra là tính toán đặt nhánh cận
như thế nào, để có thể hạn chế tối đa các phương án phải duyệt.
2.2.2.Phương pháp nhánh cận
2.2.2.1.Phương pháp
Giả sử trong một tập hữu hạn các phương án của bài toán, ta phải chọn ra một
phương án tối ưu theo một tiêu chuẩn nào đó (Thí dụ làm cho hàm mục tiêu đạt giá
trị nhỏ nhất). Ta sẽ tìm cách phân chia tập phương án đang xét thành 2 tập con
không giao nhau. Một tập chứa cạnh (i,j) và tập không chứa cạnh này.
Ta gọi việc đó là phân nhánh, mỗi tập con nói trên gọi là nhánh. Việc phân
nhánh được minh họa bởi cây tìm kiếm:



Với mỗi tập con này, ta sẽ tính cận dưới (chặn dưới đủ tốt) của các giá trị hàm
mục tiêu ứng với các phương án trong đó. Mang so sánh hai cận dưới vừa tính được,
việc tìm kiếm sẽ tìm trên tập con có cận dưới nhỏ hơn, tiếp tục phân chia tập con đó
thành hai tập con khác không giao nhau, lại tính các cận dưới tương ứng Lặp lại
quá trình này thì sau một số hữu hạn bước, cuối cùng sẽ được một phương án tốt,
nói chung là tối ưu, tức là phương án của bài toán người du lịch. Sau đó ta chỉ cần
xét những tập con có cận dưới nhỏ hơn giá trị hàm mục tiêu tìm được. Việc tính cận
dưới dựa vào thủ tục rút gọn.
2.2.2.2. Cơ sở lý luận của phép toán
Đề tài: Bài toán người du lịch 9 Nhóm thực hiện: Nhóm 5
Tập tất cả hành
trình
Các hành
trình qua (i,j)
Các hành
trình không
qua (i,j)
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Nếu không xác định thành phố xuất phát thì có n! hành trình, mỗi hành trình
ứng với một hoán vị nào đó của tập {1,2,3, , n}. Còn nếu cho trước thành phố xuất
phát thì có tất cả là (n-1)! hành trình.
Giả sử v = (v(1),v(2), ,v(n),v(1)) (v là một hoán vị) là một hành trình qua các
thành phố v(1),v(2), ,v(n) theo thứ tự đó rồi quay về v(1) thì hàm mục tiêu
f(v) = C
v(1)v(2)
+ C
v(n-1)v(n)
+ C
v(n)v(1)
=


∈vji
ij
C
),(
sẽ biểu thị tổng độ dài đã đi qua theo hành trình v, trong đó (i,j) ký hiệu một chặng
đường của hành trình, tức là hai thành phố kề nhau theo hành trình v.
2.2.2.3. Ma trận rút gọn
Rõ ràng tổng chi phí của một hành trình sẽ chứa đúng một phần tử trên mỗi
dòng và mỗi cột của ma trận chi phí C = (c
ij
). Do đó nếu ta trừ bớt mỗi phần tử của
một dòng (hay một cột) đi cùng một giá trị thì chi phí của tất cả hành trình sẽ giảm
đi một lượng, vì thế hành trình tối ưu sẽ không thay đổi. Vì vậy nếu tiến hành trừ
bớt các phần tử của mỗi dòng và mỗi cột đi một hằng số sao cho thu được ma trận
không âm và mỗi cột cũng như mỗi dòng chứa ít nhất một số 0, thì tổng các hằng số
trừ đi đó sẽ cho ta cận dưới của mọi hành trình. Thủ tục trừ bớt này gọi là thủ tục rút
gọn, các hằng số trừ bớt ở mỗi dòng (cột) gọi là hằng số rút gọn dòng (cột), ma trận
thu được gọi là ma trận rút gọn.
 Thủ tục rút gọn:
Đầu vào: Ma trận chi phí C=(c
ij
)
Đầu ra: Ma trận rút gọn và tổng các hằng số rút gọn Sum.
Thuật toán:
(i) Khởi tạo:
Sum:=0;
(ii) Rút gọn dòng:
Với mỗi dòng r từ 1 đến n của ma trận C thực hiện:
- Tìm phần tử c

rj
=
α
nhỏ nhất trên dòng.
- Trừ tất cả các phần tử trên dòng đi một lượng
α
.
- Cộng dồn: Sum:=Sum+
α
(iii) Rút gọn cột:
Với mỗi cột c từ 1 đến n của ma trận C thực hiện:
- Tìm phần tử c
ie
=
α
nhỏ nhất trên cột.
- Trừ tất cả các phần tử trên cột đi một lượng
α
.
- Cộng dồn: Sum:= Sum+
α
.
Ví dụ: Cho ma trận chi phí của bài toán người du lịch với n = 6 như sau
1 2 3 4 5 6
α

1 3
2 4
3 16
4 7

Đề tài: Bài toán người du lịch 10 Nhóm thực hiện: Nhóm
5

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

Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
5 25
6 3

Ta tiến hành rút gọn ma trận này để tìm cận dưới cho mọi hành trình:
- Khởi tạo:
Đặt sum:=0;
- Rút gọn các dòng:
Các phần tử nhỏ nhất trên các dòng lần lượt theo thứ tự 1, 2, 3, 4, 5, 6 là 3, 4,
16, 7, 25, 3.
Trừ bớt các phần tử dòng 1, 2, 3, 4, 5, 6 đi các hằng số rút gọn tương ứng trên
cột ta được ma trận

1
2
3
4
5
6

α
0 0 15 8 0 0
Cộng dồn các hằng số rút gọn ta được:
Sum:=Sum+3+4+16+7+25+3=58.
- Rút gọn cột:
Các phần tử nhỏ nhất trên các cột theo thứ tự 1, 2, 3, 4, 5, 6 là 0, 0, 15, 8, 0, 0.
Trừ bớt các phần tử nhỏ nhất trên các cột theo thứ tự 1, 2, 3, 4, 5, 6 đi các hằng
số rút gọn tương ứng trên hàng ta được ma trận rút gọn.
1 2 3 4 5 6
1
2
3
4
5
6

Cộng dồn các hằng số rút gọn ta được:
Sum := Sum+0+0+15+8+0+0=58+15+8=81.
Vậy cận dưới cho tất cả hành trình là:
β
:=0+sum=81.
(nghĩa là không có hành trình có tổng chi phí nhỏ hơn 81).
2.2.2.4. Mệnh đề

Phương án tối ưu xét trên ma trận trọng số ban đầu cũng là phương án tối ưu
của bài toán xét trên ma trận rút gọn.
Đề tài: Bài toán người du lịch 11 Nhóm thực hiện: Nhóm
5

0 90 10 30 6
0

73 38 17 12
29 1

20 0 12
32 83 72

49 0
3 21 63 8

0
0 85 15 43 89


0 75 2 30 6
0

58 30 17 12
29 1

12 0 12
32 83 58


49 0
3 21 48 0

0
0 85 0 35 89

Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
2.2.2.5. Thủ tục phân nhánh
Giả sử ta chọn cạnh phân nhánh (r,s). Như vậy các hành trình sẽ được chia làm
hai tập: p
1
chứa các hành trình qua (r,s) và p
2
chứa các hành trình không qua (r,s).
+ Nhánh tập P
1
: Cận dưới
β
với giá trị xuất phát có từ thủ tục rút gọn.
- Giảm cấp ma trận chi phí C bằng cách loại dòng r và cột s.
- Ngăn cấm tạo hành trình con:
Cấm cạnh (s, r) bằng cách đặt c
sr
=

.
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ư hình sau:
→ … → … →
(i,j) (r,s) (k,h)

và cấm tất cả các cạnh dạng (h,i) bằng cách đặt c
hi
=

.
Rút gọn ma trận chi phí ta có cận dưới
β
:=
β
+(tổng hằng số rút gọn).
Ta có thể tiếp tục thủ tục phân nhánh theo nhánh này với ma trận chi phí đã
được hiệu chỉnh và giảm một bậc. Việc chọn theo cạnh nào để phân nhánh ta sẽ bàn
ở mục tiếp theo.
+ Nhánh tập P
2
:
- Cấm cạnh (r,s) bằng cách đặt c
rs
=

.
- Thực hiện thủ tục rút gọn với ma trận chi phí tương ứng và tính cận dưới
β
:=
β
+(tổng hằng số rút gọn) cho nhánh.
Ta có thể tiếp tục thủ tục phân nhánh theo nhánh này với ma trận chi phí đã
dược hiệu chỉnh cùng cận dưới tương ứng. Việc chọn cạnh nào phân nhánh ta sẽ bàn
ở mục tiếp theo.
Ví dụ: Xét tiếp ví dụ trên. Giả sử ta chọn cạnh phân nhánh là (r,s) = (6,3). Các

hành trình sẽ được phân thành hai nhánh:
P
1
chứa các hành trình qua cạnh (6,3) và P
2
chứa các hành trình không qua
cạnh (6,3).
 Xét nhánh tập P
1
:
- Giảm cấp ma trận chi phí C bằng cách loại dòng 6 và cột 3.
- Ngăn cấm tạo hành trình con:
Cấm cạnh (6,3) bằng cách đặt c
36
=

.
Ta nhận được ma trận chi phí tương ứng cùng cận dưới xuất phát
β
=81
1 2 4 5 6
1
2
3
4
5

Vì ma trận đã ở dạng rút gọn nên cận dưới vẫn giữ nguyên
β
= 81.

Đề tài: Bài toán người du lịch 12 Nhóm thực hiện: Nhóm
5

0 2 30 6
0

30 17 12
29 1 12 0

32 83

49 0
3 21 0

0
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Ta có thể tiếp tục phân nhánh theo nhánh này với ma trận chi phí đã được hiệu
chỉnh. Việc chọn cạnh nào để phân nhánh ta sẽ bàn ở mục tiếp theo.
 Nhánh tập P
2
:
- Cấm cạnh (6,3) bằng cách đặt c
63
=

.
- Thực hiện thủ tục rút gọn với ma trận chi phí tương ứng và tính cận dưới
β
:=
β

+(tổng hằng số rút gọn) cho nhánh.
1 2 3 4 5 6
1
2
3
4
5
6


α
= 48
Cột thứ 3 có giảm đi tất cả phần tử đi phần tử nhỏ nhất c
53
=48 và ta nhận được
ma trận rút gọc sau:
1 2 3 4 5 6
1
2
3
4
5
6
và cận dưới
β
=
β
+
α
= 81+48 = 129

Ta có thể tiếp tục thủ tục phân nhánh theo nhánh này với ma trận chi phí đã
được hiệu chỉnh cùng cận dưới tương ứng (129). Việc chọn cạnh nào để phân nhánh
ta sẽ bàn ở mục tiếp theo.
2.2.2.6 Thủ tục chọn cạnh phân nhánh
+ Một cách lôgic là ta chọn cạnh phân nhánh (r,s) sao cho cận dưới của nhánh
không chứa (r,s) sẽ tăng nhiều nhất.
Thủ tục chọn cạnh phân nhánh (r,s).
Đầu vào: Ma trận rút gọn bậc k
Đầu ra: Cạnh phân nhánh (r,s)
Thuật toán:
(i) Khởi tạo:
α
:=-

;
(ii) Với mỗi cặp (i,j) thỏa c
ij
=0 (i=1, ,k; j=1, ,k) thực hiện:
- Xác định
minr = min{c
ih
: h

j}
mins = min{c
hj
: h

i}
Đề tài: Bài toán người du lịch 13 Nhóm thực hiện: Nhóm

5

0 75 2 30 6
0

58 30 17 12
29 1

12 0 12
32 83 58

49 0
3 21 48 0

0
0 85

35 89


0 75 2 30 6
0

58 30 17 12
29 1

12 0 12
32 83 58

49 0

3 21 48 0

0
0 85

35 89

Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
- Nếu
α
< minr+mins, đặt

α
:= minr+mins; r:=i; s:=j;
Ví dụ: Xét tiếp ví dụ trên. Ta đi theo nhánh P
1
, qua cạnh (6,3). Cận dưới
β
=81 và
ma trận chi phí tương ứng như sau:
1 2 4 5 6
1
2
3
4
5

- Đặt
α
:= -


.
- Xét các cặp (i,j) có c
ij
=0.
Cặp (1,2):minr=2; mins=1;

α
:= -

<minr + mins =3 →
α
:=3; r:=1; s:=2;
Cặp (2,1): minr=12; mins:=3;

α
:= 3<minr + mins =15→
α
:=15; r:=2; s:=1;
Cặp (3,5) : minr=1; mins=17;

α
:= 15<minr + mins =18 →
α
:=18; r:=3; s:=5;
Cặp (4,6) : minr=32; mins=0;

α
:= 18<minr + mins =32 →
α

:=32; r:=4; s:=6;
Các cặp (5,4) và (5,6) có tổng minr+mins<
α
, cho nên không làm thay
đổi
α
và (r,s).
Kết quả ta chọn được cạnh phân nhánh là (4,6).
Tập hành trình P
1
sẽ được phân thành hai nhánh:
P
11
gồm các hành trình qua cạnh (4,6) và
P
12
gồm các hành trình không qua cạnh (4,6).
 Nhánh P
12
: có ma trận chi phí tương ứng như sau
1 2 4 5 6
1
2
3
4 32
5
α
Thực hiện thủ tục rút gọn ta được ma trận rút gọn
1 2 4 5 6
1

2
3
4
Đề tài: Bài toán người du lịch 14 Nhóm thực hiện: Nhóm
5

0 2 30 6
0

30 17 12
29 1 12 0

32 83

49 0
3 21 0

0

0 2 30 6
0

30 17 12
29 1 12 0

32 83

49

3 21 0


0

0 2 30 6
0

30 17 12
29 1 12 0

0 51

17

3 21 0

0
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
5

Với tổng hằng số rút gọn
α
= 32 và cận dưới
β
=
β
+
α
=81+32=113.
 Nhánh P
11

:
- Loại hàng 4 và cột 6 ta sẽ có ma trận chi phí cấp 4 tương ứng:
1 2 4 5
1
2
3

5

- Cấm tạo chu trình con:
Cạnh (6,3) chọn trước kế tiếp sau cạnh (4,6)
→ →
(4,6) (6,3)
Trong bước này ta cấm cạnh (3,4), bằng cách đặt c
34
=

. Ta nhận được ma trận
1 2 4 5
1
2
3

5

Ma trận chi phí đã ở dạng rút gọn nên cận dưới
β
giữ nguyên
β
=81.

Bây giờ ta tiếp tục thủ tục chọn cạnh phân nhánh, phân nhánh và rút gọn đối
với P
11
. Thực hiện thủ tục chọn cạnh phân nhánh, ta chọn được cạnh phân nhánh
(2,1) và tổng hằng số rút gọn tương ứng là 17+3=20.
Tập P
12
gồm các hành trình trong P
11
qua cạnh (2,1) sẽ có ma trận chi phí cấp 3
tương ứng, sau khi đã loại hàng 2 và cột 1:
2 4 5
1

3

5
- Ngăn cấm chu trình con:
Đặt c
12
=

để cấm cạnh (1,2).
Cạnh (2,1) không nối tiếp cùng các cạnh chọn trước là (6,3) và (4,6), nên ta
không phải cấm các cạnh khác. Ta có ma trận chi phí.
Đề tài: Bài toán người du lịch 15 Nhóm thực hiện: Nhóm
5

0 2 30
0


30 17
29 1 12 0

3 21 0



0 2 30
0

30 17
29 1

0

3 21 0


0 2 30

1

0

21 0


Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
2 4 5

1

3

5
1
α

Ma trận chi phí được rút gọn như sau:
2 4 5
1

3

5
Cận dưới
β
=
β
+
α
= 81+3 = 84.
Tương tự ta tiếp tục thủ tục chọn cạnh phân nhánh, phân nhánh và rút gọn đối
với P
111
.
Chọn cạnh phân nhánh (1,4), tổng hằng số rút gọn tương ứng là 28+0=28.
Tập P
1112
gồm các hành trình trong P

111
không qua (1,4) sẽ có cận dưới là
β
=
β
+28 = 84 + 28 = 112.
Tập P
1111
gồm các hành trình trong P
111
qua (1, 4) sẽ có ma trận chi phí cấp 2
tương ứng:
2 5

3

5
20
α
Cạnh (1,4) nối tiếp cùng các cạnh chọn trước là (6,3), (4,6) và (2,1) thành dãy
(2,1), (1,4), (4,6), (6,3)
nên ta phải cấm cạnh (3,2), bằng cách đặt c
32
=

.
Rút gọn ma trận này ta được ma trận rút gọn.
2 5

3


5
và cận dưới
β
=
β
+
α
=84+20=104.
2.2.2.7. Chọn 2 cạnh cuối cùng
Đề tài: Bài toán người du lịch 16 Nhóm thực hiện: Nhóm
5


2 30

1

0

21 0




0 28

0

0


20 0





0

20





0

0


Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Mỗi hành trình có n cạnh. Sau khi đã chọn n-2 cạnh, ta phải chọn nốt 2 cạnh
còn lại. Lúc này ma trận rút gọn có bậc 2 và là một trong hai dạng sau:
(i) (ii)
u v u v
p p
q q
cùng cận dưới
β


Trong trường hợp (i) ta chọn hai cạnh (p,u) và (q,v), còn trong trường hợp (ii)
ta chọn hai cạnh (p,v) và (q,u). Tổng chi phí là
β
.
Thuật toán:
Nếu C[1,1]=

sau đó
Kết nạp cạnh (p,u) và (q,v)
Ngược lại
Kết nạp cạnh (p,v) và (q,u)
Ví dụ: Xét tiếp ví dụ trên. Sau khi chọn các cạnh (6,3), (4,6), (2,1), (1,4) ta có ma
trận rút gọn
2 5

3

5
và cận dưới
β
=104. Ta chọn nốt hai cạnh còn lại là (3,5) và (5,2) và được hành
trình (1,4),(4,6),(3,5),(5,2),(2,1) với tổng chi phí bằng
β
=104.
Quá trình trên có thể biểu diễn bằng sơ đồ sau:
Cận dưới Cận dưới
β
= P
β
=

81 P
2
129


P
1

81 P
12
113
P
11
81 P
112
101
P
111
Đề tài: Bài toán người du lịch 17 Nhóm thực hiện: Nhóm
5
0



0


0
0






0

0


Tất cả hành
trình
Hành trình
chứa (6,3)
Hành trình
chứa (4,6)
Hành trình
không chứa
(6,3)
Hành trình
không chứa
(4,6)
Hành trình
không chứa
(2,1)
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
P
1112
84 112
P
1111


P
1111
104
Chọn tiếp hai cạnh còn lại ta có hành trình:
P = (1,4),(4,6),(6,3),(3,5),(5,2),(2,1) và chi phí c
p
=104
Qua sơ đồ trên ta thấy các nhánh P
2
, P
12
, P
1112
có cận dưới lớn hơn c
p
=104, vì
thế các hành trình của các nhánh đó có tổng chi phí lớn hơn c
p
. Chỉ có nhánh P
112

cận dưới là 101 nhỏ hơn c
p
. Tiếp theo ta tìm hành trình mới theo nhánh này.
 Nhánh P
112
sẽ có ma trận chi phí cấp 4 tương ứng:
1 2 4 5
1

2 17
3

5 5
3
α
Ở đây c
21
=

để cấm cạnh (2,1). Cận dưới xuất phát của P
11

β
= 81.
Rút gọn ma trận chi phí ta được ma trận.
1 2 4 5
1
2
3

5
với cận dưới
β
=
β
+
α
= 81+20 = 101.
Chọn (5,1) làm cạnh phân nhánh. Nhánh P

1122
gồm các hành trình không qua
cạnh (5,1) có cận dưới bằng 101+26 = 127 > 104 = c
p
. Ta loại không xét nhánh này
nữa.
 Nhánh P
1121
gồm các hành trình qua cạnh (5,1) có ma trận chi phí
2 4 5
1
2
3

Đề tài: Bài toán người du lịch 18 Nhóm thực hiện: Nhóm
5
Hành trình
chứa (1,4)
Hành trình
chứa (2,1)
Hành trình
không chứa
(1,4)

0 2 30



30 17
29 1


0

3 21 0



0 2 30



13 0
26 1

0

0 21 0


0 2 30


13 0
1




Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
2

α
(c
15
=

để cấm cạnh (1,5)).
Rút gọn ma trận chi phí ta có ma trận rút gọn
2 4 5
1
2
3
với cận dưới
β
=
β
+
α
= 101+2 = 103.
Chọn (1,4) làm cạnh phân nhánh. Nhánh P
11212
gồm các hành trình không
qua cạnh (1,4) có cận dưới bằng 103+11 = 114 > 104 = c
p
. Ta loại không xét
nhánh này nữa.
 Nhánh P
11211
gồm các hành trình qua cạnh (1,4) có ma trận chi phí

2 5

2
3 1

α

Cạnh (1,4) cùng với các cạnh đã chọn tạo thành dãy
(5,1),(1,4),(4,6),(6,3)
vì thế ta cấm cạnh (3,5), bằng cách đặt c
35
=

. Rút gọn ta được ma trận
2 5
2
3
và cận dưới
β
=103+1=104.
Chọn tiếp 2 cạnh còn lại (3,2) và (2,5) ta được hành trình (5,1),(1,4),(4,6),(6,3),
(3,2),(2,5) với tổng chi phí là 104.
 Kết luận : Hai hành trình tìm được là tối ưu với chi phí thất nhất là 104:
(1,4),(4,6),(6,3),(3,5),(5,2),(2,1) và (1,4),(4,6),(6,3),(3,2),(2,5),(5,1)
2.2.2.8. Tính chất tối ưu
Quá trình phân nhánh, tính cận, ngăn chặn hành trình con, rút gọn ma trận
phải thực hiện cho đến khi nào có đủ n ô chọn để kiến thiết một hành trình
Hamilton, nói cách khác là cho đến khi trên cây phân nhánh đã xuất hiện một đỉnh
chỉ biểu diễn một hành trình duy nhất và đã xóa hết được mọi dòng mọi cột trong
bảng. Cận dưới của đỉnh cuối cùng này chính là độ dài của hành trình vừa kiến thiết.
a) Nếu cận dưới của đỉnh này không lớn hơn các cận dưới của mọi đỉnh treo
trên cây phân nhánh thì hành trình đó là tối ưu.

b) Nếu trái lại thì phải xuất phát từ đỉnh treo nào có cận dưới nhỏ hơn để
phân nhánh tiếp tục và kiểm tra xem điều kiện a) có thỏa mãn không.
2.3.CÀI ĐẶT CHƯƠNG TRÌNH
Đề tài: Bài toán người du lịch 19 Nhóm thực hiện: Nhóm
5
0 0 30


11 0
1






0
1




0
0


Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
2.3.1. Đầu vào
Đầu vào là ma trận chi phí kích thước n.
Ví dụ: Đầu vào là ma trận chi phí với số đỉnh là n = 6 như sau.

6
999 3 93 13 33 9
4 999 77 42 21 16
45 17 999 36 16 28
39 90 80 999 56 7
28 46 88 33 999 25
3 88 18 46 92 999
2.3.2. Đầu ra
Minh họa bằng đồ họa
1. Hành trình tối ưu cho bài toán người du lịch bắt đầu từ đỉnh 1.
2. Tổng chi phí của hành trình tối ưu.
Ví dụ: Với ma trận chi phí cho như ở mục 3.1 thì đầu ra là
1 4 6 3 5 2 1
Với tổng chi phí thấp nhất là: 104
2.3.3. Chương trình cài đặt thuật toán nhánh cận cho Bài toán người du lịch
theo ngôn ngữ lập trình Pascal
Program Traveling_Salesman_Problem;
Uses Crt,Graph;
Const Maxvar = 50;
Type Arrn = Array [1 Maxvar] Of Integer;
Arrnn= Array [1 Maxvar,1 Maxvar] Of Integer;
Diem = Record
Hd,Td:Integer;
End;
Var N : Integer;
Oo : Integer;
Inf : Integer;
C : Arrnn;
Route : Arrn;
Mincost : Integer;

F,G : Text;
Gd,Gm :Integer;
B: Array[1 Maxvar] Of Diem;
{***********************************}
Procedure Input (Var N : Integer;
Var Inf : Integer;
Var C : Arrnn);
Var I,J,L,K :Integer; S:String[6];
Đề tài: Bài toán người du lịch 20 Nhóm thực hiện: Nhóm
5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Begin
Assign(F,'Travel.Inp'); Reset(F);
Readln(F,N);
Str(N,S);
Settextstyle(3,0,1);
Outtextxy(5,20,S);
Inf := 9999;
L:=-40;
K:=50;
For I := 1 To N Do
Begin
For J := 1 To N Do
Begin
Read(F,C[I,J]);
Str(C[I,J],S);
L:=L+45;
K:=K;
Outtextxy(L,K,S);
If J=N Then Begin

K:=K+30;
L:=-40;
End;
End;
Readln(F);
End;
Close(F);
Setcolor(White);
Settextstyle(1,0,2);
Outtextxy(25,K,'< Ma Tran Chi Phi >');
Settextstyle(0,0,1);
Setcolor(Yellow);
Outtextxy(25,K+40,'< Nhan Enter De Thay Duong Di >');
End;
{********************************}
Procedure Babtsp(
N,Inf :Integer;
Var C :Arrnn;
Var Route :Arrn;
Var Mincost:Integer);
Var Backptr,Best,Col,Fwdptr,Row:Arrn;
Đề tài: Bài toán người du lịch 21 Nhóm thực hiện: Nhóm
5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
I,Index :Integer;
Procedure Explore(Edges,Cost:Integer;Var Row,Col:Arrn);
Var Avoid,S,Colrowval,First,I,J,
Last,Lowerbound,Most,R,Size :Integer;
Colred,Newcol,Newrow,Rowred :Arrn;
Function Min(I,J:Integer):Integer;

Begin
If I <= J Then Min:=I Else Min :=J
End; { Min }
{Thu Tuc Rut Gon }
Function Reduce(Var Row,Col,Rowred,Colred:Arrn):Integer;
Var I,J,Sum,Temp:Integer;
Begin
Sum:=0;
For I:=1 To Size Do
Begin { Reduce Rows }
Temp:=Oo;
For J:=1 To Size Do Temp:=Min(Temp,C[Row[I],Col[J]]);
If Temp > 0 Then
Begin
For J:=1 To Size Do
If C[Row[I],Col[J]] < Inf Then
C[Row[I],Col[J]]:=C[Row[I],Col[J]]-Temp;
Sum:=Sum+Temp
End;
Rowred[I]:=Temp
End; { For I }
For J:=1 To Size Do
Begin { Reduce Columns }
Temp:=Inf;
For I:=1 To Size Do Temp:=Min(Temp,C[Row[I],Col[J]]);
If Temp > 0 Then
Begin
For I:=1 To Size Do
If C[Row[I],Col[J]] < Inf Then
C[Row[I],Col[J]]:=C[Row[I],Col[J]]-Temp;

Sum:=Sum+Temp
End;
Colred[J]:=Temp
Đề tài: Bài toán người du lịch 22 Nhóm thực hiện: Nhóm
5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
End; { For J }
Reduce:=Sum
End; { Reduce }
{*****************************************************}
{Thu Tuc Phan Nhanh}
Procedure Bestedge(Var R,S,Most:Integer);
Var I,J,K,Mincolelt,Minrowelt,Zeroes:Integer;
Begin
Most:=-Inf;
For I:=1 To Size Do
For J:=1 To Size Do
If C[Row[I],Col[J]] = 0 Then
Begin
Minrowelt:=Inf; Zeroes:=0;
For K:=1 To Size Do
If C[Row[I],Col[K]] = 0 Then Zeroes:=Zeroes+1
Else Minrowelt:=Min(Minrowelt,C[Row[I],Col[K]]);
If Zeroes > 1 Then Minrowelt:=0;
Mincolelt:=Inf;
Zeroes:=0;
For K:=1 To Size Do
If C[Row[K],Col[J]] = 0 Then Zeroes:=Zeroes+1
Else Mincolelt:=Min(Mincolelt,C[Row[K],Col[J]]);
If Zeroes > 1 Then Mincolelt:=0;

If (Minrowelt+Mincolelt) > Most Then
Begin
Most:=Minrowelt+Mincolelt;
R:=I;{Chi So Dong Cua Canh Tot Nhat}
S:=J;{Chi So Cot Cua Canh Tot Nhat}
End;
End; { If W[Row[I],Col[J]] = 0, For J, I }
End; { Bestedge }
{******************************************************}
Begin { Body Of Explore }
Size:=N-Edges;
Cost:=Cost+Reduce(Row,Col,Rowred,Colred);
If Cost < Mincost Then
If Edges = (N-2) Then
Begin { Bo Sung Not Hai Canh Con Lai}
For I:=1 To N Do Best[I]:=Fwdptr[I];
If C[Row[1],Col[1]] = Inf Then Avoid:=1
Đề tài: Bài toán người du lịch 23 Nhóm thực hiện: Nhóm
5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Else Avoid:=2;
Best[Row[1]]:=Col[3-Avoid];
Best[Row[2]]:=Col[Avoid];
Mincost:=Cost
{Ghi Nhan Hanh Trinh Tot Nhat}
End { If Edges = (N-2) }
Else
Begin
Bestedge(R,S,Most);
Lowerbound:=Cost+Most;

{Ngan Cam Tao Hanh Trinh Con}
Fwdptr[Row[R]]:=Col[S]; Backptr[Col[S]]:=Row[R];
Last:=Col[S]; { Prevent Cycles }
While Fwdptr[Last] <> 0 Do Last:=Fwdptr[Last];
First:=Row[R];
While Backptr[First] <> 0 Do First:=Backptr[First];
Colrowval:=C[Last,First];
For I:=1 To R-1 Do Newrow[I]:=Row[I]; { Remove Row }
For I:=R To Size-1 Do Newrow[I]:=Row[I+1];
For I:=1 To S-1 Do Newcol[I]:=Col[I]; { Remove Col }
C[Last,First]:=Inf;
For I:=S To Size-1 Do Newcol[I]:=Col[I+1];
Explore(Edges+1,Cost,Newrow,Newcol);(*Di Theo Nhanh Trai*)
C[Last,First]:=Colrowval;
Backptr[Col[S]]:=0; Fwdptr[Row[R]]:=0;
If Lowerbound < Mincost Then
Begin (*Di Theo Nhanh Phai*)
C[Row[R],Col[S]]:=Inf;
Explore(Edges,Cost,Row,Col);
C[Row[R],Col[S]]:=0
End
End; { Else: Edges < N-2 }
(*Khoi Phuc Ma Tran*)
For I:=1 To Size Do
For J:=1 To Size Do
C[Row[I],Col[J]]:=C[Row[I],Col[J]]+Rowred[I]+Colred[J]
End; { Explore }
Begin { Main Body}
For I:=1 To N Do
Begin

Đề tài: Bài toán người du lịch 24 Nhóm thực hiện: Nhóm
5
Lý thuyết đồ thị và ứng dụng GVHD: PGS.TSKH Trần Quốc Chiến
Row[I]:=I; Col[I]:=I;
Fwdptr[I]:=0; Backptr[I]:=0
End;
Mincost:=Inf;
Explore(0,0,Row,Col);
Index:=1;
For I:=1 To N Do
Begin
Route[I]:=Index;
Index:=Best[Index];
End;
End; { Babtsp }
{********************************************}
Procedure Initgraphh;
Begin
Gd:=Detect;
Initgraph(Gd,Gm,'Bgi');
If Graphresult<>Grok Then
Begin
Writeln('Kiem Tra Loi Duong Dan');
Readln;
Halt(1);
End;
End;
{*************************************************}
Procedure Begingraph( X,Y:Integer);
Var

I,J,Xx,Yy:Integer;
G:Real;
S:String[2];
Begin
G:=0;
Setcolor(Lightgreen);
Settextstyle(0,0,3);
Outtextxy(75,10,'Chuong Trinh Minh Hoa');
For I:=1 To N Do
Begin
G:=2*(I-1)*(Pi/N);
Settextstyle(3,0,2);
Str(I,S);
B[I].Hd:=Round(X+(Y-50)*Cos(G));
Đề tài: Bài toán người du lịch 25 Nhóm thực hiện: Nhóm
5

×