Luận văn Thạc sĩ: Tối ưu đường đi bằng Dijkstra, Fibonacci Heap, ACO (Nghiêm Quang Khải)

Luận văn thạc sĩ nghiên cứu thuật toán Dijkstra, Fibonacci Heap và ACO để tìm đường đi tối ưu, ứng dụng trong nhiều bài toán thực tế.

Chuyên ngành

Khoa học Máy tính

Người đăng

Ẩn danh

Thể loại

Luận văn Thạc sĩ

2015

74
3
0

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI CAM ĐOAN

MỞ ĐẦU

1. CHƯƠNG 1: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI TỐI ƯU TRÊN ĐỒ THỊ

1.1. Các khái niệm cơ bản của lý thuyết đồ thị

1.1.1. Định nghĩa đồ thị

1.1.2. Các thuật ngữ cơ bản

1.1.3. Đường đi, chu trình, đồ thị liên thông

1.1.4. Đồ thị có trọng số

1.2. Bài toán đường đi tối ưu trên đồ thị

1.3. Thuật toán Dijkstra

1.3.1. Phát biểu bài toán.Mô tả thuật toán

1.4. Thuật toán Dijkstra kết hợp với Fibonacci heap

1.4.1. Hàng đợi ưu tiên

1.4.2. Sơ đồ thuật toán Dijkstra kết hợp với Fibonacci Heap

1.5. Kết luận chương

2. CHƯƠNG 2: THUẬT TOÁN ĐÀN KIẾN GIẢI BÀI TOÁN TÌM ĐƯỜNG ĐI TỐI ƯU

2.1. Từ kiến tự nhiên đến kiến nhân tạo

2.1.1. Kiến tự nhiên

2.1.2. Kiến nhân tạo

2.2. Thuật toán ACO tổng quát giải bài toán ngươi chào hàng

2.2.1. Thuật toán ACO tổng quát giải bài toán TSP

2.3. Các thuật toán ACO giải bài toán TSP

2.3.1. Thuật toán AS

2.3.2. Thuật toán ACS

2.3.3. Thuật toán Max-Min (MMAS)

2.4. Một số vấn đề trong việc áp dụng ACO tìm đường đi tối ưu

2.4.1. ACO kết hợp với tìm kiếm cục bộ

2.4.2. Thông tin heuristic

2.4.3. Số lượng kiến

2.4.4. Tham số bay hơi

2.5. Một số đề xuất cải tiến

2.6. Kết luận chương

3. CHƯƠNG 3: ỨNG DỤNG THUẬT TOÁN DIJKSTRA FIBONACCI HEAP, THUẬT TOÁN ACO GIẢI CÁC BÀI TOÁN TÌM ĐƯỜNG ĐI TRÊN MẠNG GIAO THÔNG

3.1. Ứng dụng Dijkstra Fibonacci heap

3.1.1. Phát biểu bài toán 1

3.1.2. Mô hình hoá bài toán

3.1.3. Mô tả input, output

3.1.4. Một số kiểu dữ liệu và các biến trong chương trình

3.1.5. Một số hàm và thủ tục trong chương trình

3.1.6. Các kết quả thực nghiệm giải bài toán 1

3.2. Ứng dụng Dijkstra Fibonacci heap, ACO giải bài toán TSP mở rộng

3.2.1. Phát biểu bài toán 2

3.2.2. Mô hình hoá bài toán

3.2.3. Mô tả input, output

3.2.4. Thuật toán tổng quát giải bài toán 2

3.2.5. Một số hàm và thủ tục trong chương trình

3.2.6. Sơ đồ tổng quát của thuật toán giải bài toán 2

3.2.7. Các kết quả thực nghiệm giải bài toán 2

3.3. Kết luận chương

TÀI LIỆU THAM KHẢO

Tóm tắt

I. Dijkstra Fibonacci Heap ACO Khám phá tối ưu đường đi hiện đại

Việc tối ưu đường đi đóng vai trò thiết yếu trong nhiều lĩnh vực của khoa học máy tínhvận trù học. Từ những hệ thống định vị vệ tinh quen thuộc đến các mạng lưới giao thông phức tạp, hay chuỗi cung ứng toàn cầu, nhu cầu tìm kiếm đường đi ngắn nhất hoặc hiệu quả nhất luôn hiện hữu. Sự phát triển không ngừng của công nghệ và khối lượng dữ liệu khổng lồ đòi hỏi các giải thuật tối ưu đường đi phải ngày càng thông minh và mạnh mẽ hơn. Bài viết này khám phá ba phương pháp nổi bật: thuật toán Dijkstra, cấu trúc dữ liệu Fibonacci Heapthuật toán Ant Colony Optimization (ACO).

Thuật toán Dijkstra là nền tảng cho nhiều bài toán tìm kiếm đường đi ngắn nhất trên đồ thị có trọng số không âm. Tuy nhiên, khi đối mặt với các mạng lưới giao thông quy mô lớn, độ phức tạp của nó cần được cải thiện. Đây là lúc Fibonacci Heap phát huy tác dụng, nâng cao hiệu suất xử lý của Dijkstra thông qua việc quản lý hàng đợi ưu tiên một cách tối ưu hơn. Trong khi đó, Ant Colony Optimization (ACO), một metaheuristic algorithm lấy cảm hứng từ tự nhiên, mang đến một cách tiếp cận khác cho các bài toán tối ưu đường đi phức tạp, đặc biệt là những bài toán thuộc lớp NP-khó như bài toán người du lịch (TSP).

Mục tiêu chính của việc nghiên cứu và ứng dụng các thuật toán này là tối ưu hóa tài nguyên, tiết kiệm thời gian và chi phí, đồng thời nâng cao hiệu quả hoạt động của các hệ thống. Theo Nghiêm Quang Khải (2015), "Nếu xây dựng được các thuật toán tốt sẽ giúp tiết kiệm được rất nhiều tiền bạc, thời gian, công sức của con người." Sự kết hợp giữa các giải pháp cổ điển và hiện đại này tạo nên một bức tranh toàn diện về cách chúng ta giải quyết những thách thức tối ưu đường đi trong kỷ nguyên số.

1.1. Tổng quan Định nghĩa bài toán tối ưu đường đi và tầm quan trọng

