Tải bản đầy đủ (.pdf) (16 trang)

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

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 (1.47 MB, 16 trang )

Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 65 -








Đườ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= (a
uv
)
nxn


=
;),(;1 Evu
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 Evu
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++;
2
5
3 4
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 66 -


queue[cuoiQ] = j;
Daxet[j] = 1;

Truoc[j] = u;
}
ấ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.

B

:
c số đôi một khác nhau.
. L ät a a.

Bài
Cho dãy a = (a
, a
1 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 kê tất cả các tổ hợp chặp k trong tập gồm n phần tử củie
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ừ ô <x
0
, y
0
> đ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.
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 67 -


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ừ ô <x
0
, y
0
> , ô kết thúc <x
1
, 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ừ ô <x
0
, y
0
> đ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ố T
1
, T
2
, . ., 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
á T
j
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 C
ij
là chi phí đi từ thành phố Ti đến thành phố T
j
.

1. Liệt kê tất cả các hành trình đi từ thành phố Ti đến thành phố T
j
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
B
:
ấ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
2. Tìm ập thành một
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
Trên ät
1. Ô mang số 0 ta đào ao, mang số 1 ta trồng cỏ. Hai ô trồng cỏ có cạnh liền
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 ).

Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 68 -


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
:
G A
* phần tử. Cho S ∈ N*.
iả sử
⊂ N , có n



Xác đònh :


=
xD ,(
1
L

x,
=∀∈=∈

=
niAaaxSN
i
n
i
ii
n

n
,1,;:)
1

Bài 13
:
Cho n xâu ký tự khác rổng a
1
, a
2
, . .,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
:
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 đươ
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 69 -


CHƯƠNG 4: PHƯƠNG PHÁP NHÁNH CẬN
(Branch And Bound)
ầuI. 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,
đ ûo ời gian cũng như kỹ ảm ba về th
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 =
()





∈=

)(:,, xPAaaa
n
in
L ; niA
i
,1; =∀∞<

1

. P là một tính
hất trec

ân
n
.
=
:x = (x
1
, ,x
n
)
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
Trong o
thành phần của nghiệm.
Một bộ phận i thành phần (x
1
, , x
i
) sẽ gọi là một lời giải (phương án) b
phận cấp i. Ta gọi X
i
là tập các lời giải bộ phận cấp i,
ni ,1=∀
.
Đánh giá cận là tìm một hàm g xác đònh trên các X
i
sao cho :
},1,,),,(:)({),,(
11
iiaxXaaaafMinxxg =∀=∈=≤ LL


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


iini
Bất đẳng thức này có nghóa là giá trò
),,( xxg L không lớn
1 i
),,( xx L .
1 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
),,(
1 i
xxg L > f* thì :
f* <
},1,,),,(:)({),,(
11
XaaaafMinxxg
ini
∈=≤ LL iiax
i
=∀=

Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn



Thiết kế và đánh giá thuật toán - 70 -


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
án mẫu iển lời giải bộ phận
để tìm
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 x
i

ta cắt bỏ các nhánh con từ x
i
đi xuống, mà
ùnh giá cận như thế nào ?
),,(
1 i
xx L
, do đó có thể bỏ đi không cần phát tr
),,(
1 i

xx L
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 x
i
theo j;

if
Cập n
el
{
Xác đònh cận
),,(
1 i
xxg L
if( ),,( xxg L ≤ f* )
1 i
Try (i+1);
}
// 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

),,( xxg > f* thì
1 i
L
quay lên ngay cha của nó là x
i-1
.
đa Vấn đề là xác đònh hàm
I øi d hI. Ba toán ngøi u lòc
1. Bài toán
Một ngøi du lòch muốn tham quan n thành phố T
1
, , T
n
. 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ố T
i
đến T
j
. 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 C
ij
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 T
1
, thì có (n-1)! hành
ình.
ài toán chuyển về dạng :
Gọi π là một h
dạng : T
T
tr
B
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 71 -


Tìm Min{f(a
2

, , a
n
) : (a
2
, , a
n
) là hoán vò của {2, ,n}}.
ới V
1,,,11
1322
),,(
nnn
aaaaaan
CCCCaaf
+
+
+
+
=

LL

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 = (C
ij
)

utput - x* = (x
1
, ,x
n
) // 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;
if(i == n)
Cập nhật lời giải tối ưu;
else
{
Xác đònh cậ
;

≤ f* )
Try (i+1);
}
// Trả bài toán về trạng thái cũ
}
• Nếu ta cố đònh xuất phát tư ø T
1
, ta duyệt vòng lặp từ j = 2.
• Đánh giá nhánh cận :
Đặt : CMin = Min{C

ij
: i, j ∈ {1, ,n}
øo bước i ta tìm được lời giả bộ phận cấp i là (x
1
, ,x
i
), tức là đã đi
g T
1
→ T
2
→ . . . →T
i
, tương ứng với chi phí :
S
i
=
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 T
1
.
-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
),,(
1 i
xxg L
if(
),,(
1 i
xxg L


Giả sử va
qua đoạn đườn

ii
xxxxx
CCC
1322
1

+++ L

Đểâ 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

CMinSxxg
ii
)1(),,(
1
in
+
−+=L
hành phố T
j
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
jDaxet
;0
][


quiợc

j
T
;1


j
qua đi được chưa
Mảng Daxet[ ] phải được bằng 0 tất cả.
h gán : x = j • Xác đònh x
i
theo j bằng câu lện
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 72 -


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 x
i
: S = S+
C
ii
xx
1−


vừa tìm được :

for (j = 2
→ n)
{
x[i] = j;
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
if ( g < f*)
Try(i+1);
Min







=
12726
4169
202243
1518143

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ì N o *
Lgtu = x;
f* = Tong;
hái : Daxet[j] = 0. • Thao tác huỷ bỏ trạng t
Trả lại chi phí cũ : S = S-
ii
xx
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]];
Daxet[j] = 0;
}
h họa :
Ma trận chi phí :


