Sử dụng thuật toán nhánh cận để giải bài toán TSP

Một phần của tài liệu Thuật toán nhánh cận trên môi trường song song (Trang 28 - 32)

Để đi tìm lời giải chính xác cho bài toán TSP không còn cách nào khác ngoài việc chúng ta phải duyệt tất cả các lời giải có thể, tuy nhiên số lượng này là quá lớn (= n!), trong đó rất lãng phí các lời giải không cần thiết. Cách tiếp cận hiệu quả nhất từ trước tới nay trong chiến lược này đó chính là thuật toán nhánh cận(có thể cắt các nhánh ở các lời giải không cần thiết)

* Tính cận và phân nhánh

- Tí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

- Thuật toán phân nhánh dựa vào thuật toán liệt kê các hoán vị của n phần tử{1, 2, ....,

n}. Nghĩa là nếu bài toán con của ta có lời giải bộ phận là c1, c2, ...., ci. Thì các bài toán con sinh ra có lời giải bộ phận (c1, c2, ...., ci-1+1), ..., (c1, c2, ...., n k + i).

* Các lớp xây dựng cho bài toán TSP

Như chúng ta đã biết, bài toán yêu cầu tìm giải pháp tốt nhất cho người du lịch sao cho chi đi qua mỗi thành phố một lần và tổng chi phí quãng đường là nhỏ nhất. Dưới đây là khai báo lớp Problem cho bài toán TSP:

• Lớp Problem lưu giữ số lượng thành phố và ma trận giá trị giữa các thành phố

class Problem { private:

Number N; // Số lượng thành phố trong bài toán Matrix c; // Ma trận giá trị giữa các đỉnh public:

Problem (); ...

• 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 : đỉnh đầu iV, đỉ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 .

class SubProblem { private:

unsigned iV, /// đỉnh đầu tiên eV, /// đỉnh kết thúc trong hành trình cost; /// gía trị thật

Tset visitedSet; /// các thành phố đến thăm Solution sol; /// giá trị tốt nhất hiện thơi

public:

SubProblem ();

... };

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 iV = 0;

eV = 0; cost = 0;

- Các hàm tính cận dưới (LowerBound), tính cận trên (UpperBound), phân nhánh(Branch).

Class Solution() {

……. }

* Trên môi trường tuần tự

Khi thực thi trên môi trường tuần tự người dùng chỉ cần gọi phương thức run() của lớp Solver_Seq: void Solver_Seq::run() { if (dir == Minimize) { minimizing(); } else { maximizing(); } }

* Trên môi trường song song

Tương tự, khi đó phương thức run() của lớp Solver_Lan sẽ được gọi:

void Solver_Lan::run() {

Một phần của tài liệu Thuật toán nhánh cận trên môi trường song song (Trang 28 - 32)

Tải bản đầy đủ (DOC)

(33 trang)
w