Bài toán tối ưu đường đi là một khái niệm trung tâm trong lý thuyết đồ thị, đặt ra yêu cầu tìm kiếm một đường đi giữa hai hoặc nhiều điểm sao cho nó thỏa mãn một tiêu chí tối ưu hóa nhất định, ví dụ như đường đi ngắn nhất, chi phí thấp nhất, hoặc thời gian di chuyển nhanh nhất. Các đồ thị được sử dụng để mô hình hóa các mạng lưới phức tạp, nơi các "đỉnh" đại diện cho các vị trí và "cạnh" biểu thị các kết nối giữa chúng, thường đi kèm với trọng số cạnh thể hiện chi phí hoặc khoảng cách. Tầm quan trọng của bài toán này thể hiện rõ trong cuộc sống hàng ngày, từ việc lập kế hoạch tuyến đường cho hệ thống giao thông công cộng, quy hoạch đường đi trong logistics optimization, cho đến việc định tuyến gói tin trên mạng máy tính. Việc giải quyết hiệu quả các bài toán này không chỉ mang lại lợi ích kinh tế mà còn nâng cao chất lượng dịch vụ và tối ưu hóa vận hành.

1.2. Mục tiêu Giới thiệu các thuật toán trọng yếu trong tối ưu hóa

Mục tiêu của bài viết là cung cấp một cái nhìn tổng quan và chuyên sâu về ba giải thuật tối ưu đường đi trọng yếu: thuật toán Dijkstra, Fibonacci Heap (như một công cụ cải tiến cho Dijkstra) và thuật toán Ant Colony Optimization (ACO). Cụ thể, bài viết tập trung vào nguyên lý hoạt động, ưu điểm, nhược điểm và khả năng ứng dụng của từng thuật toán. Thuật toán Dijkstra được giới thiệu với vai trò là một phương pháp kinh điển, trong khi Fibonacci Heap được phân tích như một cấu trúc dữ liệu tiên tiến giúp giảm độ phức tạp thuật toán của Dijkstra. Đồng thời, thuật toán kiến (ACO) được trình bày như một metaheuristic algorithm hiệu quả cho các bài toán tối ưu hóa phức tạp mà các phương pháp truyền thống khó giải quyết. Việc này nhằm trang bị kiến thức cần thiết để lựa chọn và áp dụng đúng thuật toán cho các tình huống tối ưu đường đi khác nhau.

1.3. Khoa học máy tính Vận trù học Lĩnh vực ứng dụng rộng rãi

Khoa học máy tínhvận trù học là hai lĩnh vực song hành, cùng nhau phát triển các phương pháp và công cụ để giải quyết các vấn đề tối ưu hóa phức tạp, đặc biệt là tối ưu đường đi. Trong khoa học máy tính, các thuật toán tìm đường đi ngắn nhất như Dijkstra là một phần không thể thiếu trong giáo trình và ứng dụng phần mềm. Trong vận trù học, các kỹ thuật tối ưu hóa như ACO được sử dụng để giải quyết các vấn đề quản lý chuỗi cung ứng, lập lịch trình sản xuất, và logistics optimization. Cả hai lĩnh vực đều hưởng lợi từ việc nghiên cứu và triển khai các giải thuật tối ưu đường đi hiệu quả. Sự giao thoa này thúc đẩy việc tạo ra các giải pháp sáng tạo, từ các hệ thống GPS thông minh đến các mô hình quy hoạch đường đi cho xe tự lái, góp phần vào sự phát triển của công nghệ và kinh tế.

II. Thách thức lớn Vì sao cần các giải thuật tối ưu đường đi phức tạp

Mặc dù bài toán tối ưu đường đi có vẻ đơn giản trên lý thuyết, nhưng khi áp dụng vào các tình huống thực tế, chúng thường gặp phải những thách thức đáng kể. Quy mô của các mạng lưới giao thông hay mạng máy tính có thể lên đến hàng triệu đỉnh và cạnh, khiến các thuật toán đơn giản trở nên kém hiệu quả. Hơn nữa, tính chất của đồ thị (có hướng, vô hướng, có trọng số cạnh dương hoặc âm) cũng ảnh hưởng lớn đến việc lựa chọn giải thuật tối ưu đường đi phù hợp. Một thách thức lớn khác là sự phức tạp tính toán của nhiều bài toán tối ưu hóa, điển hình là bài toán người du lịch (TSP), thuộc lớp NP-khó.

Các thuật toán tìm đường đi ngắn nhất cơ bản như BFS (Breadth-First Search) hay Bellman-Ford algorithm có những giới hạn nhất định. BFS chỉ hoạt động trên đồ thị không có trọng số hoặc trọng số bằng nhau, trong khi Bellman-Ford có thể xử lý trọng số âm nhưng lại kém hiệu quả hơn khi trọng số đều dương. Thuật toán Dijkstra ban đầu, dù mạnh mẽ, lại có độ phức tạp thuật toán là O(V^2), điều này không khả thi cho các đồ thị lớn. Như luận văn của Nghiêm Quang Khải (2015) đã chỉ ra: "Thuật toán Dijkstra cài đặt như trên sẽ có độ phức tạp O(n2), kết quả này là không khả thi cho đồ thị có số đỉnh n lớn." Do đó, việc nghiên cứu và phát triển các giải thuật tối ưu đường đi phức tạp hơn, có khả năng xử lý quy mô lớn và tính toán hiệu quả hơn là điều cần thiết để đáp ứng nhu cầu ngày càng cao của các ứng dụng tối ưu hóa hiện đại.

2.1. Đồ thị có trọng số Hiểu các khái niệm cơ bản và cấu trúc

Trước khi đi sâu vào các giải thuật tối ưu đường đi, việc nắm vững các khái niệm cơ bản của lý thuyết đồ thị là điều tối quan trọng. Một đồ thị được định nghĩa là một tập hợp các đỉnh (nodes) và các cạnh (edges) nối các đỉnh này. Trong bối cảnh tối ưu đường đi, đồ thị có trọng số là loại phổ biến nhất, nơi mỗi cạnh được gán một giá trị số, gọi là trọng số cạnh. Giá trị này có thể biểu thị khoảng cách, thời gian, chi phí, hoặc bất kỳ yếu tố định lượng nào khác liên quan đến việc di chuyển qua cạnh đó. Đồ thị có thể là vô hướng (kết nối hai chiều) hoặc có hướng (kết nối một chiều), ảnh hưởng trực tiếp đến cách các thuật toán tìm đường đi ngắn nhất hoạt động. Hiểu rõ cấu trúc và thuộc tính của các loại đồ thị này là nền tảng để lựa chọn và áp dụng hiệu quả các thuật toán Dijkstra, Fibonacci Heap, hay ACO.

