Bài toán tìm đường đi trong môi trường giao thông động

Một phần của tài liệu Tính toán đường đi trong môi trường giao thông động (Trang 39)

Bài toán mà tôi sẽ đề cập trong luận văn này sẽ là giải quyết vấn đề đưa một đối tượng trong thực tại ảo đi từ vị trí này tới một vị trí khác. Bài toán tìm đường đồng nghĩa với việc chỉ ra một đường đi từ điểm đầu tới điểm cuối sao cho có thể tránh được các vật cản trên đường, tránh được kẻ thù trên đường đi và đảm bảo chi phí thấp nhất (bao gồm chi phí xăng dầu, thời gian, khoảng cách, vật dụng, tiền của ….). Trong khi đó bài toán di chuyển đồng nghĩa với việc chọn lấy một con đường và di chuyển theo đường đi ấy. Có những trường hợp, thì một thuật toán tìm đường phức tạp được kết hợp với một thuật toán di chuyển đơn giản, thuật toán tìm đường sẽ chỉ ra đường đi sau đó đối tượng bắt đầu chọn lựa lấy đường đi và di chuyển sẽ đi theo đường đi đó. Trong một trường hợp đặc biệt khác thì, một hệ thống chỉ bao gồm thuật toán di chuyển sẽ không xác đinh toàn bộ đường đi trước (trừ khi đường đi chỉ là một đường thẳng) mà thay vào đó sẽ lần từng bước một, xem xét khu vực xung quanh tại mỗi thời điểm. Kết quả tốt nhất đạt được sẽ là kết hợp của cả hai thuật toán di chuyển và tìm đường.

Thông thường thì môi trường thực tại ảo của ta là một môi trường động tức là các đối tượng trong môi trường luôn luôn chuyển động. Vì thế các thuật toán tìm đường trong lý thuyết đồ thị sẽ không thể độc lập giải quyết được bài toán này, khi mà các thông tin về các cạnh của đồ thị luôn luôn thay đổi. Tìm đường đi trong môi trường thực tại ảo là một bài toán yêu cầu sự tổng hợp của nhiều phương pháp lại để cùng giải quyết một vấn đề. Một thuật toán tìm đường đi trong lý thuyết đồ thị sẽ thiết lập cho ta một lộ trình di chuyển ban đầu, trong quá trình di chuyển theo lộ trình đã được vạch ra đó, đối tượng liên tục cập nhật thông tin về môi trường xung quanh, để có những giải pháp thích hợp cho từng trường hợp cụ thể nhằm đạt được sự chính xác và tối ưu trong cách giải quyết.

Chương 2. TÍNH TOÁN ĐƯỜNG ĐI TRONG MÔI TRƯỜNG GIAO THÔNG ĐỘNG 2.1. Heuristic

2.1.1. Heuristic trong thuật toán A*

Heuristic H(n) sẽ ước tính cho ta giá trị nhỏ nhất để đi từ ô n nào đó tới vị trí đích. Và việc chọn được một heuristic tốt cho thuật toán là cực kì quan trọng.

Sử dụng heuristic trong thuật toán A*

Heuristic sẽ quyết định tới kết quá thực hiện của thuật toán A* như sau: 1. Trong trường hợp đặc biệt nếu H(n)  0 khi đó sẽ chỉ có G(n) thực hiện vai trò trong thuật toán, như vậy A* sẽ chính là thuật toán Dijkstra, và hiển nhiên sẽ đảm bảo việc thuật toán chỉ ra được đường đi ngắn nhất.

2. Nếu như H(n) luôn nhỏ hơn hoặc bằng chi phí thực tế để di chuyển từ ô n tới ô đích thì khi đó thuật toán A* có thể đảm bảo sẽ đưa ra được đường đi ngắn nhất. Giá trị H(n) càng nhỏ sẽ càng làm tăng số lượng ô mà thuật toán cần phải xét tới, điều này sẽ khiến thời gian thực hiện thuật toán tăng lên.

3. Nếu H(n) bằng đúng chi phí thực tế để di chuyển từ ô n tới ô đích thì khi đó A* sẽ chỉ đi theo đúng đường đi ngắn nhất và không phải kiểm tra bất kì ô nào khác nữa, thuật toán sẽ thực hiện nhanh nhất có thể. Mặc dù không thể thực hiện được điều này đúng trong mọi trường hợp, tuy nhiên ta vẫn có thể thực hiện được chính xác trong một số trường hợp đặc biệt. Hoàn toàn dễ hiểu nếu thông tin được đưa vào là hoàn hảo thì thuật toán sẽ thực thi một cách hoàn hảo.

4. Nếu trong một vài trường hợp mà giá trị H(n) lớn hơn giá trị thực tế thì khi đó thuật toán A* sẽ không thể đảm bảo chỉ ra chính xác đường đi ngắn nhất, tuy nhiên tốc độ thực hiện thuật toán sẽ là rất cao.

