Professional Documents
Culture Documents
Tìm hiểu và nghiên cứu thuật toán Dijkstra tìm các đường đi ngắn nhất từ một đỉnh đến các đỉnh còn lại của đồ thị có trọng số và thuật toán Floyd
Tìm hiểu và nghiên cứu thuật toán Dijkstra tìm các đường đi ngắn nhất từ một đỉnh đến các đỉnh còn lại của đồ thị có trọng số và thuật toán Floyd
các đỉnh còn lại của đồ thị có trọng số và thuật toán Floyd-Warshall tìm các đường đi ngắn
nhất giữa các cặp đỉnh của đồ thị có trọng số và thực hiện các yêu cầu sau:
1. Trình bày thuật toán Dijkstra và thuật toán Floyd-Warshall.
2. So sánh độ phức tạp về thời gian của thuật toán Dijkstra và thuật toán Floyd-Warshall.
3. So sánh khả năng ứng dụng của thuật toán Dijkstra và thuật toán Floyd-Warshall.
Thuật toán Dijkstra dùng để giải quyết bài toán đường đi ngắn nhất một
nguồn (Single-source shortest path), đồ thị trọng số không âm.
Bài toán.
D[s] = 0;
priority_queue<Node, vector<Node>, cmp> h; // hàng đợi ưu tiên, sắp xếp theo
dist[u] nhỏ nhất trước
h.push({s, D[s]});
while(!h.empty()) {
Node x = h.top();
h.pop();
int u = x.u;
if(P[u] == true) // Đỉnh u đã được chọn trước đó, bỏ qua
continue;
vector<int> path;
while (u != -1) { // truy vết ngược từ u về S
path.push_back(u);
u = trace[u];
}
reverse(path.begin(), path.end()); // cần reverse vì đường đi lúc này là từ u
về S
return path;
}
Ta nhận thấy có một cấu trúc đệ quy, chia nhỏ bài toán ở đây. Ý tưởng này cho phép
chúng ta thực hiện một thuật toán mang hương vị quy hoạch động như sau:
Cài đặt
Định nghĩa:
return path;
}
Bài toán giải Đường đi ngắn Đường đi ngắn nhất một Đường đi ngắn
quyết nhất một nguồn nguồn nhất mọi cặp đỉnh
Với đồ thị thưa, không có trọng số âm, thay vì sử dụng thuật toán Floyd, ta có thể
chạy thuật toán Dijkstra cải tiến NN lần với NN đỉnh nguồn để tìm đường đi ngắn
nhất giữa mọi cặp đỉnh, với độ phức tạp tốt hơn thuật toán Floyd:
o Ta có độ phức tạp của hai thuật toán:
Dijkstra cải tiến, NN lần: O(N∗MlogN)O(N∗MlogN)
Floyd-Warshall: O(N3)O(N3)
o Như vậy, để Dijkstra NN lần tốt hơn, ta cần
có N∗MlogN<N3N∗MlogN<N3 suy ra M<N2/logNM<N2/logN (tương
tự như so sánh giữa hai cách cài đặt thuật Dijkstra).
Ứng dụng:
Thuật toán Dijkstra dùng để tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại trong đồ
thị . Được sử dụng cho đồ thị không có cung trọng số âm.
Thuật toán Floyd dùng để tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trong đồ thị. Sử
dụng được cho các đồ thị có cung trọng số âm.
Qua đó ta thấy khả năng áp dụng của thuật toán Floyd cao hơn Dijkstra.
Một yếu tố khác biệt quan trọng khác giữa các thuật toán là hoạt
động của chúng đối với các hệ thống phân tán. Không giống như
thuật toán của Dijkstra, Floyd Warshall có thể được thực hiện trong
một hệ thống phân tán, làm cho nó phù hợp với các cấu trúc dữ
liệu như Đồ thị của Đồ thị (Được sử dụng trong Bản đồ).
Cuối cùng, Floyd Warshall làm việc cho cạnh âm nhưng không
có chu kỳ âm , trong khi thuật toán Dijkstra không hoạt động cho
các cạnh âm.
A. Dijkstra
- Bài toán tìm đường đi ngắn nhất đến một địa điểm trên bản đồ.
- định tuyến đường đi của một hệ thống mạng - loại bài toán cơ
bản mà các kỹ sư mạng cần phải biết đến:
1) Nó được sử dụng trong Google Maps
- 2) Nó được sử dụng để tìm đường đi ngắn nhất.
- 3) Nó được sử dụng trong Bản đồ địa lý
- 4) Để tìm các vị trí của Bản đồ tham chiếu đến các đỉnh của đồ
thị.
- 5) Khoảng cách giữa các vị trí đề cập đến các cạnh.
- 6) Nó được sử dụng trong định tuyến IP để tìm Mở đường dẫn
ngắn nhất Đầu tiên.
- 7) Nó được sử dụng trong mạng điện thoại.
- Áp dụng trong logictis tìm tuyến đường vận chuyển hàng hóa ít tốt
chi phí nhất
Ưu điểm và nhược điểm của thuật toán Dijkstra
1. Một trong những ưu điểm chính của nó là độ phức tạp nhỏ gần như
tuyến tính.
Mặc dù có nhiều ứng dụng và ưu điểm khác nhau, thuật toán Dijkstra cũng
có những nhược điểm, chẳng hạn như;
1. Nó thực hiện một cuộc khám phá bị che khuất tiêu tốn nhiều thời gian
trong khi xử lý,
2. Nó không thể xử lý các cạnh tiêu cực,
3. Khi nó hướng đến biểu đồ xoay vòng, vì vậy không thể đạt được
đường đi ngắn nhất chính xác và
4. Ngoài ra, cần phải duy trì theo dõi các đỉnh, đã được thăm.
https://www.analyticssteps.com/blogs/dijkstras-algorithm-shortest-path-algorithm
B. Floyd
Tìm ra ma trận Transitve Closure của đồ thị có hướng
Thuật toán Floyd Warshall giúp tìm ra sự nghịch đảo của ma trận thực
Nó giúp kiểm tra xem biểu đồ vô hướng có phải là lưỡng phân hay không
Nó giúp tìm đường đi ngắn nhất trong biểu đồ có hướng
Các phiên bản khác nhau của thuật toán Floyd Warshall giúp tìm ra điểm
đóng bắc cầu của một biểu đồ có hướng
Thuật toán này giúp tìm biểu thức chính quy được các ô tự động hữu hạn
chấp nhận.
Nó giúp tìm ra sự giống nhau giữa các biểu đồ
Thuật toán Floyd Warshall giúp tìm ra định tuyến tối ưu tức là luồng tối đa
giữa hai đỉnh
o https://www.adamconrad.dev/blog/shortest-paths/
o Đường đi ngắn nhất tất cả các cặp: Tính toán đường đi ngắn nhất giữa mọi cặp đỉnh
trong đồ thị có hướng.
o Phát hiện chu kỳ trọng số âm trong đồ thị. (Nếu có chu kỳ trọng số âm, khoảng cách
từ nút bắt đầu đến chính nó sẽ âm sau khi chạy thuật toán).
việc tìm các con đường khả thi để đi bằng ô tô với một thùng nhiên liệu hạn chế và
các trạm dừng nghỉ ở mọi nút.
cố gắng tối đa hóa tải trọng mà một xe tải chở hàng có thể chịu khi các con đường
dọc theo lối đi có thể có giới hạn trọng lượng hoặc cố gắng tìm một đường dẫn định
tuyến mạng đáp ứng yêu cầu băng thông tối thiểu cho một số ứng dụng
o Con đường an toàn nhất: Tương tự trong việc xây dựng Floyd-Warshall đến minimax
và maximin - Cần tối đa hóa tích các xác suất sống sót trên một con đường. Đơn giản
chỉ cần thay đổi giá trị tối đa thành tối thiểu để tìm ra con đường nguy hiểm nhất.
Thuật toán có thể được sử dụng để giải quyết một số vấn đề bao gồm đường đi
ngắn nhất trong đồ thị có hướng , đảo ngược ma trận thực, định tuyến tối ưu
và tính toán nhanh mạng Pathfinder
Trong Sim City, “mục tiêu” (tôi đặt trong dấu ngoặc kép vì trò chơi
kết thúc mở và không có kết thúc khách quan thực sự) là tạo ra một
thành phố sôi động, hạnh phúc của con người, hay còn gọi là
“sims”. Về cơ bản nó là một mô phỏng cô đọng trong quy hoạch đô
thị. Bạn phải cung cấp cho mọi người nguồn điện cho ngôi nhà của họ,
đường để họ đi đến nơi làm việc (và nơi làm việc), và tất cả các tiện
nghi mà một thành phố địa phương cần như trường học, đồn cảnh sát
và công viên. Nhưng bạn đặt tất cả những thứ này ở đâu để khiến mọi
người hạnh phúc?
Đối với nhiều tòa nhà, như đồn cảnh sát, chúng chỉ có thể hoạt động
trong một bán kính nhất định để ngăn chặn tội phạm một cách hiệu
quả trước khi quá muộn. Một cách hợp lý, nếu bạn đặt một đồn cảnh
sát ở rìa thị trấn và một người nào đó phạm tội ở đầu bên kia, sẽ mất
nhiều thời gian hơn để xe cảnh sát đến hiện trường so với nếu nó được
đặt ở trung tâm.
Và vì các thành phố trong Sim City có thể khá lớn, nên chỉ đặt một
đồn cảnh sát ở giữa bản đồ và hy vọng điều tốt nhất là không đủ. Bạn
sẽ cần một số trạm để bao phủ toàn bộ bản đồ. Và bản đồ của bạn,
giống như thế giới thực, không chỉ đơn giản là một lưới vuông gồm cỏ
và đồng bằng phẳng. Các đặc điểm tự nhiên như sông, đại dương và
núi có thể làm phức tạp cách một trạm có thể cảnh sát khu vực một
cách hiệu quả.
Thật may mắn cho bạn, có một thuật toán được gọi là Floyd-
Warshall có thể tìm ra một cách khách quan vị trí tốt nhất để đặt các
tòa nhà của bạn bằng cách tìm đường đi ngắn nhất cho tất cả các
cặp . Nói cách khác, tại mọi đỉnh, chúng ta có thể bắt đầu từ việc tìm
đường đi ngắn nhất trên đồ thị và xem mất bao lâu để đi đến mọi đỉnh
khác. Mỗi lần chúng ta bắt đầu lại, chúng ta giữ lại số điểm của tổng
số lượt di chuyển cần thiết cho mỗi đỉnh. Khoảng cách trung bình gần
nhất sẽ đến từ đỉnh trung tâm đó, chúng ta có thể tính toán bằng ma
trận kề. Và vì bây giờ chúng tôi đang thêm một lớp kiểm tra mọi đỉnh
khác trên đỉnh của cái về cơ bản là của Dijkstra, nên thuật toán này sẽ
chạy O(n^3) đúng lúc.
Floyd-Warshall không thực sự tạo ra một giá trị trả về kỳ lạ của vị trí
tối ưu. Thay vào đó, nó trả về ma trận khoảng cách với tất cả các
đường đi tối ưu được vạch ra, thường là đủ cho hầu hết các vấn đề
thuộc phạm vi này. Mặc dù thời gian khối có vẻ chậm, nhưng thực tế
là thuật toán này chạy nhanh trong thực tế, một phần vì nó sử dụng ma
trận kề để xử lý ánh xạ tất cả các giá trị khoảng cách của nó (một trong
những trường hợp hiếm hoi mà chúng tôi đã đề cập ban đầu là ma trận
kề là cấu trúc dữ liệu tốt hơn danh sách kề). Nó cũng giúp thuật toán
cũng dễ triển khai:
https://vnoi.info/wiki/algo/graph-theory/shortest-path.md?
fbclid=IwAR0gtDIkDmXDVjSRnDYt44mTZopGc5R4fizrFykzO0c2ASSKNohJ9vfOSis#2-
thu%E1%BA%ADt-to%C3%A1n-dijkstra