2.2. Giới hạn của thuật toán truyền thống và độ phức tạp tính toán

Các thuật toán tìm đường đi ngắn nhất truyền thống, mặc dù là nền tảng, nhưng bộc lộ nhiều giới hạn khi đối mặt với quy mô và độ phức tạp của các bài toán thực tế. Ví dụ, thuật toán Bellman-Ford có thể xử lý đồ thị có trọng số âm nhưng lại có độ phức tạp thuật toán cao, thường là O(VE), khiến nó không phù hợp cho các đồ thị lớn. Ngay cả thuật toán Dijkstra nguyên thủy, dù hiệu quả với trọng số dương, cũng có độ phức tạp thuật toán là O(V^2) khi được cài đặt bằng mảng thông thường. Điều này đồng nghĩa với việc thời gian chạy sẽ tăng lên đáng kể theo số lượng đỉnh của đồ thị, trở thành rào cản lớn cho các ứng dụng tối ưu hóa yêu cầu phản hồi nhanh. Nhu cầu giảm thiểu độ phức tạp thuật toán là động lực chính thúc đẩy việc tìm kiếm các cấu trúc dữ liệu và phương pháp cải tiến như Fibonacci Heap.

2.3. Bài toán Người Du Lịch TSP Ví dụ điển hình về tối ưu toàn cục

Bài toán người du lịch (Traveling Salesman Problem - TSP) là một trong những bài toán tối ưu đường đi nổi tiếng và khó nhất trong khoa học máy tínhvận trù học. Phát biểu đơn giản, một người chào hàng cần thăm tất cả các thành phố trong một danh sách chính xác một lần và quay trở về thành phố xuất phát, với mục tiêu là tổng độ dài đường đi là ngắn nhất. Đây là một ví dụ điển hình của bài toán tối ưu toàn cục và thuộc lớp NP-khó, nghĩa là không có thuật toán đa thức nào được biết đến có thể giải nó một cách hiệu quả cho số lượng thành phố lớn. Sự phức tạp của TSP đã thúc đẩy sự phát triển của các metaheuristic algorithm như Ant Colony Optimization (ACO), bởi các phương pháp truyền thống như Dijkstra không thể giải quyết hiệu quả các bài toán tìm chu trình Hamilton có trọng số nhỏ nhất.

III. Phương pháp Dijkstra Fibonacci Heap Tăng tốc tìm đường ngắn nhất

Thuật toán Dijkstra là một trong những giải thuật tối ưu đường đi kinh điển và được sử dụng rộng rãi nhất để tìm đường đi ngắn nhất từ một đỉnh nguồn đến tất cả các đỉnh khác trong một đồ thị có trọng số mà không có cạnh trọng số âm. Nguyên lý hoạt động của thuật toán Dijkstra là duyệt qua các đỉnh, liên tục cập nhật khoảng cách ngắn nhất đến mỗi đỉnh và đánh dấu các đỉnh đã được "ghé thăm" một cách tối ưu. Tuy nhiên, hiệu suất của thuật toán này phụ thuộc đáng kể vào cấu trúc dữ liệu được sử dụng để quản lý các đỉnh chưa được duyệt. Khi cài đặt đơn giản bằng mảng, độ phức tạp thuật toán của Dijkstra là O(V^2), trở thành rào cản đối với các đồ thị lớn có hàng chục nghìn hoặc hàng triệu đỉnh.

Để khắc phục hạn chế này, cấu trúc dữ liệu Fibonacci Heap đã được đề xuất để cải thiện thời gian chạy của thuật toán Dijkstra. Fibonacci Heap là một loại hàng đợi ưu tiên nâng cao, cho phép các thao tác như "giảm khóa" (Decrease-Key) và "trích nút cực tiểu" (Extract-Min) được thực hiện với độ phức tạp thuật toán trung bình rất thấp. Cụ thể, việc kết hợp Dijkstra với Fibonacci Heap giúp giảm độ phức tạp thuật toán xuống còn O(E + V log V), trong đó V là số đỉnh và E là số cạnh của đồ thị. Theo Nghiêm Quang Khải (2015), "Với những đồ thị thưa thì đây sẽ là một thuật toán rất tốt." Điều này làm cho Dijkstra với Priority Queue (Fibonacci Heap) trở thành lựa chọn ưu việt cho bài toán tối ưu đường đi trên các mạng lưới giao thông hay mạng máy tính quy mô lớn và thưa. Sự kết hợp này minh chứng cho tầm quan trọng của việc lựa chọn cấu trúc dữ liệu phù hợp để tối ưu hóa hiệu suất của các giải thuật tối ưu đường đi cơ bản.

3.1. Thuật toán Dijkstra Nguyên lý cốt lõi tìm đường đi ngắn nhất

Thuật toán Dijkstra được phát minh bởi Edsger W. Dijkstra vào năm 1956, là một thuật toán tìm đường đi ngắn nhất dựa trên nguyên tắc tham lam. Nguyên lý cốt lõi của giải thuật Dijkstra là duy trì một tập hợp các đỉnh đã được "cố định nhãn" (tức là đã tìm thấy đường đi ngắn nhất từ nguồn đến chúng) và liên tục mở rộng tập hợp này. Tại mỗi bước lặp, thuật toán chọn một đỉnh chưa được cố định có khoảng cách ước tính nhỏ nhất từ đỉnh nguồn, sau đó cập nhật khoảng cách cho các đỉnh kề chưa cố định. Quá trình này được gọi là "sửa nhãn". Thuật toán Dijkstra chỉ hoạt động đúng với đồ thị có trọng số không âm, bởi nếu có trọng số âm, nó có thể không tìm thấy đường đi ngắn nhất thực sự. Sự đơn giản và hiệu quả của nó với trọng số dương đã làm cho Dijkstra trở thành một công cụ cơ bản trong khoa học máy tính để giải quyết các bài toán tối ưu đường đi.

3.2. Cấu trúc dữ liệu Fibonacci Heap Cải thiện hiệu suất với hàng đợi ưu tiên