5. Trong một vài trường hợp đặc biệt nếu giá trị H(n) là lớn hơn nhiều so với giá trị G(n) thì khi đó thuật toán A* sẽ chuyển thành thuật toán “BFS”

Như vậy ta sẽ có một bài toán khá thú vị, là việc ta phải lựa chọn heuristic cho thuật toán. Nếu tìm được heuristic chính xác thì ta sẽ có được đường đi ngắn nhất và nhanh nhất. Nếu heuristic là quá nhỏ thì, thì ta vẫn có được đường đi ngắn nhất tuy nhiên tốc độ thực hiện sẽ chậm đi. Nếu heuristic là quá lớn thì sẽ không thể có được đường đi ngắn nhất nhưng khi đó tốc độ thực hiện thuật toán sẽ rất nhanh.

Trong lập trình game thực tại ảo thì thuộc tính này của A* là rất hữu dụng. Ví dụ như một số trường hợp mà ta sẽ gặp trong game thì chỉ cần một đường đi tốt chứ không cần một đường đi hoàn hảo nhưng lại cần đáp ứng điều kiện về thời gian thực thi thuật toán thì khi đó ta sẽ chỉ cần thay đổi heuristic là có thể có được kết quả mong muốn. Chỉ với một thao tác đơn giản là cân bằng giữa hai giá trị G(n) và H(n) là ta đã có thể thay đổi được hoàn toàn kết quả của thuật toán.

2.1.2. Tốc độ hay sự chính xác?

Khả năng thay đổi những đặc điểm của thuật toán A* thông qua Heuristic và hàm giá trị của nó vô cùng hữu dụng trong lập trình game đặc biệt là game thực tại ảo, nơi luôn cần có được sự linh hoạt của thuật toán để phù hợp với những điều kiện khác nhau về phần cứng. Sự chuyển đổi giữa tốc độ và độ chính xác của thuật toán có thể được khai thác để giúp cho game chạy nhanh hơn. Trong phần lớn các game, đôi khi ta không cần đường đi tốt nhất giữa hai điểm, mà chỉ cần một đường đi tương đối. Những gì ta cần sẽ phụ thuộc vào những gì diễn ra trong game, hoặc tốc độ của máy tính.

Giả sử trong game có hai loại địa hình, đất bằng và đồi núi, và chi phí di chuyển trên đất bằng là 1 và chi phí di chuyển trên vùng núi là 3, A* sẽ tìm kiếm một đường đi trên đường bằng dài gấp 3 lần trên địa hình núi, bởi vì hoàn toàn có thể tồn tại đường đi trên địa hình bằng vòng quanh chân núi. Ta có thể tăng tốc độ tìm kiếm của thuật toán A* bằng cách sử dụng 1.5 làm heuristic khoảng cách giữa

hai điểm. Như một cách lựa chọn, ta cũng có thể tăng tốc độ tìm kiếm A* bằng cách giảm số lượng tìm kiếm vòng quanh núi – chỉ cần thay thế chi phí di chuyển trên địa hình núi bằng 2 thay vì 3. Bây giờ nó chỉ tìm kiếm đường đi trên đất bằng dài gấp đôi trên đồi núi.