17






511159







Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 73 -






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
(1,2,3,5)
S=11; g = 15
(1,2,3,4,5)
S= 37 35; g =
(1,2,3,5,4)
S=16; g = 18
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

Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 74 -


if(Tong < Gttu)
{


}


{

if < Gttu)


][x[i]];

axet[

}
g các iến :
2 thanh pho
Daxet[i] = 0;
)
for(j = 1; j <= n; j++)
(Cmin>C[i][j])
Cmin = C[i][j];
i uu f*
nh

xác

Gan(Httu,x,n);
Gttu = Tong;
}
else

g = S + (n-i+1)*Cmin; //Danh gia can
( g
Try(i+1);
}
S = S - C[x[i-1]
D j] = 0;
}
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
}
I à n cái túi hII. B i toá
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 :


==
uD


≤∈




=
uu
n
n
à :
D:
mwNu
i
iin
1
1
:),,( L
v
+
Rf →
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 75 -




=

n
uuf ),,() La
; Duu
n

),,(
1
L
n
uu
1
,,( L
=
i
iin
vu
1
1
Bài toán chiếc túi xách chuyển về bài toán sau :
) =
{
}
Duuf

:)(

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 x
i
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(x
1
, , x
i
) ≤ 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
fo
t










=
n
n
w
v
w
v
Dg ,,
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 :
(
)
i
xx ,,
1
L . Khi đó :
- Giá trò của túi xách thu được : S =
= S + x
j
v
j
.
- Tương ứng với trọng lượng các vật đã được xếp vào chiếc túi :
TL=
= TL + x
i
w
i
.
- 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
jj
vx
1


=
i
j
jj
wx
1

=
i
j
jj
wx
1
.
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 76 -


{
}









+≤






≤+
=






≤+
==∀=∈=
+
+
+=+=
+=+=
∑∑
∑∑
1
1
11

11
1
*:
:
,1,;),,(:)(
i
i
ii
n
ij
jj
n
ij
jj
i
n
ij
jj
n
ij
jj
jjn
w
m
vSmwuvuMaxS
mwuvuSMax
ijxuDuuuufMax L

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
11
*,,
i
i
ii
w
m
vSxxg
L

• Theo biểu thức xác đònh cận trên g, các giá trò có thể chấp được cho x
j+1
là :
t = 0










+1i
i
w
m


• Thao tác ghi nhận trạng thái mới khi xác đònh được x
i
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 + x
i
v
i
T = = T + x
i
w
i
.
• Vì vậy, thao tác trả lại trạng thái cũ cho bài toán :
S = S – x
i
v
i
T


= T - x
i
w
i
.
• 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(v
1
, . . ., v
n
) : v
i
∈ R,∀i;
=(w
1
, , w
n
) : w
i
∈ R,∀i;

tput x* = (x
1
, , x
n
) : x
i
∈ N,∀i;
=
w
Ou
f* = f(x*)=






∈∀∈≤
∑∑
==
niNumwuvuMax
i
n
i
ii
n
i
ii
,1,,:
11


ry(i)

+ w
i
*
v
i
*x
i
;
T

t = (m-TL)/w
i
;
for (j = t; j >=0 ; j )
{
x
= j;
i
TL = TL
x
i
;
S = S +
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:


www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 77 -


if(i==n) //Cap nhat toi uu
= x;
f* = S;

; //Danh gia can
( g > f*)
+1);
L = TL – w
i
*x
i
;
S = S - v
i
*x
i
;

2 3 4
5 3 2 4
10 5 3 6
{
if(S > f*)
{

x*

}
}
else
{
g = S + v
i+1
*(m-TL)/w
i+1
if
Try(i
}
T

}
Minh họa :




i 1
w
v
m = 8

Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:


www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 78 -



4. Cài đặt
void Try(int i)
{
int j, t, g;
t = (int)((m-Tl)/w[i]);
for (j = t; j >=0 ; j )
{
x[i] = j;
Tl = Tl + w[i]*x[i]; //Trong luong thu duoc
S = S + v[i]*x[i]; //Gia tri thu duoc
if(i==n) //Cap nhat toi uu
{
Gốc
f* = 0
(1) (0)
x
S = 10;
TL = 5;
g = 15;
S = 0 ;
TL = 0 ;
g = 10;


1
=1 x
1
=0
(1,1)
S = 15;
TL = 8;
g = 15;

(1,0)
S = 10;
TL = 5;
g = 13;

(1,1,0)
S = 15;
TL = 8;
g = 15;

(1,1,0,0)
S = 15;
TL = 8;
x
2
=1 x
2
=0
x
3
=0

x
4
=0
Cắt 2 nhánh này vì :
g < f*
Lời giải tối ưu :
x* = (1,1,0,0)
f* = 15
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 79 -


if(S > Gttu)
{
Gan();
Gttu = S;
}
}
Try(i+1);


x[i] = 0;
}



BA


else
{
g = S + v[i+1]*(m-Tl)/w[i+1]; //Danh gia can
if ( g > Gttu)

}
Tl = Tl - w[i]*x[i];
S = S - v[i]*x[i];
}
}
//*************
void Init()
{
for (int i = 1; i <= n; i++)
{
Patu[i] = 0;
S = 0;

Tl = 0;
Gttu = 0;

}
ØI TẬP

Bài 1 :
Có n đồ vật, mỗi

vật i đặc trưng bởi trọng lượng w
i
và giá trò sử dụng v
i
, với
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,
ò sử dụng các vật được chọn là lớn nhất.
mọi i
∈ {1, ,n}.
Cần chọn
sao cho tổng giá tr

Bài 2
:
Cho 3 ký tự A, B, C và n là một số nguyên dương.
ra từ 3 ký tự trên, với chiều dài n, thỏa điều kiện
u và sao cho số ký tự B là ít nhất.
Xác đònh chuỗi thỏa tạo
không có 2 chuỗi con liên tiếp nào giống nha


Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:

www.daihoc.com.vn


Thiết kế và đánh giá thuật toán - 80 -



Bài 3 :
Tìm lời giải tối ưu bài toán :
≤+++
→++
xxxx
Maxxx
4321
432
84235
63



∈ Nxxxx
4321
,,,
Bài 4



+ xx
510
:
Giả sử có n công việc và n thợ. Chi phí trả cho người thợ i để làm công việc
o cho tổng chi phí là nhỏ nhất.
j là Cij . Mỗi công việc chỉ do một thợ thực hiện và ngược lại.
Tìm cách thuê các thợ làm việc sa
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -

×