Fibonacci Heap là một cấu trúc dữ liệu Fibonacci Heap phức tạp nhưng cực kỳ hiệu quả, đóng vai trò quan trọng trong việc cải thiện độ phức tạp thuật toán của các giải thuật tối ưu đường đi như Dijkstra. Về cơ bản, Fibonacci Heap là một dạng hàng đợi ưu tiên cho phép thực hiện các thao tác như chèn (Insert), tìm cực tiểu (Find-Min), trích cực tiểu (Extract-Min), và giảm khóa (Decrease-Key) với thời gian khấu trừ (amortized time) cực kỳ thấp. Đặc biệt, thao tác Decrease-Key có độ phức tạp thuật toán là O(1), điều này là yếu tố then chốt giúp tối ưu hóa Dijkstra. Thay vì duyệt mảng để tìm đỉnh có nhãn nhỏ nhất như cài đặt gốc (O(V)), Dijkstra với Priority Queue dùng Fibonacci Heap có thể tìm và cập nhật đỉnh nhanh hơn nhiều, đặc biệt trên các đồ thị thưa. Sự phức tạp trong cài đặt là một rào cản, nhưng hiệu quả về thời gian chạy là không thể phủ nhận đối với ứng dụng tối ưu hóa quy mô lớn.

3.3. Sơ đồ thuật toán Tối ưu Dijkstra với Fibonacci Heap nâng cao

Việc tối ưu thuật toán Dijkstra bằng Fibonacci Heap đòi hỏi thay đổi cách thức quản lý các đỉnh chưa được cố định. Thay vì dùng mảng hoặc hàng đợi ưu tiên đơn giản, một Fibonacci Heap sẽ được sử dụng để lưu trữ các đỉnh và khoảng cách ước tính từ nguồn. Khi cần tìm đỉnh có khoảng cách nhỏ nhất, thao tác EXTRACT_MIN của Fibonacci Heap sẽ cung cấp đỉnh đó trong thời gian O(logV). Khi một khoảng cách mới được tìm thấy (thao tác "sửa nhãn"), DECREASE_KEY của Fibonacci Heap được gọi để cập nhật khoảng cách của đỉnh tương ứng, với độ phức tạp thuật toán O(1). Sự kết hợp này giúp tổng độ phức tạp thuật toán của Dijkstra với Priority Queue giảm đáng kể, từ O(V^2) xuống O(E + V log V). Sơ đồ thuật toán mới này tạo ra một phương pháp mạnh mẽ hơn cho bài toán tối ưu đường đi, đặc biệt thích hợp cho các mạng lưới giao thông hoặc mạng máy tính lớn.

IV. Giải pháp ACO Bí quyết tối ưu đường đi phức tạp từ tự nhiên

Khi đối mặt với các bài toán tối ưu đường đi phức tạp mà các giải thuật tối ưu đường đi truyền thống như thuật toán Dijkstra gặp khó khăn, đặc biệt là các bài toán thuộc lớp NP-khó như bài toán người du lịch (TSP), Ant Colony Optimization (ACO) nổi lên như một giải pháp mạnh mẽ. Thuật toán ACO là một metaheuristic algorithm thuộc nhóm tối ưu hóa bầy đàn (swarm intelligence), mô phỏng hành vi tìm kiếm thức ăn của loài kiến trong tự nhiên. Các con kiến nhân tạo (agents) tìm kiếm đường đi bằng cách tương tác với môi trường thông qua một chất hóa học gọi là pheromone.

Nguyên lý cơ bản của thuật toán kiến ACO là các con kiến sẽ di chuyển ngẫu nhiên trên đồ thị, để lại một lượng pheromone trên các cạnh chúng đi qua. Pheromone tích tụ nhiều hơn trên những đường đi ngắn và hiệu quả hơn. Các con kiến sau đó có xu hướng đi theo những đường có nồng độ pheromone cao hơn, tạo thành một phản hồi tích cực. Tuy nhiên, pheromone cũng bay hơi theo thời gian, giúp thuật toán tránh mắc kẹt trong các lời giải tối ưu cục bộ và khuyến khích khám phá các đường đi mới. Theo Nghiêm Quang Khải (2015), "Việc bay hơi vết mùi là cơ chế tiện lợi cho việc tìm đường mới, nghĩa là việc bay hơi có thể giúp kiến quên đi đường đi tối ưu cục bộ đã được tìm thấy trước đây để tìm khám phá đường đi mới, tốt hơn." Sự linh hoạt và khả năng xử lý các bài toán có không gian lời giải lớn đã làm cho Ant Colony Optimization (ACO) trở thành công cụ quan trọng trong ứng dụng tối ưu hóa đa dạng, từ logistics optimization đến quy hoạch đường đi trong robot học.

4.1. Ant Colony Optimization ACO Mô phỏng hành vi kiến tự nhiên

Ant Colony Optimization (ACO) bắt nguồn từ việc quan sát cách các đàn kiến tự nhiên tìm đường hiệu quả từ tổ đến nguồn thức ăn. Mặc dù từng con kiến có khả năng nhận thức hạn chế, nhưng thông qua sự tương tác gián tiếp bằng pheromone, cả đàn có thể tìm thấy đường đi ngắn nhất. Thuật toán kiến ACO mô phỏng hành vi này bằng cách sử dụng các "kiến nhân tạo" di chuyển trên một đồ thị biểu diễn bài toán. Mỗi kiến nhân tạo xây dựng một lời giải bằng cách di chuyển từ đỉnh này sang đỉnh khác, để lại một lượng pheromone trên các cạnh đã đi qua. Nồng độ pheromone trên một cạnh ảnh hưởng đến xác suất các kiến khác chọn cạnh đó. Cơ chế tối ưu hóa bầy đàn (swarm intelligence) này cho phép ACO tìm ra các lời giải gần tối ưu cho các bài toán tối ưu đường đi phức tạp mà các phương pháp truyền thống khó giải quyết.

4.2. Cơ chế Pheromone Thông tin Heuristic Cách kiến nhân tạo học hỏi

