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

XỬ LÝ SONG SONG.doc

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 (376.44 KB, 33 trang )

TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-------***-------
B ÁO C ÁO KHOA H ỌC
Chuyên đề: Xử lí song song
Đề tài: Thuật toán nhánh cận trên
môi trường song song
Giáo viên hướng dẫn : Th.s Đỗ Trung Kiên
Sinh viên thực hiện : Nguyền Thị Bích Nhật
Phạm Thị Thuỳ
Trần Thị Thanh Tâm
Bùi Thu Hường
Trần Thị Hoa
Nguyễn Chí Công
Hà Nội, 15/04/2008
1
MỤC LỤC
Chương 1 : TỔNG QUAN VỀ THUẬT TOÁN
NHÁNH CẬN .............................................................................................................................. 2
1.1. Thuật toán nhánh cận ......................................................................................................................... 3
1.2. Một số ví dụ cụ thể áp dụng thuật toán nhánh cận ............................................................................ 4
Chương 2 : XÂY DỰNG KHUNG THUẬT TOÁN
NHÁNH CẬN ............................................................................................................................................... 7
* Nhóm các lớp yêu cầu ....................................................................................................................... 8
* Nhóm các lớp cung cấp ................................................................................................................... 10
2.1. Xây dựng khung nhánh cận ............................................................................................................ 12
2.1.1. Cấu trúc dữ liệu ....................................................................................................................... 12
2.1.2. Thuật toán ............................................................................................................................... 12
2.2. Xây dựng khung nhánh cận tuần tự ................................................................................................ 15
2.3. Xây dựng khung nhánh cận song song ........................................................................................... 16
2.3.1. Lược đồ song song dữ liệu tập trung ....................................................................................... 19


