1. Trang chủ
  2. » Giáo Dục - Đào Tạo

thiết kế và đánh giá thuật toán - trần tuấn minh -5 docx

16 477 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thiết kế và Đánh giá Thuật Toán
Tác giả Trần Tuấn Minh
Trường học Khoa Toán-Tin
Thể loại Đồ án
Năm xuất bản 2025
Định dạng
Số trang 16
Dung lượng 1,47 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

queue[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 3

Tì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 4

Bà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 5

CHƯƠ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 6

Nê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 7

Tì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 8

Cậ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 9

Cắ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 10

if(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):uD}

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 +

Ngày đăng: 21/07/2014, 23:22

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w