Trong Ant Colony Optimization (ACO), pheromone đóng vai trò là "bộ nhớ tập thể" của đàn kiến, biểu thị chất lượng của các đường đi đã được khám phá. Mỗi khi một kiến nhân tạo hoàn thành một đường đi (tạo ra một lời giải), nó sẽ cập nhật lượng pheromone trên các cạnh thuộc đường đi đó. Các đường đi ngắn hơn hoặc tốt hơn sẽ nhận được nhiều pheromone hơn. Bên cạnh pheromone, thông tin heuristic cũng là một yếu tố quan trọng. Thông tin heuristic thường là một hàm ước lượng độ "mong muốn" của việc chọn một cạnh cụ thể, ví dụ như nghịch đảo của trọng số cạnh (độ dài). Sự kết hợp giữa pheromone (kinh nghiệm đã học) và thông tin heuristic (kiến thức cục bộ) định hướng quá trình tìm kiếm của các kiến nhân tạo, giúp chúng khám phá không gian lời giải một cách hiệu quả hơn để đạt được tối ưu toàn cục.

4.3. Các thuật toán ACO chính AS ACS MMAS và điểm khác biệt

Có nhiều biến thể của Ant Colony Optimization (ACO), mỗi biến thể có những điều chỉnh riêng về cách thức kiến xây dựng lời giải và cập nhật pheromone. Ba thuật toán chính được nghiên cứu nhiều là Ant System (AS), Ant Colony System (ACS) và Max-Min Ant System (MMAS). AS là phiên bản đầu tiên, nơi tất cả các kiến đều để lại pheromone và có cơ chế bay hơi đơn giản. ACS cải tiến bằng cách tập trung cập nhật pheromone trên lời giải tốt nhất đã tìm thấy (global-best) và giới thiệu cơ chế cập nhật pheromone cục bộ ngay khi kiến đi qua một cạnh, khuyến khích khám phá. MMAS tiếp tục phát triển bằng cách giới hạn lượng pheromone tối thiểu (Tmin) và tối đa (Tmax) trên mỗi cạnh để tránh tình trạng hội tụ sớm và tăng cường khả năng khám phá. Những điểm khác biệt này tạo ra sự đa dạng trong hiệu suất và khả năng áp dụng của các thuật toán kiến ACO cho các loại bài toán tối ưu đường đi khác nhau.

V. Ứng dụng thực tế Dijkstra Fibonacci Heap ACO biến đổi cuộc sống

Các giải thuật tối ưu đường đi như thuật toán Dijkstra, Fibonacci Heap (nhằm tối ưu Dijkstra), và Ant Colony Optimization (ACO) không chỉ là những khái niệm trừu tượng trong khoa học máy tính mà còn có vô số ứng dụng tối ưu hóa thực tiễn, biến đổi cách chúng ta tương tác với thế giới xung quanh. Từ việc định vị trên bản đồ đến quy hoạch đường đi phức tạp cho xe tự hành, những thuật toán này đóng vai trò then chốt trong việc tạo ra các hệ thống thông minh và hiệu quả.

Trong logistics optimization, các công ty vận tải sử dụng các thuật toán tìm đường đi ngắn nhất để lập kế hoạch tuyến đường giao hàng, giảm thiểu chi phí nhiên liệu và thời gian vận chuyển. Hệ thống định vị (GPS), một phần không thể thiếu của cuộc sống hiện đại, dựa vào các thuật toán tương tự Dijkstra để tính toán đường đi ngắn nhất từ điểm xuất phát đến điểm đích, cung cấp hướng dẫn chính xác cho người dùng. Đối với các mạng lưới giao thông phức tạp, việc phân tích thuật toán và áp dụng các phương pháp tối ưu giúp quản lý luồng xe cộ, giảm ùn tắc và nâng cao an toàn. Ngay cả trong thiết kế chip điện tử hay định tuyến gói tin trong mạng máy tính, các nguyên lý tối ưu đường đi cũng được áp dụng rộng rãi. Sự linh hoạt của thuật toán kiến ACO cho phép nó giải quyết các bài toán tối ưu toàn cục phức tạp hơn, như bài toán người du lịch (TSP) mở rộng, tìm kiếm giải pháp tối ưu cho các vấn đề phân phối hàng hóa đa điểm. Nhìn chung, khả năng của Dijkstra, Fibonacci Heap, ACO trong việc giải quyết các bài toán tối ưu đường đi đã và đang mang lại những tác động tích cực đáng kể đến nhiều ngành công nghiệp và dịch vụ.

5.1. Quy hoạch đường đi Từ hệ thống định vị GPS đến logistics vận tải

Một trong những ứng dụng tối ưu hóa phổ biến nhất của các giải thuật tối ưu đường đi là trong quy hoạch đường đi. Hệ thống định vị (GPS) trên ô tô và điện thoại thông minh là ví dụ điển hình, sử dụng thuật toán Dijkstra hoặc các biến thể của nó để nhanh chóng tính toán đường đi ngắn nhất giữa hai điểm. Trong lĩnh vực logistics vận tải, các công ty sử dụng các thuật toán tìm đường đi ngắn nhất để tối ưu hóa tuyến đường cho đội xe giao hàng, giảm thiểu quãng đường di chuyển, tiết kiệm nhiên liệu và thời gian. Điều này không chỉ giúp giảm chi phí mà còn nâng cao hiệu quả hoạt động và sự hài lòng của khách hàng. Các bài toán logistics optimization thường phức tạp hơn với nhiều ràng buộc (thời gian giao hàng, sức chứa xe), nơi các metaheuristic algorithm như Ant Colony Optimization (ACO) phát huy hiệu quả mạnh mẽ, tìm kiếm các giải pháp gần tối ưu cho các tuyến đường phức tạp.

5.2. Mạng lưới giao thông Tối ưu hóa tuyến đường và phân luồng hiệu quả

Trong mạng lưới giao thông đô thị và quốc gia, tối ưu đường đi là yếu tố then chốt để đảm bảo luồng di chuyển suôn sẻ. Các thành phố lớn sử dụng các giải thuật tối ưu đường đi để phân tích thuật toán và quản lý lưu lượng giao thông, đề xuất các tuyến đường thay thế khi có tắc nghẽn hoặc sự cố. Bằng cách áp dụng thuật toán Dijkstra hoặc các phương pháp tối ưu hóa bầy đàn (swarm intelligence) như ACO, các nhà quản lý có thể xác định các nút cổ chai, điều chỉnh đèn tín hiệu, hoặc định tuyến lại giao thông để giảm thời gian chờ đợi và giảm ô nhiễm. Việc này không chỉ cải thiện trải nghiệm lái xe mà còn tăng cường an toàn giao thông và hiệu quả sử dụng hạ tầng. Các ứng dụng tối ưu hóa trong mạng lưới giao thông đang ngày càng trở nên quan trọng với sự phát triển của các thành phố thông minh.

