Thuật toántìm đƣờng đi có giá thành nhỏ nhất AT

Một phần của tài liệu Thuật toán tìm đường đi ngắn nhất và xây dựng ứng dụng (Trang 38 - 41)

Thuật toán tìm đƣờng đi có giá thành nhỏ nhất AT (Algorithm for Trees) với mỗi đỉnh n tƣơng ứ n g số g(n) là giá thành đƣờng đi từ đỉnh đầu tới n. (g(n) có thể chƣa xác định đối với các đỉnh thuộc phần cây chƣa hƣớng đến). Mỗi đỉnh n có thể là:

− Đỉnh đóng: nghĩa là đỉnh đã đƣợc xem xét;

− Đỉnh mở: là đỉnh giả định sẽ đƣợc xem ở bƣớc sau;

− Đỉnh ẩn: là đỉnh mà hàm g(n) tƣơng ứng chƣa đƣợc tính đến và chƣa đƣợc xem xét đến.

Thuật toán AT gồm các bƣớc sau:

Bƣớc 1: Đầu tiên, mọi đỉnh n và mọi giá trị g(n) đều là ẩn. Mở đỉnh đầu tiên (coi đỉnh đầu tiên là đỉnh mở và đặt giá trị g tƣơng ứng bằng 0).

Bƣớc 2: Chọn đỉnh mở với giá thành g tƣơng ứng nhỏ nhất. Gọi đỉnh này là N, nếu N là đỉnh mục tiêu thì đƣờng dẫn tới N là đƣờng đi có giá thành nhỏ nhất g(n) và vấn đề đã đƣợc giải. Nếu không còn đỉnh mở nào thì cây biểu diễn vấn đề không có đƣờng đi tới mục tiêu. Nếu có từ 2 đỉnh trở lên cùng giá trị g nhỏ nhất thì kiểm tra trong số đó có đỉnh mục tiêu không? Nếu có thì chọn đỉnh mục tiêu đó và quá trình giải kết thúc. Nếu không thì chọn tùy ý một đỉnh trong số đó và gọi là N.

Bƣớc 3: Đóng đỉnh N và mở các đỉnh sau N (có cùng hƣớng đến N), với mỗi đỉnh sau N gọi là s, ta tính:

g(s)=g(N)+(giá thành cung từ N tới s) Bƣớc 4: Quay trở lại bƣớc 2.

2.5.1. Bài toán

Cho đồ thị G= (V, E) biểu diễn bài toán với đỉnh xuất phát n0 và tập đích DICH xác định.

Với mỗi phép chuyển trạng thái n(i)->n(i+1) tốn chi phí c(i, i+1), ở đây có thể xem là trọng số của cung nối n(i) và n(i+1).

Phƣơng pháp: Tƣơng tự phƣơng pháp tìm kiếm theo chiều sâu, nhƣng tại mỗi biết ta tính giá thành của mỗi đỉnh và chọn đỉnh có giá thành tối ƣu nhất 2.5.2. Thuật toán Input: Đồ thị G= (V, E), Đỉnh xuất phát n0 Hàm chi phí c Tập các đỉnh đích DICH Output:

Đƣờng đi từ đỉnh n0 đến đỉnh n* in DICH sao cho g(n*) = MIN bool result = false;

openList.Push(n0); while (!openList.IsEmpty()) { node = openList.Pop(); if (node.Equals(n*)) { result = true; break; } closeList.Push(node); for (n in Tn(node)) {

{

openList.Push(n);

n.Cost = node.Cost + Edge(node, n).Value; BeforeOfNode(n, node);

}

else if (!closeList.InList(n) && n.Cost > node.Cost + Edge(node, n).Value) {

n.Cost = node.Cost + Edge(node, n).Value; BeforeOfNode(n, node);

} }

openList.Sort(SortType.ASCENDING);//sắp xếp lại để chọn đỉnh tối ƣu nhất ở đỉnh Stack }if (result) { DisplayResult(); } else { NotFound(); } 2.5.3. Ví dụ Cho đồ thị nhƣ hình vẽ

Đỉnh xuất phát là (1), đỉnh đích là (10) Kết quả

Đƣờng đi tìm đƣợc sau khi thực hiện thuật giải tìm đƣờng đi có giá thành nhỏ nhất AT l à (1), (3), (6), (10).

Thuật giải AT đã đƣợc chứng minh là luôn luôn tìm đƣợc đƣờng đi với giá thành nhỏ nhất nếu nhƣ tồn tại đƣờng đó trên đồ thị và là thuật giải tối ƣu theo nghĩa số đỉnh đóng trong quá trình tìm kiếm là ít nhất.

Một phần của tài liệu Thuật toán tìm đường đi ngắn nhất và xây dựng ứng dụng (Trang 38 - 41)

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

(55 trang)