Liệt kê tất cả các hoán vị của n số nguyên dương đầu tiên.. Tìm hành trình của ngựa, bắt đầu từ ô đi qua tất cả các ô của bàn cờ, mỗi ô đúng một lần.. Liệt kê tất cả các ha trình ngắn
Trang 1Đường đi ngắn nhất tìm được là 4 ← 6 ← 5 ← 1 , có chiều dài là 3
ợc biểu diễn bằng ma trận kề a= (auv)nxn
∈
= 1;(u,v) E;
a
mảng Thuật toán được cài đặt như sau :
queue[cuoiQ] = s;
axet[s] = 1;
for ( j = 1; j <= n; j++)
if( a[u][j] == 1 && !Daxet[j] )
1
6
Tìm đường đi từ đỉnh (1) đến đỉnh (4) : A(0) = {1};
A(1) = {2,3,5}
A(2) = {6}
A(3) = {4}
c) Cài đặt
Trong thuật toán BFS, đỉnh được thăm càng sớm sẽ càng sớm trở thành duyệt xong, nên các đỉnh được thăm sẽ được lưu trử trong hàng đợi queue Một đỉnh sẽ trở thành duyệt xong ngay sau khi ta xét xong tất cả các đỉnh kề của nó
axet[ ] để đánh dấu các đỉnh được thăm, mảng
Ta dùng một mảng logic D này được khởi động bằng 0 tất cả để chỉ rằng lúc đầu chưa đỉnh nào được thăm
Một mảng truoc[ ] để lưu trử các đỉnh nằm trên đường đi ngắn nhất cần tìm (nếu có), với ý nghĩa Truoc[i] là đỉnh đứng trước đỉnh i trong đường đi Mảng Truoc[ ] được khởi động bằng 0 tất cả để chỉ rằng lúc đầu chưa có đỉnh nào
Đồ thị G đư trong đó :
⎩0;(u,v)∉ ;E uv
Hàng đợi queue ta cài đặt bằng
⎨
⎧
BFS(s) ≡
int u, j, dauQ = 1, cuoiQ = 1;
D while ( dauQ <= cuoiQ) {
u = queue[dauQ];
dauQ++;
{ cuoiQ++;
Trang 2queue[cuoiQ] = j;
}
ấy mỗi lần gọi DFS(s), BFS(s) thì mọi đỉnh cùng thành phần
g với s sẽ được thăm, nên sau khi thực hiện hàm trên thì :
p2 = Truoc[p1] ← … ← s
BÀI TẬP
}
Nhận xét :
Ta có thể th liên thôn
• Truoc[t] == 0 : có nghỉa là không tồn tại đường đi từ s đến t,
• Ngược lại, có đường đi từ s đến t Khi đó lời giải được cho bởi :
t ← p1 = Truoc[t] ←
Bài 1:
Cài đặt các thuật toán :
1 Liệt kê tất cả các dãy nhị phân độ dài n
2 Liệt kê tất cả các hoán vị của n số nguyên dương đầu tiên
3 Liệt kê tất cả các tổ hợp chặp k trong tập gồm n số nguyen dương đầu tiên
ài toán ngựa đi tuần
øi toán n hậu
ài 2
4 Giải b
5 Giải ba
6 DFS
7 BFS
c số đôi một khác nhau
Bài
Cho dãy a = (a , a1 2, , an ) gồm cá
1 Liệt kê tất cả các hoán vị của dãy n phần tử của a
2 ie kê tất cả các tổ hợp chặp k trong tập gồm n phần tử củ
3 :
Giả sử ổ khóa có n công tắc Mỗi công tắc có một trong 2 trạng thái “đóng” hay “mở” Khóa mở được nếu có ít nhất [n/2] công tắc có trạng thái mở
Liệt kê tất cả các cách mở khóa
Bài 4 ( Ngựa đi tuần )
Cho bàn cờ n x n ô Một con ngựa được phép đi theo luật cờ vua
Tìm hành trình của ngựa, bắt đầu từ ô <x0, y0 > đi qua tất cả các ô của bàn cờ, mỗi ô đúng một lần
Liệt kê tất cả các hành trình
Bài 5 :
Cho bàn cờ n x n ô Một con ngựa được phép đi theo luật cờ vua
Trang 3Tìm 1 >, mỗi ô trong hành trình ngựa đ
1 Liệt kê tất cả các ha
trình ngắn nhất ( có số ô trong hành trình ít nhất )
Bài
hành trình của ngựa, bắt đầu từ ô <x0, y0 > , ô kết thúc <x1, y
i qua đúng một lần
ønh trình
2 Chỉ ra hành
6 ( Ngựa đi tuần )
Cho bàn cờ n x n ô Một con ngựa được phép đi theo luật cờ tướng
Tìm hành trình của ngựa, bắt đầu từ ô <x0, y0 > đi qua tất cả các ô của bàn cờ, mỗi ô đúng một lần
Liệt kê tất cả các hành trình
Bài 7 :
Một người du lịch muốn tham quan n thành phố T1, T2, , Tn Xuất phát từ một thành phố nào đó, người du lịch muốn đi qua tất cả các thành phố còn lại, mỗi
á Tj thỏa yêu cầu bài toán (nếu có) sao cho có chi phí ít nhất
ài 8
thành phố đi qua đúng một lần rồi quay trở lại thành phố xuất phát
Gọi Cij là chi phí đi từ thành phố Ti đến thành phố Tj
1 Liệt kê tất cả các hành trình đi từ thành phố Ti đến thành phố Tj thỏa yêu cầu bài toán và chi phí tương ứng
2 Chỉ ra hành trình đi từ thành phố Ti đến thành pho
ấp n, các phần tử của ma trận là các số tự nhiên
Ta nói ro ma trận là một ï cắt xuất phát từ một
ùi, rẽ
o trước :
1 Tìm
dãy số không giảm
ài 9
Cho một ma trận vuông c đường đi t ng đường gấp khúc không tư
ô nào đó của ma trận, sau đó có thể đi theo các hướng : lên trên, xuống dươ trái, rẽ phải Độ dài của đường đi là số ô nằm trong đường đi
Với ô xuất phát ch một đường đi dài nhất trong ma trận, theo nghĩa có nhiều ô nhất trong đường
đi
đường đi dài nhất trong ma trận sao cho các ô trên đường đi l
B :
ôn có trọng số, trong đó V= {1, , n}
Cho G = (V,E) là một đơn đồ thị, kh g là tập đỉnh, E là tập cạnh ( hay cung)
1 Xác định số thành phần liên thông của G
2 Xuất các đỉnh nằm trong trong mỗi thành phần liên thông
Bài 10 :
mo mảnh đất hình vuông, ta chia thành n x n ô, mỗi ô ta ghi một số là
0 hoặc 1 Ô mang số 0 ta đào ao, mang số 1 ta trồng cỏ Hai ô trồng cỏ có cạnh liền Trên ät nhau được xem là cùng nằm trong bồn cỏ Hãy xác định diện tích của bồn cỏ lớn nhất ( theo nghĩa có số ô nhiều nhất )
Trang 4Bài 11 :
Cho 3 ký tự A, B, C và n là một số nguyên dương
Liệt ỗi tạo ra từ 3 ký tự trên, với chiều dài n
ø 3 ký tự trên, với chiều dài n, thỏa điều kiện ên tiếp nào giống nhau
á ký tự B là ít nhất
1 kê tất cả các chu
2 Liệt kê tất cả các chuỗi tạo ra tư
không có 2 chuỗi con li
3 Chỉ ra chuỗi thỏa (1) , (2) và sao cho so
Bài 12 :
Giả sử ⊂ N , có n A * phần tử Cho S ∈ N*
⎭
⎬
⎫ Xác định :
⎩
⎨
= x
D ⎧( 1,L,x ∈ =∑ ∈ ∀ =
=
n i A a a x S
n
i i i n
1
Bài 13 :
Cho n xâu ký tự khác rổng a1, a2, ,an , và một xâu ký tự S Tìm cách biểu
âu ai có thể không xuất hiện nhiều lần
Liệt kê tất cả
ài 14
diễn S qua các xâu ai, dưới dạng ghép xâu, mỗi xa
trong S, hoặc xuất hiện trong S
cách cách biểu diễn
Bài 15
Có n đồ vật, mỗi vật i đặc trưng bởi trọng lượng Wi và giá trị sử dụng Vi, với mọi i ∈ {1, ,n}
Cần chọn các vật này đặt vào một chiếc túi xách có giới hạn trọng lượng m, sao cho tổng giá trị sử dụng các vật được chọn là lớn nhất
:
ay trong mạng giao thông hàng không
một hãng hàng không, giả sử mỗi tuyến bay xác định bởi các thành phần :
øng bay có chiều dài ngắn nhất
Xét bài toán tìm đường b Trong cơ sở dữ liệu các tuyến bay của
- Thành phố xuất phát
- Thành phố đích
- Chiều dài đường bay Với thành phố xuất phát và thành phố đich cho trước
1 Liệt kê tất cả các đường bay
2 Chỉ ra đươ
Trang 5CHƯƠNG 4: PHƯƠNG PHÁP NHÁNH CẬN
(Branch And Bound) ầu
I Mở đ
1 Ý tưởng
Phương pháp quay lui, vét cạn có thể giải các bài toán tối ưu, bằng cách lựa
trong tất cả các lời giải tìm được Nhưng nhiều bài toán hông nên áp dụng phương pháp pháp quay lui khó
thuật Cho nên ta cần phải cải tiến thuật toán
cải tiến, trong đó
của phương pháp quay lui, dùng để như sau :
ng án mẫu ( có thể xem là lời
ù giá nhỏ nhất tại thời điểm đó ) Đánh giá nhánh
a xây dựng có thể tốt hơn phương án mẫu ọn ớng khác
chọn phương án tối ưu
k gian các lời giải là quá lớn,
đảm ba về thûo ời gian cũng như kỹ
quay lui để hạn chế bớt việc duyệt các phương án Có nhiều cách
có phương pháp nhánh cận
Phương pháp nhánh cận là một cải tiến tìm lời giải tối ưu của bài toán Ý tưởng chính của nó
Trong quá trình duyệt ta luôn giữ lại một phươ giải tối ưu cục bộ – chẳng hạn co
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 theo hướng đang
hay không Nếu không ta lựa ch theo hư
2 Mô hình
Giả sử ài toá Tìm Min{f(x) : x ∈ D};
=1
i
b n tối ưu cho là : Với X = ⎨⎧a=(a , ,a )∈∏A :P(x)⎬⎫
n i n
L ; A i <∞;∀i=1,n
hất tre
c ân ∏n
=
:x = (x1, ,xn) quá trình liệt kê the phương pháp quay lui, ta xây dựng dần các
ộ
i i A
1
Nghiệm của bài toán nếu có sẽ được biểu diễn dưới dạng
thành phần của nghiệm
Một bộ phận i thành phần (x1, , xi) sẽ gọi là một lời giải (phương án) b phận cấp i Ta gọi Xi là tập các lời giải bộ phận cấp i, ∀i=1,n
Đánh giá cận là tìm một hàm g xác định trên các Xi sao cho :
} , 1 , ,
) , , ( : ) ( { )
, , (x1 x Min f a a a1 a X x a i i
hơn giá trị của các phương án mở rộng từ lời giải bộ phận
au khi tìm được hàm đánh giá cận g, ta dùng g để giảm bớt chi phí duyệt các phương án theo phương pháp quay lui
hương án mẫu), còn f* là giá trị tốt nha
i i n
i
Bất đẳng thức này có nghĩa là giá trị g(x1,L,x i)không lớn
) , , (x1 L x i S
Giả sử x* là lời giải tốt nhất hiện có (p
át tương ứng f* = f(x*)
Nếu g(x1,L,x i) > f* thì : f* < g(x1,L,x i)≤Min{f(a):a=(a1,L,a n)∈X,x i =a i,∀i=1,i}
Trang 6Nên chắc rằng các lời giải mở rộng từ sẽ không tốt hơn phương
lời giải øi to
ại thành thủ tục nhánh cận như sau :
Ghi nhận trạng thái mới;
(i == n)
hật lời giải tối ưu ;
se
;
kiếm theo chiều sâu trên cây
ù một điều là khi tìm được xi
ta cắt bỏ các nhánh con từ xi đi xuống, mà ùnh giá cận như thế nào ?
) , , (x1 L x i
, do đó có thể bỏ đi không cần phát tr (x1,L,x i) tối ưu của ba án
Thủ tục quay lui sửa l Try (i) ≡
for (j = 1 → n)
if( Chấp nhận được ) {
Xác định xi theo j;
if
Cập n el
{ Xác định cận g(x1,L,x i)
if(g(x1,L,x i) ≤ f* )
} // Trả bài toán về trạng thái cũ }
Thực chất của phương pháp nhánh cận là tìm liệt kê lời giải như phương pháp quay lui, chỉ khác co
mà đánh giá cận g(x1,L,x i)> f* thì
quay lên ngay cha của nó là xi-1
đa Vấn đề là xác định hàm
1 Bài toán
Một nguời du lịch muốn tham quan n thành phố T1, , Tn Xuất phát từ một ành ố nào đó, n ua tất cả các thành phố còn lại, mỗi
ïi thành phố xuất phát
í đi từ thành phố Ti đến Tj Hãy tìm một hành trình thỏa yêu sao cho chi phí là nhỏ nhất
2 Ý tưởng
th ph gười du lịch muốn đi q
thành phố đi qua đúng 1 lần rối quay trở la
Gọi Cij là chi ph
cầu bài toán
hoán vị của {1, , n} thì một ành trình thỏ yêu cầu bài toán có π(1) → π(2) → … → Tπ(n)
Nên có tất cả n! hành trình như thế
Nếu ta cố định một thành phố xuất phát, chẳng hạn T1, thì có (n-1)! hành ình
ài toán chuyển về dạng :
dạng : T T
tr
B
Trang 7Tìm Min{f(a2, , an ) : (a2, , an ) là hoán vị của {2, ,n}}
ới
V ( 1, , ) 1, 2 2,3 1, 1
n n
a a
a a
a a
Cách giải bài toán sẽ kết hợp đánh giá nhánh cận trong quá trình liệt kê hương án của thuật toán quay lui
3 Thiết kế
p
put C = (Cij )
utput - x* = (x1, ,xn) // Hành trình tối ưu
- f* = f(x*) // Giá trị tối ưu
ry (i) ≡
for (j = 1 → n)
if( Chấp nhận được )
i Ghi nhận trạng thái mới;
Cập nhật lời giải tối ưu;
else {
≤ f* )
}
// Trả bài toán về trạng thái cũ }
• Nếu ta cố định xuất phát tư ø T1, ta duyệt vòng lặp từ j = 2
• Đánh giá nhánh cận :
Đặt : CMin = Min{Cij : i, j ∈ {1, ,n}
øo bước i ta tìm được lời giả bộ phận cấp i là (x1, ,xi ), tức là đã đi
g T1 → T2 → →Ti , tương ứng với chi phí :
Si =
hành trình bộ phận này thành một hành trình đầy đủ, ta còn hải đi nữa, gồm n-i thành phố còn lại và đoạn quay lại T1
-i+1 đoạn còn lại không nhỏ hơn CMin, nên hàm định như sau :
In
O
T
{ Xác định x theo j;
n g(x1,L,x i) if(g(x1,L,x i)
Giả sử va qua đoạn đườn
i
i x x x
x
C
1 3
2 2
Đểâ phát triển
p qua n-i+1 đoạn đường
Do chi phí mỗi một trong n đánh giá cận có thể xác
CM i
n S x x
g( 1,L, i)= i +( − +1) in
hành phố Tj chưa đi qua
ãn trạng thài này
đư đã
i
• Điều kiện chấp nhận được của j là t
Ta dùng một mảng logic Daxet[] để biểu die
⎪
⎨
=
T j
Daxet
; 0 ] [ ⎪⎧1;T j ợcđiqua
⎩ j chưa đượcđiqua
Mảng Daxet[ ] phải được bằng 0 tất cả
h gán : x = j
• Xác định xi theo j bằng câu lện
Trang 8Cập nhật trạng thái mới : Daxet[j] = 1
Cập nhật lại chi phí sau khi tìm được xi : S = S+ C
i
i x
x−1
vừa tìm được :
for (j = 2 → n)
{
Daxet[j] = 1;
//Cap nhat toi uu
ong = S + C[x[n]][x[1]];
< f*)
* = Tong;
}
else {
S + (n-i+1)*Cmin; //Danh gia can
Try(i+1);
Min
⎢
⎢
⎡
∞
∞
∞
∞
=
12 7
2 6
4 16 9
20 22 4 3
15 18 14 3
C
• Cập nhật lời giải tối ưu :
Tính chi phí hành trình Tong = S + C 1;
n
x
ếu (T ng < f ) thì
hái : Daxet[j] = 0
• Thao tác huỷ bỏ trạng t
Trả lại chi phí cũ : S = S-
i
i x x
C −1
Thủ tục nhánh cận viết lại như sau : Try(i)≡
if(!Daxet[j])
S = S + C[x[i-1]][x[i]];
if(i==n)
{ T
if(Tong
{
Lgtu = x;
f
}
g =
}
S = S - C[x[i-1]][x[i]];
}
h họa :
Ma trận chi phí : ⎢⎢17
⎥
⎥
⎢
⎢
⎣9 15 11 5 ∞
⎥
⎥
⎥
⎥
⎦
⎤
Trang 9Cắt các nhánh này
(1) f*=∞
(1,2) 3; g = 11
(1,3) S=14; g=22
(1,4) S=18; g = 26
(1,5) S=15;g=23 S=
(1,2,3) (1,2,5)
S=23; g = 29 (1,2,4)
g ≥ f* (=22) :
4 Cài đặt
void Try(int i)
int j, Tong, g;
{
= j;
Daxet[j]
if(i==n) //Cap nhat hanh trinh toi uu {
{
for (j = 2; j <= n; j++) if(!Daxet[j])
x[i]
= 1;
S = S + C[x[i-1]][x[i]];
Tong = S + C[x[n]][x[1]];
S=7; g = 13 S=25; g = 31
(1,2,3,4) S=23; g = 27 S=11; g = 15 (1,2,3,5)
(1,2,3,4,5) S= 35; g = 37 S=16; g = 18 (1,2,3,5,4)
Cập nhật : f* = 16 + 6 = 22 rình mới :
Cập nhật : f* = 35 + 9 = 44 Hành trình TU mới 1→2→3→4→5
Hành t 1→2→3→5→4
Trang 10if(Tong < Gttu)
{ }
{
][x[i]];
axet[
}
g các iến :
2 thanh pho
) for(j = 1; j <= n; j++)
(Cmin>C[i][j]) Cmin = C[i][j];
i uu f*
nh
xác
Gan(Httu,x,n);
} else
g = S + (n-i+1)*Cmin; //Danh gia can
Try(i+1);
}
S = S - C[x[i-1]
}
Khởi độn b void Init()
{
int i, j;
Cmin = VC;//Chi phi nho nhat giua for(i = 1; i <= n; i++)
for(i = 1; i <= n; i++
if
C;//Gia tri to
Gttu = V
S = 0;
[1] =
x 1; // Xuat phat tu di 1 }
1 Bài toán
Có n loại đồ vật, mỗi loại có số lượng không hạn chế Đồ vật loại i, đặc
i, với mọi i ∈ {1, ,n}
hiếc túi xách có giới hạn trọng lượng m,
trưng bởi trọng lượng Wi và giá trị sử dụng V
Cần chọn các vật này đặt vào một c sao cho tổng giá trị sử dụng các vật được chọn là lớn nhất
2 Ý tưởng
Đặt : D = u⎨⎧ =
⎭
⎬
≤
u u
n n
m w N
u
i i i n
1
( L
R
Trang 11= n
u u
f( , , ) )a L ;(u1,L,u n)∈D n
u
u1, ,
=
i i i
1 1
Bài toán chiếc túi xách chuyển về bài toán sau :
) = {f(u):u∈D}
Tìm x* ∈ D : f* = f(x*
Cho nên ta sẽ kết hợp đánh giá nhánh cận trong quá trình liệt kê các lời giải pháp quay lui
3 Thiết kế thuật toán
theo phương
Mô hình ban đầu có thể sử dụng như sau : ry(i) ≡
r(j = 1 → ) if(Chấp nhận được)
{ Xác định xi theo j;
Ghi nhận trạng thái mới;
if(i==n)
Cập nhật lời giải tối ưu;
else { Xác định cận trên g;
if( g(x1, , xi) ≤ f*) Try(i+1);
} Trả lại trạng thái cũ cho bài toán;
}
• Cách chọn vật :
Xét mảng đơn giá :
T
⎟⎟
⎠
⎞
⎜⎜
⎝
⎛
=
n
n w
v w
v
1
1
L
Ta chọn vật theo đơn giá giảm dần
Không mất tính tỏng quát, ta giả sử các loại vật cho theo thứ tự giảm dần của đơn giá
• Đánh giá cận trên :
Giả sử đã tìm được lời giải bộ phận : (x1,L,x i) Khi đó :
- Giá trị của túi xách thu được : S = = S + xjvj
- Tương ứng với trọng lượng các vật đã được xếp vào chiếc túi :
TL= = TL + xiwi
- Do đó, giới hạn trọng lượng của chiếc túi còn lại là : m – TL = m -
Ta có :
∑
=
i
j j
j v x
1
∑
=
i
j j
j w x
1
∑
=
i
j j
j w x
1
Trang 12
{ }
⎟⎟
⎠
⎞
⎜⎜
⎝
⎛ +
≤
⎭
⎬
⎫
⎩
⎨
⎧
≤ +
=
⎭
⎬
⎫
⎩
⎨
⎧
≤ +
=
=
∀
=
∈
=
+
+ +
= +
=
+
= +
=
∑
∑
∑
∑
1
1 1
1
1 1
1
* :
:
, 1 ,
; ) , , ( : ) (
i
i i
i n
i j
j j n
i j j j
i n
i j
j j n
i j j j
j j n
w
m v
S m w u v
u Max S
m w u v
u S
Max
i j x u D u u u u f
Do đó, cận trên cho các lời giải bộ phận cấp i có thể xác định bởi :
⎠
⎞
⎜⎜
⎝
⎛ +
=
+
+
1 1
i
i i
i
w
m v
S x x
• Theo biểu thức xác định cận trên g, các giá trị có thể chấp được cho xj+1 là :
t = 0 → ⎟⎟
⎠
⎞
⎜⎜
⎝
⎛
+1
i
i w m
• Thao tác ghi nhận trạng thái mới khi xác định được xi chẳng qua là cập nhật lại giá trị thu được và giới hạn trọng lượng mới của chiếc túi :
S = S + xivi
T = = T + xiwi
• Vì vậy, thao tác trả lại trạng thái cũ cho bài toán :
S = S – xivi
T = T - xiwi
• Cập nhật lời giải tối ưu :
Khi tìm được một lời giải, ta so sánh lời giải này với lời giải mà ta coi là tốt nhất vào thời điểm hiện tại để chọn lời giải tối ưu
• Các khởi tạo giá trị ban đầu :
- x* = 0 ; //Lời giải tối ưu của bài toán
- f* = f(x*) = 0; // Giá trị tối ưu
- S = 0; //Giá trị thu được từng bước của chiếc túi
- TL = ; //Trọng lượng xếp vào chiếc túi từng bước
Ta viết lại thủ tục nhánh cận trên : Input m,
v (v1, , vn) : vi ∈ R,∀i;
=(w1, , wn ) : wi ∈ R,∀i;
tput x* = (x1, , xn) : xi ∈ N,∀i;
= w Ou
⎭
⎬
⎫
⎩
⎨
=
=
n i N u m w u v u
n
i i i n
i i
1 1
ry(i)≡
+ wi*
vi*xi;
T
t = (m-TL)/wi ; for (j = t; j >=0 ; j ) {
x = j; i
TL = TL xi ;
S = S +