5.3. Phát triển robot tự hành Điều hướng và tránh vật cản thông minh

Lĩnh vực robot tự hành là một ứng dụng tối ưu hóa đầy tiềm năng cho Dijkstra, Fibonacci Heap, ACO. Robot di động, drone, và xe tự lái cần khả năng điều hướng thông minh để di chuyển trong môi trường phức tạp. Các thuật toán tìm đường đi ngắn nhất giúp robot lập kế hoạch tuyến đường từ điểm hiện tại đến đích, đồng thời tránh các vật cản. Thuật toán Dijkstra có thể được sử dụng để tìm đường đi trên bản đồ môi trường đã biết. Khi môi trường động hoặc có nhiều yếu tố không chắc chắn, các phương pháp tối ưu hóa bầy đàn như ACO, với khả năng thích ứng và khám phá, có thể giúp robot tìm đường hiệu quả hơn, thậm chí trong các tình huống cần tối ưu toàn cục lộ trình phức tạp. Khả năng tối ưu đường đi thông minh là yếu tố cốt lõi giúp các hệ thống robot tự hành hoạt động an toàn và hiệu quả trong nhiều môi trường khác nhau.

VI. Tổng kết Tương lai Phát triển tối ưu đường đi không ngừng nghỉ

Trong bài viết này, đã khám phá ba phương pháp trọng yếu trong bài toán tối ưu đường đi: thuật toán Dijkstra, cấu trúc dữ liệu Fibonacci Heap, và thuật toán Ant Colony Optimization (ACO). Mỗi phương pháp đều có những ưu điểm và lĩnh vực ứng dụng riêng. Thuật toán Dijkstra cung cấp một giải pháp hiệu quả để tìm đường đi ngắn nhất trên đồ thị có trọng số không âm, và hiệu suất của nó được tăng cường đáng kể khi kết hợp với Fibonacci Heap để quản lý hàng đợi ưu tiên. Sự kết hợp này giảm độ phức tạp thuật toán xuống O(E + V log V), làm cho nó phù hợp với các mạng lưới giao thôngmạng máy tính lớn, thưa.

Trong khi đó, Ant Colony Optimization (ACO), với khả năng tối ưu hóa bầy đàn và cơ chế pheromone linh hoạt, trở thành một công cụ đắc lực cho các bài toán tối ưu đường đi phức tạp hơn, thuộc lớp NP-khó như bài toán người du lịch (TSP). Sự khác biệt giữa các biến thể ACO như AS, ACS, và MMAS thể hiện nỗ lực không ngừng trong việc tinh chỉnh metaheuristic algorithm này để đạt được hiệu quả tối ưu toàn cục tốt hơn. Các ứng dụng tối ưu hóa của cả ba phương pháp trải rộng từ hệ thống định vị (GPS), logistics optimization, quy hoạch đường đi, đến robot tự hành, minh chứng cho tầm quan trọng của chúng trong đời sống hiện đại.

Tương lai của tối ưu đường đi hứa hẹn nhiều phát triển mới, với sự ra đời của các thuật toán lai và sự tích hợp sâu hơn với trí tuệ nhân tạo và học máy. Việc tiếp tục phân tích thuật toán và tìm kiếm các giải pháp sáng tạo sẽ tiếp tục là động lực cho sự phát triển của khoa học máy tínhvận trù học, giải quyết những thách thức tối ưu đường đi ngày càng phức tạp.

6.1. So sánh hiệu quả Lựa chọn thuật toán phù hợp cho từng bài toán

Việc lựa chọn giải thuật tối ưu đường đi phù hợp phụ thuộc vào tính chất cụ thể của bài toán tối ưu đường đi. Đối với các đồ thị có trọng số không âm và mục tiêu tìm đường đi ngắn nhất từ một nguồn đến tất cả các đỉnh, thuật toán Dijkstra là lựa chọn hàng đầu. Khi đồ thị lớn và thưa, việc sử dụng Fibonacci Heap để cải thiện Dijkstra là cần thiết để đạt được độ phức tạp thuật toán tối ưu O(E + V log V). Ngược lại, khi đối mặt với các bài toán phức tạp hơn như bài toán người du lịch (TSP), nơi cần tìm kiếm tối ưu toàn cục trên không gian rộng lớn và có thể có nhiều ràng buộc, các metaheuristic algorithm như Ant Colony Optimization (ACO) sẽ là phương pháp hiệu quả hơn, cung cấp các lời giải gần tối ưu trong thời gian chấp nhận được. Việc phân tích thuật toán kỹ lưỡng các yêu cầu của bài toán là chìa khóa để đưa ra quyết định lựa chọn đúng đắn.

6.2. Thách thức và xu hướng mới Kết hợp thuật toán lai và tối ưu động

Lĩnh vực tối ưu đường đi không ngừng đối mặt với các thách thức mới, như việc xử lý đồ thị động (nơi cấu trúc hoặc trọng số cạnh thay đổi theo thời gian) hoặc bài toán tối ưu đa mục tiêu (cần cân bằng giữa nhiều yếu tố như thời gian, chi phí và khoảng cách). Xu hướng hiện nay là phát triển các thuật toán lai, kết hợp ưu điểm của nhiều phương pháp khác nhau, ví dụ như kết hợp ACO với các kỹ thuật tìm kiếm cục bộ hoặc học máy để tăng cường hiệu quả. Ngoài ra, việc ứng dụng các thuật toán này trong môi trường thời gian thực, nơi cần phản ứng nhanh với các thay đổi, cũng là một hướng nghiên cứu quan trọng. Các nghiên cứu tiếp theo sẽ tập trung vào việc làm cho các giải thuật tối ưu đường đi trở nên mạnh mẽ hơn, thích nghi tốt hơn với các điều kiện thực tế phức tạp và đa dạng.

6.3. Tiềm năng ứng dụng Mở rộng sang các lĩnh vực công nghệ cao

