Từ quan điểm khái niệm, hãy tưởng tượng thả đá vào ao và xem gợn sóng. Các tuyến đường sẽ đại diện cho các ao và đá vị trí bắt đầu của bạn.
Tất nhiên, thuật toán sẽ phải tìm kiếm một số tỷ lệ n^2 đường dẫn khi khoảng cách n tăng. Bạn sẽ đưa bạn vị trí bắt đầu và kiểm tra tất cả các đường dẫn có sẵn từ thời điểm đó. Sau đó đệ quy gọi cho các điểm ở cuối của những đường dẫn và như vậy.
Bạn có thể tăng hiệu suất, bằng cách không kiểm tra lại đường dẫn, bằng cách không kiểm tra lại các tuyến tại một thời điểm nếu nó đã được bao phủ và bằng cách từ bỏ các đường dẫn mất quá nhiều thời gian.
Một cách khác là sử dụng phương pháp tiếp cận ant pheromone, nơi kiến bò thu thập ngẫu nhiên từ điểm bắt đầu và để lại một đường nhỏ, tạo nên nhiều kiến vượt qua một đường nhất định. Nếu bạn gửi (đủ) kiến từ cả điểm bắt đầu và điểm kết thúc thì cuối cùng con đường có mùi hương mạnh nhất sẽ là ngắn nhất. Điều này là do con đường ngắn nhất sẽ được truy cập nhiều lần hơn trong một khoảng thời gian nhất định, vì kiến kiến đi bộ với tốc độ đồng đều.
EDIT @ Spikie
Là một giải thích thêm về cách để thực hiện các thuật toán ao - cấu trúc dữ liệu tiềm năng cần được đánh dấu:
Bạn sẽ cần phải lưu trữ các bản đồ như một mạng lưới. Đây chỉ đơn giản là một tập hợp các số nodes
và edges
giữa chúng. Tập hợp số nodes
cấu thành một số route
. Một cạnh nối hai nút (có thể là cùng một nút) và có một số cost
được kết hợp như distance
hoặc time
để di chuyển qua cạnh. Một cạnh có thể là hai chiều hoặc đơn hướng. Có lẽ đơn giản nhất để chỉ có các hướng đơn hướng và tăng gấp đôi cho việc di chuyển hai chiều giữa các nút (tức là một cạnh từ A đến B và một cạnh khác từ B đến A).
Bằng cách ví dụ, hãy tưởng tượng ba ga đường sắt được sắp xếp theo tam giác đều hướng lên trên. Ngoài ra còn có thêm ba trạm mỗi nửa chừng giữa chúng. Các cạnh tham gia tất cả các trạm liền kề với nhau, sơ đồ cuối cùng sẽ có một tam giác ngược nằm bên trong tam giác lớn hơn.
Các nút nhãn bắt đầu từ dưới cùng bên trái, chuyển từ trái sang phải và lên, như A, B, C, D, E, F (F ở trên cùng).
Giả sử các cạnh có thể được di chuyển theo một trong hai hướng. Mỗi cạnh có chi phí 1 km.
Ok, vì vậy, chúng tôi muốn định tuyến từ dưới cùng bên trái A đến ga trên cùng F. Có nhiều tuyến đường có thể, bao gồm cả các tuyến đường tăng gấp đôi trở lại, ví dụ: ABCEBDEF.
Chúng tôi có thông báo là NextNode
, chấp nhận node
và cost
và tự gọi cho mỗi nút mà nút này có thể chuyển đến.
Rõ ràng nếu chúng ta để thói quen này chạy nó cuối cùng sẽ khám phá tất cả các tuyến đường, bao gồm những tuyến có khả năng có chiều dài vô hạn (ví dụ ABABABAB, v.v.). Chúng tôi ngừng điều này xảy ra bằng cách kiểm tra lại số cost
. Bất cứ khi nào chúng tôi ghé thăm một nút chưa được truy cập trước đó, chúng tôi đặt cả chi phí và nút mà chúng tôi đến từ nút đó. Nếu một nút đã được truy cập trước khi chúng tôi kiểm tra so với chi phí hiện tại và nếu chúng tôi rẻ hơn thì chúng tôi cập nhật nút và tiếp tục (đệ quy). Nếu chúng ta đắt hơn, thì chúng ta bỏ qua nút. Nếu tất cả các nút bị bỏ qua thì chúng ta thoát khỏi thường trình.
Nếu chúng tôi nhấn nút mục tiêu của mình thì chúng tôi cũng thoát khỏi quy trình.
Bằng cách này, tất cả các tuyến đường khả thi đều được chọn, nhưng chủ yếu là những tuyến có chi phí thấp nhất. Đến cuối quá trình, mỗi nút sẽ có chi phí thấp nhất để nhận được nút đó, bao gồm nút đích của chúng tôi.
Để nhận được tuyến đường, chúng tôi làm việc ngược từ nút mục tiêu của chúng tôi. Vì chúng tôi đã lưu trữ nút chúng tôi đến từ cùng với chi phí, chúng tôi chỉ cần lùi lại xây dựng tuyến đường. Ví dụ, chúng ta sẽ kết thúc với một cái gì đó như:
Node A - (Tổng) Chi phí 0 - Từ Node Không
Node B - Chi phí 1 - Từ Node Một
Node C - Chi phí 2 - Từ Node B
Nút D - Chi phí 1 - Từ Nút A
Nút E - Chi phí 2 - Từ Nút D/Chi phí 2 - Từ Nút B (đây là trường hợp ngoại lệ với chi phí bằng nhau)
Nút F - Chi phí 2 - Từ Nút D
Vì vậy, tuyến đường ngắn nhất là ADF.
Bản đồ thường quá lớn để cho phép các thuật toán đường dẫn ngắn nhất chuẩn, bạn sẽ phải xây dựng một số chẩn đoán để chọn biểu đồ con. Hơn nữa, bạn có thể sử dụng các phương pháp tiếp cận heuristic hoàn toàn khác nhau (ví dụ: đường cao tốc đầu tiên, ..) để tìm tuyến đường. –