2.3.2. Lược đồ song song dữ liệu phân tán ....................................................................................... 22
2.4. Công cụ phát triển hệ thống ............................................................................................................ 25
2.5. Lựa chọn mô hình phát triển hệ thống ........................................................................................... 25
Chương 3 : SỬ DỤNG THUẬT TOÁN NHÁNH CẬN ĐỂ GIẢI QUYẾT BÀI TOÁN TSP ................ 27
* Bài toán TSP (Bài toán người du lịch) .............................................................................................. 27
3.1. Giới thiệu bài toán ........................................................................................................................... 27
3.2. Định nghĩa bài toán ......................................................................................................................... 27
3.3. Sử dụng thuật toán nhánh cận để giải bài toán TSP ................................................................. 28
* Tính cận và phân nhánh .................................................................................................................. 28
3.4. Chương trình thực thi ..................................................................................................................... 32
Chương 1 : TỔNG QUAN VỀ THUẬT TOÁN
NHÁNH CẬN
2
Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối ưu tổ hợp. Ta sẽ
thực hiện việc đánh giá theo từng bước, nếu không có khả năng tìm thấy kết quả tốt hơn
thì sẽ cắt nhánh đó, không thực hiện tìm tiếp mà chuyển ngay sang nhánh khác. Khi đó,
chỉ ghi nhận các kết quả tốt hơn lúc ban đầu. Nghiệm của bài toán sẽ tốt dần lên do khi
tìm ra kết quả tốt hơn ta sẽ cập nhật lại giá trị hiện thời của bài toán.
1.1. Thuật toán nhánh cận
Một trong những bài toán đặt ra trong thực tế là tìm một nghiệm của bài toán thỏa
mãn một số điều kiện nào đó và nghiệm đó là tốt nhất theo một tiêu chí cụ thể, nghiên
cứu lời giải các bài toán tối ưu thuộc về lĩnh vực quy hoạch toán học. mô hình được sử
dụng để tìm kiếm là mô hình cây phân cấp . việc tìm nghiệm của các bài toán thường
phải dựa vào việc liệt kê toàn bộ các cấu hình có thể và đánh giá tìm ra cấu hình tốt
nhất.
Ví dụ: Bài toán người du lịch: không gian trạng thái là N!
Bài toán K- median : không gian trạng thái là
)!(!
!
knk

n
C
k
n

=
Khi đó, không gian tìm kiếm của bài toán là rất lớn trong khi nhiều trường hợp có
thể loại bỏ được ngay. Điều này gây nên tình trạng lãng phí bộ nhớ và mất rất nhiều
thời gian. Vấn đề đặt ra là trong quá trình liệt kê lời giải cần tận dụng những thông tin
đã có để loại bỏ sớm những phương án chắc chắn không tối ưu. Thuật toán nhánh cận
được sử dụng để khắc phục những vấn đề trên
Tư tưởng cơ bản của thuật toán là trong quá trình tìm kiếm lời giải, ta sẽ phân
hoạch tập các phương án của bài toán thành hai hay nhiều tập con biểu diễn như một
nút của cây tìm kiếm và cố gắng bằng phép đánh giá cận các nút, tìm cách loại bỏ các
nhánh cây (những tập con các phương án của bài toán) mà ta biết chắc chắn không phải
3
là phương án tối ưu. Mặc dù trong trường hợp tồi nhất thuật toán sẽ trở thành duyệt toàn
bộ, nhưng những trường hợp cụ thể nó rút ngắn đáng kể thời gian tìm kiếm.
Để áp dụng phương pháp nhánh cận đối với 1 tập các bài toán tối ưu chúng ta
cần làm theo các bước sau:
• Bước1 ( khởi tạo): L:={П
0
}, Q: ={П
0
},bs:= -∞ và T:= (tập hợp rỗng).
• Bước 2( tìm kiếm): đi tới Bước 9 nếu L =
đi đến Bước 3 sau khi lựa chọn Пi:= s(Ls) để kiểm tra.
• Bước 3 (cập nhật ): Nếu lower_bound(Пi)> bs, thì bs:= lower_bound(Пi) và
T:={σ } với σ là lời giải khả thi của Пi sao cho f(x,σ )= lower_bound(П i). Đi
tới bước 4.

• Bước 4 : đi tới Bước 8 nếu Пi

G (tập hợp các bài toán bộ phận Пi được giải
trong tiến trình tính toán cận trên của Пi). ngược lại thì đi đến Bước 5.
• Bước 5: ( kiểm tra cận trên): đi đến bước 8 nếu cận trên nhỏ hơn bs:
upper_bound(Пi) ≤ bs. Ngược lại đi tới bước 6.
• Bước 6: đi tới bước 8 nếu tồn tại một Пk (≠ Пi)

Q mà f(Пk) ≥ f(Пi). Ngược lại
đi tới bước 7.
• Bước7: (phân nhánh): Phân và cập nhật
. Quay trở lại bước 2.
• Bước 8 ( kết thúc bài toán con): gán L:= L - Пi sau đó quay trở lại bước 2.
• Bước 9 ( kết thúc toàn bộ ) : Dừng. bs = f(П
0
) và T lưu trữ một lời giải tối ưu của
П
0
, nếu bs = - ∞ , П
0
không có lời giải
1.2. Một số ví dụ cụ thể áp dụng thuật toán nhánh cận
Bài 1: Bài toán người du lịch( TSP)
4
• Phát biểu bài toán : Một người du lịch muốn đi thăm 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 thành phố đúng một lần, rồi quay trở lại thành phố xuất
phát. Biết ci,j là chi phí từ thành phố Ti đến thành phố Tj . Hãy tìm hành trình
với tổng chi phí nhỏ nhất
• Xây dựng công thức :

Phương án : π = (π1, π2, … πn) là hoán vị của 1, 2, …, n
Hành trình : T π1 → T π2 → …… → T πn
Chi phí : f(π) = c π1, π2 + c π2, π3 + …. + c πn, π1
Π : tập tất cả các hoán vị
=> min {f(π) : π ∈ Π }

• Tư tưởng của thuật toán nhánh cận:
• Cố định thành phố 1
• Tìm cực tiểu của hàm :
f(x2, x3, . . , xn) = c[1,x2] + c[x2,x3] + ... + c[xn,1] => min
x2, x3, . . , xn là hoán vị của các số 2, 3, …, n
• Ký hiệu : cmin = min{c[i,j]; i, j = 1,2,…,n, i≠j}
• Giả sử có phương án bộ phận (u1,u2, …, uk)
– Chi phí phải trả là : σ = c[1,u2] + c[u2,u3] + ... + c[uk-1, uk]
– Cận dưới là : g (u1,u2, …, uk) = σ + (n-k+1)*cmin
5
1. Phương pháp phân nhánh:
+ Nếu bài toán con có g() > f -(Kỉ lục tạm thời) thì cắt luôn nhánh
của bài toán này
+ Nếu không thì phân nhánh tiếp bài toán con cho đến khi tính được
kỉ lục của bài toán con này. Nếu kỉ lục của bài toán con nhỏ hơn f() thì
cập nhật lại kỉ lục tạm thời f()
2. Phương pháp tính cận:
5.
9. tính cận trên của bài toán con dựa vào công thức
σ = c[1,u2] + c[u2,u3] + ... + c[uk-1, uk]
g (u1,u2, …, uk) = σ + (n-k+1)*cmin
Bài 2: Bài toán cái túi
• Phát biểu bài toán : Một nhà thám hiểm cần đem theo một cái túi có trọng lượng
không quá b. Có n đồ vật có thể đem theo. Đồ vật thứ j có trọng lượng a và giá trị

sử dụng là c . Hỏi rằng nhà thám hiểm cần đem theo các đồ vật nào để cho tổng
giá trị sử dụng của các đồ vật đem theo là lớn nhất.
• Xây dựng công thức :
Phương án x = {x1,x2, …, xn}
Giá trị đồ vật đem theo
6
Tổng trọng lượng đồ vật
 min{f(x) : g(x) ≤ b}
Chương 2 : XÂY DỰNG KHUNG THUẬT TOÁN
NHÁNH CẬN
Thuật toán nhánh cận được xây dựng với mong muốn giải quyết được tập các bài
toán tối ưu tổ hợp. Có nghĩa là tất cả các bài toán đó sẽ được giải quyết dựa trên một
khung chung của thuật toán để khi vào một bài toán cụ thể người viết chương trình chỉ
cần thêm vào khung đó những dữ liệu phù hợp với bài toán của mình. Nó giảm bớt thời
gian xây dựng thuật toán đồng thời nó hữu ích cho những người không biết kỹ thuật
nhánh cận trên môi trường song song vẫn có thể cài đặt song song. Chương này sẽ trình
bày việc xây dựng khung của kĩ thuật nhánh cận và kỹ thuật nhánh cận trên môi trường
tuần tự hoặc song song.
Hệ thống gồm hai nhóm : một nhóm các lớp cung cấp (Provided) bao hàm các thủ
tục chung cho thuật toán nhánh cận (ví dụ như khung của thuật toán nhánh cận tuần tự,
khung của thuật toán nhánh cận song song ...) và nhóm các lớp yêu cầu (Required) bao
hàm các thủ tục riêng để giải quyết một bài toán cụ thể sử dụng kỹ thuật nhánh cận (ví
dụ như các thủ tục tính cận, thủ tục phân nhánh, ...). Để giải quyết một bài toán bằng kỹ
thuật nhánh cận, người sử dụng chỉ cần viết các khai báo và xây dựng các hàm trong
nhóm yêu cầu mà không cần xây dựng lại nhóm cung cấp. Hình 4.1 diễn tả mô hình
UML tổng quan của hệ thống.
7
* Nhóm các lớp yêu cầu
Mô hình chung của nhóm các lớp yêu cầu
Hình 2 diễn tả các lớp và thủ tục chính trong nhóm yêu cầu.

8
Hình 1 : Mô hình UML
Hình 2 : Các lớp yêu cầu
Các lớp yêu cầu được sử dụng để lưu trữ dữ liệu cơ bản của thuật toán : bài toán, trạng
thái không gian tìm kiếm. Nó bao gồm các lớp chính sau :
- Bài toán (Problem): Diễn tả các tham số của bài toán cần giải quyết.
- Bài toán con (Subproblem) : Diễn tả vùng không gian chưa được khai thác và
cung cấp các chức năng sau :
o InitSubProblem(pbm) : Sinh ra bài toán con đầu tiên từ bài toán ban đầu
o LowerBound(pbm, sol) : Tính toán cận dưới của hàm mục tiêu cho lời
giải bộ phận sol của bài toán pbm.
o UpperBound(pbm, sol) : Tính giá trị hàm mục tiêu của lời giải toàn cục
sol của bài toán pbm.
o Branch(pbm, sps) : Sinh ra một tập các bài toán con của bài toán đang xét
và lưu vào sps.
Lớp bài toán con diễn tả một bài toán bộ phận. Một bài toán con được xác định bởi
các dữ liệu sau : vector sol chứa các chỉ số đỉnh làm median của bài toán con (hay là lời
giải bộ phận của bài toán cần giải quyết) và được sắp xếp theo thứ tự tăng dần, chỉ số
đỉnh cuối eV của lời giải bộ phận, và cận dưới cost ứng với lời giải bộ phận sol.
Lớp bài toán con phải cung cấp các hàm chính sau :
- InitSubProblem(pbm): sinh ra bài toán con ban đầu với
- Các hàm tính cận dưới (LowerBound), tính cận trên (UpperBound), phân nhánh
(Branch).

9
* Nhóm các lớp cung cấp
Trước khi mô tả lớp cung cấp chúng ta cần xem xét cấu trúc dữ liệu để lưu các bài
toán con chưa được giải quyết trong quá trình tính toán. Vì số lượng các bài toán con là
rất lớn và không biết trước nên ta sử dụng một danh sách liên kết kép để quản lý chúng.
Lớp Solver : Làm nhiệm vụ đưa ra và duy trì các thông tin có liên quan tới trạng thái

tìm kiếm trong suốt quá trình thực hiện
class Solver {
protected:
const Problem& pbm;// bài toán cần giải quyết
Direction dir;
SubProblem sp; // bài toán con hiện thời cần giải quyết
Solution sol; // giải pháp tốt nhất hiện thời
container<SubProblem> HP;// danh sách các bài toán con cần giải quyết
Bound high;// cận trên của nhánh bài toán con
Bound low;// cận dưới của nhánh bài toán con
Bound bestSol;// kỉ lục hiện thời của bài toán
public:
Solver(const Problem &problem);
10
..........................
Có hai lớp kế thừa từ lớp Solver
- Lớp Solver_Seq : Chứa thủ tục run() để giải quyết bài toán một cách tuần tự
- Lớp Solver_Lan : Chứa thủ tục run(int argc, char** argv) để giải quyết bài
toán một cách song song trên môi trường mạng LAN. Với tham số truyền vào
của hàm chính là các tên máy tham gia vào quá trình tính toán.
Người sử dụng muốn thực hiện theo phương thức nào (song song hay tuần tự) thì tạo ra
một đối tượng tương ứng sau đó gọi tới thủ tục run . Ví dụ chúng ta muốn tiến hành
thuật toán nhánh cận tuần tự để giải quyết bài toán TSP có đoạn mã của thủ tục main
như sau
Int Main(int argc, char** argv) {
Problem pbm; // Bài toán cần giải quyết
SolVec sol; // Lời giải tối ưu của bài toán
Bound bs; // Giá trị tối ưu của bài toán
Solver_Seq sv(pbm);
Sv.run();

Bs = sv.bestSolution();
Sol = sv.solution();
}
11
2.1. Xây dựng khung nhánh cận
2.1.1. Cấu trúc dữ liệu
Cấu trúc dữ liệu sử dụng là hàng đợi động để điều khiển bài toán con được sinh
ra bằng phương thức phân nhánh. Các bài toán con được thêm và0 hàng đợi phụ thuộc
vào phương thức tìm kiếm cụ thể trong lớp cài đặt: lifo(last in first out), fifo (first in
first out) hoặc prio-rity. Mỗi một bài toán con được kết nối bởi 2 con trỏ tới thành phần
trứơc và sau của danh sách riêng biệt.
Hình 3: Hàng đợi các bài toán con của kĩ thuật nhánh cận
2.1.2. Thuật toán
Các bài toán sử dụng nhánh cận để giải quyết đều phải sử dụng khung của thuật toán.
Điều này nhấn mạnh rằng người dùng nếu giải bài toán của mình trên môi trường tuần
tự hoặc song song thì chỉ cần thêm một số phương thức, dữ liệu phù hợp mà không cần
suy nghĩ đến việc phải thiết kế các bước như thế nào.
Dưới đây là khung chung của thuật toán:
12
1. Khởi tạo
a. Tập hoạt động (tập các bài toán con chưa được duyệt) chứa bài toán ban
đầu.
b. Giá trị kỷ lục(best solution=bs) bằng ∞.
2. Lựa chọn
a. Dựa trên một phương pháp nào đó (theo chiều sâu, chiều rộng, hoặc cận tốt
nhất ,...) để lựa chọn một bài toán con khả thi cùng cận của nó từ tập hoạt
động.
b. Xóa bài toán con khỏi tập hoạt động.
3. Phân nhánh
a. Áp dụng luật phân nhánh để sinh ra các bài toán con mới từ bài toán đang

xét. Tính cận của các bài toán con mới này.
b. Tiến hành kiểm tra các bài toán con vừa được sinh ra.
Có hai trường hợp :
(1) bài toán con đã được giải quyết – đi tới bước 5
(2) bài toán con chưa được giải quyết – đi tới bước 4.
4. Kiểm tra tính khả thi : Đưa các bài toán con có cận nhỏ hơn kỷ lục tạm thời vào
tập hoạt động.
5. Dò xét kết thúc
a. Bài toán con được duyệt là một lời giải khả thi khi có cận nhỏ hơn kỷ lục
và khi đó nó sẽ thay thế kỷ lục. Ngược lại sẽ bị xóa.
b. Khi cập nhật kỷ lục mới (5a) thì tất cả các bài toán con trong tập hoạt động
có cận dưới lớn hơn hoặc bằng kỷ lục sẽ bị xóa.
6. Kết thúc thuật toán
13

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×