Tiềm năng ứng dụng tối ưu hóa của Dijkstra, Fibonacci Heap, ACO còn rất lớn và đang mở rộng sang nhiều lĩnh vực công nghệ cao. Ngoài các ứng dụng truyền thống trong logistics optimizationmạng lưới giao thông, các thuật toán này có thể được áp dụng trong quy hoạch mạng lưới truyền thông 5G, tối ưu hóa lộ trình cho các phương tiện không người lái (UAVs, xe tự hành), robot công nghiệp, hay thậm chí trong sinh học tính toán để phân tích chuỗi DNA. Sự phát triển của trí tuệ nhân tạo và học sâu sẽ tiếp tục tạo ra những cơ hội mới để kết hợp các giải thuật tối ưu đường đi này với các mô hình thông minh, tạo ra các hệ thống có khả năng tự học và tự cải tiến, mở ra kỷ nguyên mới cho khoa học máy tính và các ứng dụng tối ưu hóa đột phá.

02/10/2025

Trích đoạn nội dung tài liệu

đặt vấn đề tìm đường đi cơ bản tối ưu, tuy nhiên Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 10 bài toán sẽ rất phức tạp, vì vậy trong luận văn này chúng ta sẽ giả thiết trong G các cung đều có trọng số không âm. Trường hợp trong đồ thị G trọng số các cung không âm, có nhiều thuật toán tìm đường đi tối ưu nổi tiếng như thuật toán For_Bellman, thuật toán Dijkstra, thuật toán Floyd. Trong phần còn lại của chương này của luận văn chúng ta sẽ nghiên cứu về thuật toán Dijkstra và sử dụng Fibonacci heap để cải tiến thuật toán Dijkstra. Thuật toán Dijkstra 1.

Phát biểu bài toán “Cho đồ thị có hướng có trọng số G = (V, E), hãy tìm một đường đi tối ưu xuất phát từ đỉnh s thuộc V, đến một đỉnh t cũng thuộc V.” Bài toán có thể được tìm thấy rất nhiều trong thực tế, chẳng hạn trong mạng lưới giao thông đường bộ, đường thủy, đường không, trong truyền tải dữ liệu của một mạng máy tính.Mô tả thuật toán Trong trường hợp trọng số trên cung không âm, bài toán trên có thể giải quyết hiệu quả bằng thuật toán Dijkstra mô tả như sau [3] : Bước 1: Khởi tạo Mỗi đỉnh v thuộc V, gọi d[v] là khoảng cách từ s đến v. Bước 2: Lặp cho đến khi t trở thành đỉnh cố định Bước lặp bao gồm 2 thao tác : Thao tác 1: Cố định nhãn Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 11 Chọn đỉnh u tự do có nhãn d[u] nhỏ nhất và cố định nhãn cho nó. Thao tác 2: Sửa nhãn Đối với mỗi đỉnh v tự do, kề với u. Nếu d[v] > d[u]+c[u,v] thì ta sẽ sửa nhãn cho v: d[v] := d[u]+c[u,v] và lưu u là đỉnh kề trước v trên đường đi tối ưu (c[u,v] là trọng số của cung (u, v)) Bước 3: Xuất kết quả Trả lại d[t] là độ dài đường đi tối ưu, kết hợp truy vết để tìm đường đi.

Mô hình : Repeat u := FindMin(); if u = t then exit ; Đánh dấu u đã cố định; Repair(u); // tiến hành sửa nhãn cho các đỉnh kề u Until False; [3] Độ phức tạp của FindMin() là O(n), của Repair(u) là O(n). Số lần lặp của bước 2 sẽ là số cung trong đường đi tối ưu, tức là khoảng O(n). Thuật toán Dijkstra cài đặt như trên sẽ có độ phức tạp O(n2), kết quả này là không khả thi cho đồ thị có số đỉnh n lớn. Thuật toán Dijkstra kết hợp với Fibonacci heap Do độ phức tạp của thuật toán Dijkstra là O(n2) nên khi số đỉnh của đồ thị lớn, chương trình chạy rất chậm, trong phần 1.5 này chúng ta sẽ sử dụng Fibonacci heap để cải tiến thuật toán này.

Hàng đợi ưu tiên 1. Khái niệm hàng đợi, hàng đợi ưu tiên Hàng đợi (queue): Là một kiểu danh sách mà việc bổ sung một phần tử được thực hiện ở cuối danh sách còn việc loại bỏ một phần tử được thực hiện ở đầu danh sách. Có thể hình dung hàng đợi như một hàng người xếp hàng Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 12 mua vé: Người xếp hàng trước sẽ được mua vé trước, người đứng đầu tiên mua vé xong đi ra thì người thứ hai tiến lên thay vị trí người đứng đầu, còn người mới đến sẽ đứng vào cuối hàng. Vì nguyên tắc vào trước ra trước nên hàng đợi còn được gọi là danh sách kiểu FIFO (First in first out).

Có 6 thao tác cơ bản đối với hàng đợi [2]: Init: Tạo một ngăn xếp rỗng. isEmpty: Cho biết hàng đợi có rỗng hay không. isFull: Cho biết hàng đợi có đầy không. Get: Đọc giá trị của phần tử ở đầu hàng đợi.

Push: Đẩy (bổ sung) một phần tử vào hàng đợi. Pop: Lấy một phần tử ra khỏi hàng đợi. Ta có thể biểu diễn hàng đợi bằng mảng hoặc dang sách móc nối [2]. Hàng đợi ưu tiên: Hàng đợi có độ ưu tiên, gọi tắt là hàng đợi ưu tiên (priority queue) là một cấu trúc dữ liệu quan trọng dùng trong việc cài đặt nhiều thuật toán.