Sự lựa chọn giữa tốc độ và độ chính xác không cần phải ổn định. Ta có thể lựa chọn một cách linh động tuỳ thuộc theo tốc độ của CPU, lượng thời gian trong khi tìm kiếm, số đơn vị trên bản đồ, tầm quan trọng của mỗi đơn vị, kích thước của cả nhóm, độ khó, hay các nhân tố khác. Một cách để thực hiện việc chuyển đổi linh hoạt này là xây dựng hàm Heuristic mà giả định chi phí nhỏ nhất của một ô lưới là một và xây dựng hàm chi phí theo tỉ lệ

) 1 ) ( ( * 1 ) ( '    g n n g

Nếu  = 0 thì hàm thi phí  1. Trong thiết đặt này, chi phí địa hình hoàn toàn bị bỏ qua, và A* chỉ làm việc với hai trạng thái đi qua được và không đi qua được. Nếu  = 1. thì khi đó hàm chi phí gốc sẽ được sử dụng, và ta có thể có được toàn bộ các tiện ích của A*. Ta có thể chọn  bất kì [0,1] . Ta cũng có thể chuyển từ heuristic trả về giá trị min thực sự thành heuristic trả về giá trị min mong muốn. Ví dụ, nếu phần lớn địa hình là đồng cỏ với chi phí di chuyển là 2 nhưng trong đó có một số khu vực là đường đi với chi phí di chuyển là 1, khi đó ta sẽ phải coi như có một heuristic giả định không có đường đi, và trả về giá trị 2* khoảng cách.

Sự lựa chọn giữa tốc độ và độ chính xác không nhất thiết phải là toàn bộ không gian, ta có thể lựa chọn mang tính khu vực. Ví dụ như sẽ là quan trọng khi chọn một đường đi tốt gần vị trí hiện tại, với giả thiết rằng ta có thể kết thúc tính toán lại đường đi hay chuyển đổi hướng tại một số điểm, vì thế tại sao lại phải quan tâm tới độ chính xác của những phần xa của đường đi. Và cũng có thể là không cần phải có đường đi ngắn nhất trong khu vực an toàn của địa hình, nhưng khi kín đáo đi qua khu vực của kẻ thù thì tính an toàn và tốc độ là quan trọng

2.1.3. Tỉ lệ

A* sẽ tính toán giá trị f(n) = g(n) + h(n). Để thêm vào hai giá trị thì hai giá trị này cần phải có cùng tỉ lệ. Nếu g(n) được tính bằng giờ và h(n) được đo bằng mét thì khi đó A* sẽ coi như g hoặc h là rất nhỏ hoặc rất lớn, và như vậy hoặc là ta sẽ không thể có được một đường đi tốt, hoặc là A* sẽ chạy chậm hơn nó có thể. 2.1.4. Heuristic chính xác

Nếu một heuristic là chính xác bằng với khoảng cách dọc theo đường đi quan sát, ta có thể thấy được số lượng ô phải mở là rất ít, như trong hình vẽ ở mục tiếp theo. Thực tế diễn ra bên trong A* là nó sẽ tính toán f(n) = g(n) + h(n) tại mỗi ô. Khi mà h(n) luôn phù hợp với g(n) thì f(n) sẽ không thay đổi trên toàn bộ đường đi. Tất cả các ô không ở trên đường đi sẽ có giá trị f(n) lớn hơn giá trị f(n) của các ô nằm trên đường đi. Khi mà A* không tính toán tới ô có giá trị f(n) cao hơn cho tới khi nó tính toán tới ô có giá trị f(n) nhỏ hơn, thì nó sẽ không bao giờ lệch khỏi đường đi ngắn nhất.

Tiền tính toán heuristic chính xác

Một cách để xây dựng heuristic chính xác là tính toán trước giá trị độ dài đường đi ngắn nhất giữa một cặp điểm bất kì. Không phải là khả thi với hầu hết các game, tuy nhiên cũng có nhiều cách để có thể xấp xỉ heuristic :

. Cố định một lưới thô trên đỉnh của một lưới mịn. Tiền tính toán đường đi ngắn nhất giữa một cặp điểm của lưới thô

. Tiền tính toán đường đi ngắn nhất giữa một cặp điểm của đường đi. Đây là kết quả của việc tiếp cận lưới thô.

Sau đó thêm vào heuristic “h” ước lượng chi phí để đi từ mọi điểm tới điểm gần nhất trên đường đi. Heuristic cuối cùng sẽ là :

) , 2 ( ), 2 , 1 ( tan ) 1 , ( ) (n h' n w dis ce w w h' w goal h  

Hay nếu ta cần một heuristic tốt hơn nhưng sẽ đắt giá hơn, thì sẽ phải đánh giá công thức trên với tất cả các cặp điểm w1, w2 gần với các ô và ô đích riêng biệt.

Heuristic tuyến tính chính xác.

Trong những trường hợp đặc biệt, ta có thể xây dựng được một heuristic chính xác mà không cần quá trình tiền tính toán. Nếu có một bản đồ mà không tồn tại vật cản và không địa hình nào gây cản trở, thì khi đó đường đi ngắn nhất sẽ là đường thẳng từ điểm xuất phát tới điểm đích.

Nếu sử dụng một heuristic đơn giản (là một heuristic không biết tới sự tồn tại của vật cản trên bản đồ), nó sẽ phù hợp với một heuristic chính xác. Nếu không, thì ta sẽ gặp phải vấn đề với tỉ lệ hoặc loại heuristic mà ta chọn.

2.1.5. Heuristic cho bản đồ chia lưới

Trên lưới địa hình, ta có một số hàm heuristic nổi tiếng. Khoảng cách Manhattan

Heuristic thông dụng nhất là khoảng cách Manhattan. Quan sát hàm chi phí và thấy được chi phí nhỏ nhất đề di chuyển từ 1 ô tới ô liền kề là D, thì khi đó heuristic trong game của ta sẽ là D lần khoảng cách Manhattan.

) . . . . ( * ) (n D nx goalx ny goal y h    

Bạn phải sử dụng tỉ lệ phù hợp với hàm chi phí.phía dưới là heuristic có kèm theo phần gỡ rối

Một phần của tài liệu Tính toán đường đi trong môi trường giao thông động (Trang 39)