Hàng đợi ưu tiên là một kiểu danh sách chứa các phần tử của một tập hữu hạn S nào đó, mỗi phần tử của S được gán cho một mức độ ưu tiên nào đó. Ta đánh số các phần tử của S lần lượt từ 1 đến n và đồng nhất mỗi phần tử với chỉ số của nó, khi đó độ ưu tiên của phần tử i là một số thực p[i] ( i = 1, 2,. Với một hàng đợi ưu tiên có các thao tác chính sau đây [2]: + Insert(i): Đẩy phần tử i vào hàng đợi ưu tiên nếu nó chưa có trong hàng đợi. + Find min(Find max): Trả về phần tử có độ ưu tiên nhỏ nhất (lớn nhất) trong hàng đợi ưu tiên.

+ Extract: Trả về phần tử có độ ưu tiên nhỏ nhất (lớn nhất) trong hàng Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 13 đợi ưu tiên, và loại bỏ nó khỏi hàng đợi ưu tiên. Hàng đợi ưu tiên là một biến thể của hàng đợi, nó khác ở chỗ là hàng đợi thông thường hoạt động theo kiểu vào trước ra trước còn trong hàng đợi ưu tiên thủ tục Extract luôn lấy ra phần tử có độ ưu tiên nhỏ nhất (lớn nhất). Cấu trúc dữ liệu heap Ta có thể dùng mảng hoặc danh sách móc nối để biểu diễn một hàng đợi ưu tiên, khi đó các thao tác Insert và Update có thể thực hiện với độ phức tạp là O(1), tuy nhiên các thao tác Find min (Find max) và Extract lại có độ phức tạp là O(n). Vì vậy, trong thực tế người ta hay dùng cấu trúc dữ liệu trừu tượng heap (đống) để biểu diễn hàng đợi ưu tiên.

Heap là một cấu trúc dữ liệu trừu tượng, bao gồm một tập n phần tử, mỗi phần tử có một giá trị khóa xác định. Các phép toán trên một heap được mô tả trong bảng dưới đây : Make_ heap Trả về một heap mới rỗng. Insert (x,h) Chèn một giá phần tử x mới,có khóa xác định vào heap Find_ min Trả về phần tử có khóa nhỏ nhất, không làm thay đổi heap Extract_ min Trả về phần tử có khóa nhỏ nhất và xóa nó ra khỏi heap Trong một số bài toán còn có thêm các phép toán sau : Hợp nhất hai heap h1, h2 thành heap mới, đồng thời xóa h1, Union(h1,h2) h2 Decrease(∆,x,h) Giảm khóa của phần tử x một lượng ∆ trong heap Delete(xh) Xóa phần tử X ra khỏi heap Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 14 Heap còn có thể gọi là hàng đợi có độ ưu tiên (priority queue) hay các đống khả trộn (mergeable heaps). Một số loại heaps, và thời gian thao tác các phép toán được trình bày trong bảng dưới đây [6]: Heaps Linked Thao tác Binary Bionimal Fibonacci Relax list make heap O(1) O(1) O(1) O(1) O(1) Insert (x,h) O(1) O(logN) O(logN) O(1) O(1) find min O(N) O(1) O(logN) O(1) O(1) extract min O(N) O(logN) O(logN) O(logN) O(logN) Union(h1,h2) O(1) O(N) O(logN) O(1) O(1) Decrease(∆,x,h) O(1) O(logN) O(logN) O(1) O(1) Delete(x,h) O(N) O(logN) O(logN) O(logN) O(logN) Trong phần tiếp theo chúng ta sẽ nghiên cứu kỹ về Fibonacci heap.

Giới thiệu Fibonacci heap (Đống Fibonacci) Cấu trúc dữ liệu Fibonacci heap (Đống Fibonacci) được hai giáo sư Fredman và Tarjan đưa ra vào năm 1986, nhằm áp dụng vào các bài toán tối ưu trên đồ thị, độ phức tạp của các thuật toán giải một số bài toán điển hình khi sử dụng Fibonacci heap được thống kê dưới đây [6]: O(nlogn + m): Cho bài toán tìm đường đi tối ưu xuất phát từ một đỉnh. O(n2logn + nm): Cho bài toán tìm đường đi tối ưu giữa mọi cặp đỉnh. O(n2logn + nm): Cho bài toán so khớp hai nhánh có trọng số. Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 15 Trước khi định nghĩa Fibonacci heap, ta đưa ra một số khái niệm: Cây có gốc: Là một cây tự do mà ở đó có một trong các đỉnh được phân biệt với các đỉnh còn lại và được gọi là gốc.

Cây có thứ tự: Là cây có gốc, mà các nút con trực thuộc một nút cha được sắp xếp theo một thứ tự xác định. Cây sắp xếp theo đống: Là cây có gốc, và nếu nút x là nút bất kỳ thì nó có giá trị khóa lớn hơn hoặc bằng (nhỏ hơn hoặc bằng) khóa của cha nó. Từ đó nút gốc là nút có khóa nhỏ nhất (lớn nhất). Định nghĩa : Fibonacci heap là một tập hợp các cây được sắp xếp theo đống.

Các cây trong Fibonacci heap không bị ràng buộc về thứ tự[6].3: Fibonacci heap gồm 5 cây sắp xếp theo đống với 14 nút [4] 1. Cấu trúc Fibonacci heap Hình 1.4 mô tả cách biểu diễn cấu trúc heap. Mỗi nút x chứa một biến trỏ p[x] trỏ đến cha của nó và một biến trỏ child[x] trỏ đến một con bất kỳ của nó. Các con của x được nối kết theo một danh sách nối kết đôi theo vòng tròn mà ta gọi là danh sách con của x.

Mỗi nút y trong danh sách con có các biến trỏ left[y] và right[y] trỏ đến anh em ruột trái và phải của nó. Nếu nút y là duy nhất thì left[y] = right[y] = y. Thứ tự xuất hiện các nút trong danh sách con là tùy ý. Việc thể hiện danh sách con bằng danh sách nối đôi vòng tròn có 2 ưu Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.com 16 điểm: Thứ nhất, có thể gỡ bỏ một nút ra khỏi danh sách với độ phức tạp là O(1).

Thứ hai, có thể ghép nối 2 danh sách với độ phức tạp tính toán là O(1). Ngoài ra mỗi nút x còn có : degree[x]: Lưu số nút trong danh sách con của x. bool mark[x]: Kiểm tra x đã mất một con hay chưa kể từ lần cuối cùng x trở thành con của một nút khác. Các gốc của tất cả các cây trong Fibonacci heap được nối kết với nhau bằng các biến trỏ left, right của chúng tạo thành một danh sách nối kết đôi vòng tròn gọi là danh sách gốc.

Biến trỏ min[H] trỏ đến nút có khóa nhỏ nhất trong danh sách gốc, từ đây ta sẽ coi min[H] là đại diện của H nói cách khác là minH quản lý H. Số lượng các nút trong H sẽ được lưu trong biến nH. Mô phỏng cấu trúc Fibonacci heap [4] Cấu trúc dữ liệu miêu tả một nút trong Fibonacci heap[4]: node = record key : integer; degree : integer; parent : ^node; child : ^node; left : ^node; right : ^node ; mark : boolean; end; Số hóa bởi Trung tâm Học liệu – ĐHTN http://www.vn download by : skknchat@gmail.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