Bài giảng Mạng thông tin

Tài liệu Bài giảng Mạng thông tin: TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA ĐIỆN-ĐIỆN TỬ BÀI GIẢNG MẠNG THÔNG TIN Hưng Yên 2015 (Tài liệu lưu hành nội bộ) KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -3- Chƣơng 1. CÁC KHÁI NIỆM CƠ BẢN VỀ MẠNG THÔNG TIN 1.1. TỔNG QUAN VỀ MẠNG THÔNG TIN Nội dung chính của chƣơng này đƣợc trình bày theo các mục chính và đƣợc sắp xếp theo trình, cụ thể: Thông tin và truyền thông đây là một trong những vấn vấn đề đang đƣợc xã hội quan tâm trong nền kinh tế mới, nền kinh tế thông tin, nền kinh tế trí thức, nền kinh tế học hỏi và nền kinh tế số; trang bị về cái nhìn tổng quát về mạng số liệu; tổ chức về mạng truyền số liệu hiện đại, các kỹ thuật đƣợc dùng trong truyền số liệu và những vấn đề căn bản trong chuẩn hóa và mô hình tham chiếu của mạng 1.1.1 Thông tin và truyền thông Thông tin liên lạc đóng vai trò hết sức quang trọng trong cuộc sống, hầu hết chúng ta luôn gắn liền với một vài dạng thông tin nào đó. Các dạng trao đổi ti...

pdf121 trang | Chia sẻ: putihuynh11 | Lượt xem: 687 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Mạng thông tin, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA ĐIỆN-ĐIỆN TỬ BÀI GIẢNG MẠNG THÔNG TIN Hưng Yên 2015 (Tài liệu lưu hành nội bộ) KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -3- Chƣơng 1. CÁC KHÁI NIỆM CƠ BẢN VỀ MẠNG THÔNG TIN 1.1. TỔNG QUAN VỀ MẠNG THÔNG TIN Nội dung chính của chƣơng này đƣợc trình bày theo các mục chính và đƣợc sắp xếp theo trình, cụ thể: Thông tin và truyền thông đây là một trong những vấn vấn đề đang đƣợc xã hội quan tâm trong nền kinh tế mới, nền kinh tế thông tin, nền kinh tế trí thức, nền kinh tế học hỏi và nền kinh tế số; trang bị về cái nhìn tổng quát về mạng số liệu; tổ chức về mạng truyền số liệu hiện đại, các kỹ thuật đƣợc dùng trong truyền số liệu và những vấn đề căn bản trong chuẩn hóa và mô hình tham chiếu của mạng 1.1.1 Thông tin và truyền thông Thông tin liên lạc đóng vai trò hết sức quang trọng trong cuộc sống, hầu hết chúng ta luôn gắn liền với một vài dạng thông tin nào đó. Các dạng trao đổi tin có thể nhƣ: đàm thoại ngƣời với ngƣời, đọc sách, gửi và nhận thƣ, nói chuyện qua điện thoại, xem phim hay truyền hình, xem triển lãm tranh , tham dự diễn đàn . . . Có hàng nghìn ví dụ khác nhau về thông tin liên lạc, trong đó gia công chế biến để truyền đi trong thông tin số liệu là một phần đặc biệt trong lĩnh vực thông tin. Hình 1.1. Một hệ thống thông tin cơ bản ở đây: AP- Applicayion process- Quá trình ứng dụng Từ các ví dụ trên chúng ta nhận thấy rằng mỗi hệ thống truyền tin đều có các đặc trƣng riêng nhƣng có một số đặc tính chung cho tất cả các hệ thống. Đặc trƣng chung có tính nguyên lý là tất cả các hệ thống truyền tin đều nhằm mục đích chuyển tải thông tin từ điểm này đến điểm khác. Trong các hệ thống truyền số liệu, thƣờng gọi thông tin là dữ liệu hay thông điệp. Thông điệp có nhiều dạng khác nhau, để truyền thông điệp từ một điểm này đến điểm khác cần phải có sự tham gia của 3 thành phần của hệ thống: nguồn Hệ thống phục truyền tin AP Hệ thống phục vụ phục truyền tin AP Máy tính A Máy tính B Thông tin user đến user Thông tin máy tính đến máy tính Thông tin máy tính đến mạng Mạng truyền số liệu KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -4- tin là nơi phát sinh và chuyển thông điệp lên môi trƣờng truyền; môi trƣờng truyền là phƣơng tiện mang thông điệp tới đích thu. Các phần tử này là yêu cầu tối thiểu trong bất cứ quá trình truyền tin nào. Nếu một trong các thành phần này không tồn tại, truyền tin không thể xảy ra. Một hệ thống truyền tin thông thƣờng đƣợc miêu tả trên hình 1.1. Các thành phần cơ bản có thể xuất hiện dƣới dạng khác nhau tuỳ thuộc vào hệ thống. Khi xây dựng các thành phần của một hệ thống truyền tin, cần phải xác định một số các yếu tố liên quan đến phẩm chất hoạt động của nó. Để truyền tin hiệu quả các chủ để phải hiểu đƣợc thông điệp. Nơi thu nhận thông điệp phải có khả năng dịch thông điệp một cách chính xác. Điều này là hiển nhiên bởi vì trong giao tiếp hàng ngày nếu chúng ta dùng một từ mà ngƣời ta không thể hiểu thì hiệu quả thông tin không đạt yêu cầu. Tƣơng tự, nếu máy tính mong muốn thông tin đến với tốc độ chỉ định và ở một dạng mã nào đó nhƣng thông tin lại đến với tốc độ khác và với dạng mã khác thì rõ ràng không thể đạt đƣợc hiệu quả truyền. Các đặc trƣng toàn cục của một hệ thống truyền đƣợc xác định và bị giới hạn bởi các thuộc tính riêng của nguồn tin, của môi trƣờng truyền và đích thu. Nhìn chung, dạng thông tin cần truyền quyết định kiểu nguồn tin, môi trƣờng và đích thu. Trong một hệ thống truyền, hiện tƣợng nhiễu có thề xảy ra trong tiến trình truyền và thông điệp có thể bị ngắt quãng. Bất kỳ sự xâm nhập không mong muốn nào vào tín hiệu đều bị gọi là nhiễu. Có nhiều nguồn nhiễu và nhiều dạng nhiễu khác nhau. Hiểu biết đƣợc các nguyên tắc căn bản về truyền tin sẽ giúp chúng ta dễ dàng tiếp cận một lĩnh vực đặc biệt hấp dẫn đó là thông tin số liệu.Thông tin số liệu liên quan đến một tổ hợp nguồn tin, môi trƣờng và máy thu trong các kiểu mạng truyền số liệu khác nhau. 1.1.2 Các dạng thông tin và xử lý thông tin Tất cả những gì mà con ngƣời muốn trao đổi với nhau đƣợc hiểu là thông tin những thông tin nguyên thuỷ này đƣợc gia công chế biến để truyền đi trong không gian đƣợc hiểu là tín hiệu. Tuỳ theo việc sử dụng đƣờng truyền, tín hiệu có thể tạm chia tín hiệu thành hai dạng: tín hiệu điện-từ và tín hiệu không phải điện từ. Việc gia công tín hiệu cho phù hợp với mục đích và phù hợp với đƣờng truyền vật lý đƣợc gọi là xử lý tín hiệu. Ngày nay với sự phát triển của công nghệ tin học đã tạo ra một công nghệ mới về truyền số liệu. Máy tính với những tính năng vô cùng to lớn đã trở thành hạt nhân trong việc xử lý thông tin, điều khiển các quá trình truy nhập số liệu, máy tính và các hệ thống thông tin tạo thành một hệ thống truyền số liệu. Có 2 nguồn thông tin đó là thông tin tƣơng tự và thông tin số. Trong đó nguồn thông tin tƣơng tự liên tục theo sự thay đổi của giá trị vật lý thể hiện thông tin với đặc tính chất KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -5- lƣợng nhƣ tiếng nói, tín hiệu hình ảnh , còn nguồn thông tin số là tín hiệu gián đoạn thể hiện thông tin bởi nhóm các giá trị gián đoạn xác định đặc tính chất lƣợng bằng quan hệ với thời gian nhƣ tín hiệu số liệu. Thông tin số có nhiều ƣu điểm hơn so với thông tin tƣơng tự nhƣ : thông tin số có nhiều khả năng chống nhiễu tốt hơn vì nó có các bộ lặp để tái tạo lại tín hiệu, cung cấp chất lƣợng truyền dẫn tốt hơn với các khoảng cách, nó kết hợp đƣợc mọi nguồn dịch vụ hiện đang có, nó tạo ra đƣợc một tổ hợp truyền dẫn số và tổng đài số. Những phần tử bán dẫn dùng trong truyền dẫn số là những mạch tổ hợp nó đƣợc sản xuất hàng loạt, và mạng liên lạc trở thành mạng thông minh vì dễ chuyển đổi tốc độ cho các loại dịch vụ khác nhau thay đổi thủ tục, xử lý tín hiệu số (DSP) chuyển đổi phƣơng tiện truyền dẫn ... Hệ thống thông tin số cho phép thông tin điều khiển đƣợc cài đặt vào và tách dòng thông tin thực hiện một cách độc lập với với bản chất của phƣơng tiện truyền tin ( cáp đồng trục, cáp sợi quang, vi ba, vệ tinh..),. Vì vậy thiết bị báo hiệu có thể thiết kế riêng biệt với hệ thống truyền dẫn. Chức năng điều khiển có thể thay đổi mà không phụ thuộc vào hệ thống truyền dẫn, ngƣợc lại hệ thống có thể nâng cấp không ảnh hƣởng tới các chức năng điều khiển ở cả 2 đầu của đƣờng truyền 1.2 Khái quát mạng truyền số liệu Hình 1.2. Mô hình mạng truyền số liệu hiện đại Ngày nay với sự phát triển của kỹ thuật và công nghệ đã tạo ra một bƣớc tiến dài trong lĩnh vực truyền số liệu. Sự kết hợp giữa phần cứng, các giao thức truyền thông các thuật toán đã tạo ra các hệ thống truyền số liệu hiện đại, những ký thuật cơ sở vẫn đƣợc dùng nhƣng chúng đƣợc xử lý tinh vi hơn. Về cơ bản một hệ thống truyền số liệu hiện đại mô tả nhƣ hình 1.2 Giao tiếp DTE-DCE DTE DCE Hệ thống truyền (nhận) tin Giao tiếp DTE-DCE DCE DTE Hệ thống nhận (truyền) tin Kênh truyền tin KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -6- a. DTE (Data Terminal Equipment – Thiết bị đầu cuối dữ liệu) Đây là thiết bị lƣu trữ và xử lý thông tin. Trong hệ thống truyền số liệu hiện đại thi DTE thƣờng là máy tính hoặc máy Fax hoặc là trạm cuối (terminal). Nhƣ vậy tất cả các ứng dụng của ngƣời sử dụng (chƣơng trình, dữ liệu) đều nằm trong DTE Chức năng của DTE thƣờng lƣu trữ các phần mềm ứng dụng , đóng gói dữ liệu rồi gửi ra DCE hoặc nhận gói dữ liệu từ DCE theo một giao thức (protocol) xác định DTE trao đổi với DCE thông qua một chuẩn giao tiếp nào đó. Nhƣ vậy mạng truyền số liệu chính là để nối các DTE lại cho phép chúng ta phân chia tài nguyên, trao đổi dữ liệu và lƣu trữ thông tin dùng chung b. DCE (Data Circuit terminal Equipment- Thiết bị cuối kênh dữ liệu) Đây là thuật ngữ dùng để chỉ các thiết bị dùng để nối các DTE với các đƣờng (mạng) truyền thông nó có thể là một Modem, Multiplexer, Card mạng...hoặc một thiết bị số nào đó nhƣ một máy tính nào đó trong trƣờng hợp máy tính đó là một nút mạng và DTE đƣợc nối với mạng qua nút mạng đó. DCE có thể đƣợc cài đặt bên trong DTE hoặc đứng riêng nhƣ một thiết bị độc lập. Trong thiết bị DCE thƣờng có các phần mềm đƣợc ghi vào bộ nhớ ROM phần mềm và phần cứng kết hợp với nhau để thực hiện nhiệm vụ của nó vẫn là chuyển đổi tín hiệu biểu diễn dữ liệu của ngƣời dùng thành dạng chấp nhận đƣợc bởi đƣờng truyền. Giữa 2 thiết bị DTE việc trao đổi dữ liệu phải tuân thủ theo chuẩn, dữ liệu phải gửi theo một Format xác định. Thí dụ nhƣ chuẩn trao đổi dữ liệu tầng 2 của mô hình 7 lớp là HDLC (High level Data Link Control) Trong máy Fax thì giao tiếp giữa DTE và DCE đã thiết kế và đƣợc tích hợp vào trong một thiết bị, phần mềm điều khiển đƣợc cài đặt trong ROM. c. Kênh truyền tin Kênh truyền tin là môi trƣờng mà trên đó 2 thiết bị DTE trao đổi dữ liệu với nhau trong phiên làm việc DTE C D E F DTE Hình 1.3. Kênh thông tin ở đây: C, D-Modem; E, F- Transducer Trong môi trƣờng thực này 2 hệ thống đƣợc nối với nhau bằng một đoạn cáp đồng trục và một đoạn cáp sợi quang, modem C để chuyển đổi tín hiệu số sang tín hiệu tƣơng tự để truyền trong cáp đồng trục modem D lại chuyển tín hiệu đó thành tín hiệu số và qua Tranducer E để chuyển đổi từ tín hiệu điện sang tín hiệu quang để truyền trên cáp sợi Cáp đồng trục Cáp sợi quang KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -7- quang cuối cùng Tranducer F lại chuyển tín hiệu quang thành tín hiệu điện để tới DTE 1.4. Mạng truyền số liệu Mạng truyền số liệu bao gồm hai hay nhiều hệ thống truyền (nhận) tin nhƣ hình 1.2 đƣợc ghép nối với nhau theo nhiều hình thức nhƣ phân cấp hoặc phân chia thành các trung tâm xử lý trao đổi tin với các chức năng riêng ... Mạng truyền số liệu là một hệ thống nhằm kết nối các máy tính lại với nhau, sự thông tin giữa chúng đƣợc thực hiện bởi các giao thức đã đƣợc chuẩn hoá, có nghĩa các phần mềm trong các máy tính khác nhau có thể cùng nhau giải quyết một công việc hoặc trao đổi thông tin với nhau. Các ứng dụng tin học ngày càng rộng rãi do đó đã đẩy các hƣớng ứng dụng mạng xử lý số liệu, mạng đấu nối có thể có cấu trúc tuyến tính cấu trúc vòng cấu trúc hình sao... Cấu trúc mạng phải có khả năng tiếp nhận các đặc thù khác nhau của các đơn vị tức là mạng phải có tính đa năng, tính tƣơng thích. Mạng số liệu đƣợc thiết kế nhằm mục đích có thể nối nhiều thiết bị đầu cuối với nhau. Để truyền số liệu ta có thể dùng mạng điện thoại hoặc dùng đƣờng truyền riêng có tốc độ cao. Dịch vụ truyền số lỉệu trên kênh thoại là một trong các dịch vụ đầu tiên của việc truyền số liệu. Trên mạng này có thể có nhiều máy tính cùng chủng loại hoặc khác loại đƣợc ghép nối lại với nhau, khi đó cần giải quyết những vấn đề phân chia tài nguyên. Để các máy tính ở các đầu cuối có thể làm việc đƣợc với nhau cần phải có cùng một protocol nhất định. Dạng thức của phƣơng tiện truyền số liệu đƣợc qui định bởi bản chất tự nhiên của ứng dụng, bởi số lƣợng máy tính liên quan và khoảng cách vật lý giữa chúng. Các dạng truyền số liệu trên có các dạng sau: a. Nếu chỉ có hai máy tính và cả hai đều đặt ở một văn phòng, thì phƣơng tiện truyền số liệu có thể chỉ gồm một liên kết điểm nối đơn giản, hình 1.4. Tuy nhiên, nếu chúng liên kết ở những vị trí khác nhau trong một thành phố hay một quốc gia thì phải cần đến các phƣơng tiện truyền tải công cộng. Mạng điên thoại công cộng đƣợc dùng nhiều nhất, trong trƣờng hợp này sẽ cần đến bộ thích nghi gọi là Modem. Sắp xếp truyền theo dạng này đƣợc trình bày trên hình1.4 KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -8- Hình 1.4. Truyền số liệu nối qua mạng điện thoại công cộng dùng modem b. Khi cần nhiều máy tính trong một ứng dụng, một mạng chuyển mạch sẽ đƣợc dùng cho phép tất cả các máy tính có thể liên lạc với nhau vào bất cứ thời điểm nào. Nếu tất cả máy tính đều nằm trong một toà nhà , có thể xây dựng một mạng riêng .Một mạng nhƣ vậy đƣợc xem nhƣ mạng cục bộ LAN (Local Area Network) .Nhiều chuẩn mạng LAN và các thiết bị liên kết đã đƣợc tạo ra cho các ứng dụng thực tế . Hai hệ thống mạng Lan cơ bản đƣợc trình bày trên hình 1.5 Hình 1.5. Các hệ thống LAN cơ bản (liên kết LAN qua backbone trong một văn phòng) Khi máy tính đƣợc đặt ở nhiều nơi cách xa nhau cần liên lạc với nhau, phải dùng đến các phƣơng tiện công cộng .Việc liên kết máy tính này tạo nên một mạng rộng lớn, đƣợc gọi là mạng diện rộng WAN (Wide Area Network). Kiểu mạng WAN đƣợc dùng phụ thuộc vào tƣờng ứng dụng tự nhiên. Ví dụ nếu tất cả các máy tính đều thuộc về một công ty và có yêu cầu truyền một số lƣợng dữ liệu quan trọng giữa các điểm , thì giải pháp đơn giản nhất cho vắn đề là thuê các Hệ thống phục truyền tin AP Hệ thống phục vụ phục truyền tin AP PSTN Modem Modem Hệ thống phục truyền tin AP Hệ thống phục vụ phục truyền tin AP KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -9- đƣờng truyền từ nhà cung cấp phƣơng tiện truyền dẫn và xây dựng hệ thống chuyển mạch riêng tại một đIểm để tạo thành mạng tƣ nhân. Các giải pháp thuê kênh chỉ hiệu quả đối với các công ty lớn vì có tải hữu ích để cân đối với giá thuê kênh. Trong hầu hết các trƣờng hợp khác đều cần đến các mạng truyền dẫn công cộng. Bên cạnh việc cung cấp dịch vụ điện thoại công cộng, ngày nay hầu hết các nhà cung cấp dịch vụ truyền dẫn đều cung cấp một dịch vụ chuyển mạch số liệu mang tính công cộng. Thật ra các mạng này tƣơng tự nhƣ mạng PSTN là đƣợc liên kết quốc tế, chỉ khác ở chỗ đƣợc thiết kế chuyên cho truyền số liệu. Nhƣ vậy các ứng dụng liên quan đến máy tính đƣợc phục vụ bởi mạng số liệu chuyển mạch công cộng PSDN. Ngoài ra còn có thể chuyển đổi các mạng PSTN có sẵn sao cho có thể truyền đƣợc số liệu mà không cần dùng modem. Các mạng này hoạt động trong chế độ số (digital) hoàn toàn đƣợc gọi là mạng số liên kết đa dịch vụ ISDN 1.4.1. Phân loại mạng truyền số liệu Mạng truyền số liệu đa dạng về chủng loại cũng nhƣ về số lƣợng , có nhiều cách phân chia mạng số liệu, bao gồm: a. Phân loại theo địa lý: Mạng nội bộ, Mạng diện rộng và Mạng toàn cầu b. Phân loại theo tính chất sử dụng mạng: Mạng truyền số liệu kí sinh và Mạng truyền số liệu chuyên dụng. c. Phân loại theo topo mạng: Mạng tuyến tính, Mạng hình sao và Mạng vòng d. Phân loại theo kỹ thuật: Mạng chuyển mạch kênh, Mạng chuyển mạch gói và Mạng chuyển mạch thông báo 1.4.2. Kỹ thuật chuyển mạch giữa các node trong mạng Để thực hiện việc liên lạc giữ các thuê bao ngƣời ta tạo ra mạng liên lạc với các NODE. Các thuê bao đƣợc nối đến các node . các thuê bao đƣợc nối vào mạng thông qua các Node. Số lƣợng các node phụ thuộc vào độ lớn của mạng, nhƣ vậy mỗi thuê bao chị cần một cổng I/O. Mỗi mạng bao gồm các Node , các node đƣợc nối với nhau , số liệu sẽ truyền từ ngƣời gửi đến ngƣời nhận theo con đƣờng thông qua mạng, các Node đƣợc nối với nhau theo hƣớng truyền, số liệu đƣợc định đƣờng từ Node này sang node này sang node khác. a. Kỹ thuật chuyển mạch kênh Liên lạc thông qua chuyển mạch kênh đặc trƣng bởi việc cung cấp các đƣờng nối cố định giữa 2 thuê bao. Sự liên lạc qua mạng chuyển mạch kênh bao gồm 3 giai đoạn : xác lập, truyền số liệu và giải phóng mạch KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -10- * Xác lập mạch Trƣớc khi có thể truyền số liệu , đƣờng truyền cần đƣợc thiết lập, Từ thuê bao truy nhập vào một node, node này cần phải tìm các nhánh đi qua một số node khác để đến đƣợc thuê bao bị gọi việc tìm kiếm này dựa vào các thông tin về tìm đƣờng và các thông số khác, cuối cùng khi 2 node thuộc thuê bao gọi và bị gọi đƣợc nối với nhau nó cần kiểm tra xem node thuộc thuê bao bị gọi có bận không. Nhƣ vậy là con đƣờng nối từ thuê bao gọi đến thuê bao bị gọi đã đƣợc thiết lập * Truyền số liệu Thông tin bắt đầu truyền từ điểm A đến điểm E có thể trong dạng số hoặc tƣơng tự qua điểm nối mạch bên trong mỗi node, sự nối mạch cho phép truyền 2 chiều toàn phần và dữ liệu có thể truyền 2 chiều. * Giải phóng mạch Sau khi hoàn thành sự truyền, có tín hiệu báo của thuê bao gọi (A) hoặc bị gọi (E) báo cho các node trung gian giải phóng sự nối mạch, đƣờng nối từ A đến E không còn nữa. Đƣờng nối đƣợc thiết lập trƣớc khi truyền dữ liệu nhƣ vậy dung lƣợng các kênh cần phải dự trữ cho mỗi cặp thuê bao và ở mỗi node cũng phải có lƣợng chuyển mạch tƣơng ứng bên trong để bảo đảm bảo đƣợc sự yêu cầu nối mạch. Trong bộ chuyển mạch số lƣợng kênh nối phải bảo đảm bảo suốt cả quá trình yêu cầu nối cho dù có hay không có dữ liệu truyền qua. Tuy nhiên khi đƣờng nối giữa 2 thuê bao đƣợc nối thì dữ liệu đƣợc truyền trên một đƣờng cố định. b. Kỹ thuật chuyển mạch thông báo Chuyển mạch kênh có 2 nhƣợc điểm: - 2 thuê bao cần phải hoạt động trong cùng thời gian truyền - Những nguồn cung cấp cũng phải ổn định và cung cấp qua mạng giữa 2 thuê bao Hiện nay những bức điện báo, thƣ điện tử, Files của máy tính đƣợc gọi là những thông báo và nó đƣợc truyền qua mạng nhƣ sự trao đổi những dữ liệu số đƣợc trao đổi 2 chiều giữa các thuê bao. Một trong những loại mạch để phục vụ sự trao đổi thông tin đó đƣợc gọi là chuyển mạch thông báo. Với chuyển mạch thông báo không tồn tại sự thiết lập và cung cấp lộ trình cố định giữa 2 thuê bao, mỗi thuê bao muốn truyền một thông báo, nó sẽ gán địa chỉ của ngƣời nhận vào thông báo. Thông báo sẽ đƣợc chuyển qua mạng từ node này qua node khác.Tại mỗi node thông báo đƣợc nhận tạm giữ và chuyển sang node khác. Các node thông thƣờng là những KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -11- máy tính nó giữ thông báo ở bộ đệm. Thời gian trễ ở mỗi bộ đệm bao gồm cả thời gian nhận thông báo vào node và thời gian xếp hàng chờ để đến lƣợt mình đƣợc chuyển đến node sau. Hệ thống chuyển mạch thông báo là hệ thống luôn giữ và chuyển tiếp. c. Chuyển mạch gói Chuyển mạch gói gần giống chuyển mạch thông báo. Chỗ khác nhau cơ bản là độ dài của một khối dữ liệu đƣa vào mạng đƣợc chế thành các gói và đƣợc gửi đi tại từng thời điểm, mỗi gói bao gồm dữ liệu cùng với địa chỉ và các thông số cần thiết, các gói không phải là file. Trong mạng chuyển mạch gói có 2 cách truyền gói đƣợc dùng: Datagram và Virtual Circuit 1. DATAGRAM: các gói là độc lập giống nhƣ trong chuyển mạch thông báo, các thông báo độc lập nhau. Cách truyền nhƣ vậy, mỗi gói độc lập đƣờng đi có thể không giống nhau gọi là DATAGRAM (DG) 2. MẠCH ẢO (Virtual Circuit): Trong mạch ảo sự nối logic mạch đƣợc thiết lập trƣớc khi truyền mỗi gói, mỗi gói bây giờ gồm cả nhận dạng VC và dữ liệu. Mỗi Node với con đƣờng đã định biết đƣợc cần phải truyền gói trực tiếp đến đâu không cần phải tìm đƣờng nữa. Một trong 2 trạm sẽ chấm dứt kết nối bằng cách truyền gói CLEAR REQUEST Cùng một thời gian một trạm có thể có nhiều VC đến một trạm khác và có thể có nhiều VC đến nhiều trạm khác. Nhƣ vậy tính chất cơ bản của VC là đƣờng nối logic giữa 2 trạm đƣợc thiết lập trƣớc khi truyền dữ liệu , điều đó không có nghĩa là có một con đƣờng cụ thể nhƣ trong chuyển mạch kênh. Gói đƣợc giữ ở một node và sắp hàng để đƣợc đƣa ra trên đƣờng nối. Chỗ khác với DATAGRAM là trong VC NODE không cần tìm đƣờng cho mỗi gói mà nó chỉ làm một lần cho một lần nối. Chú ý: Nếu một Node bị hƣ tất cả các VC qua Node đều bỏ, còn với DG nếu node đó bị hƣ thì gói tìm con đƣờng khác. Những điều chính yếu của mạng chuyển mạch gói là: Routing: Chức năng đầu tiên của PS là nhận những gói từ trạm nguồn và cung cấp nó đến ngƣời nhận, để hoàn thành việc đó, một hoặc nhiều con đƣờng thông qua mạng đƣợc chọn, thông thƣờng khả năng cho phép nhiều hơn 1. Điều đó có nghĩa là con đƣờng đƣợc chọn cần phải đảm bảo một số yêu cầu cần thiết trong chức năng đƣờng truyền nhƣ chính xác , đơn giản, ổn định hợp lý tối ƣu. Sự chọn đƣờng dựa vào tiêu chuẩn đơn giản là chọn đƣờng ngắn nhất ( một đƣờng với KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -12- node ít nhất ) thông qua mạng. Thực tế là ngƣời ta thƣờng dùng các con đƣờng có thời gian đi là nhỏ nhất, Nhƣng không phải khi nào con đƣờng đi có thời gian nhỏ nhất cũng là con đƣờng ngắn nhất. Giá trị nhỏ nhất bao gồm cho từng đƣờng và đƣờng thông qua mạng bao gồm tích luỹ giá trị bé nhất của các đƣờng thành phần, Những điểm cần quyết định khi lựa chọn gồm: - Sự quyết định về thời gian - Sự quyết định về vị trí - Routing phân tán - Routinh tập trung Một trong những cách tìm đƣờng đơn giản là tìm đƣờng cố định. Trong trƣờng hợp đó, một con đƣờng đƣợc xác định cho một cặp nguồn. Một thƣ mục tìm đƣờng tại trung tâm đƣợc tạo nên. thƣ mục cho ta Node nguồn Node đích và node lân cận phải qua. Thƣ mục đƣợc lƣu lại ở bộ điều khiển trung tâm mạng. Một kỹ thuật tìm đƣờng đơn giản khác là tìm đƣờng động, Kỹ thuật này không yêu cầu bất kỳ thông tin nào của mạng và nó làm việc nhƣ sau: Gói gửi từ một nguồn đến mọi Node lân cận. ở tại mỗi node đến, gói vừa mới đến lại chuyển đi trên trên mọi đƣờng ra, ngoài đƣờng nó đến, và cứ tiếp tục nhƣ vậy Trafic control là giá trị lƣu lƣợng trong mạng cần phải điều hoà để tăng hiệu suất và ổn định công suất. các phần tử của Traffic control..Traffic control có 4 loại với mục đích khác nhau: Flowcontrol, Congestion control, Deadlock control. Flow control liên quan đến việc điều chỉnh lƣu lƣợng của dữ liệu truyền giữa 2 điểm, cơ sở của Flow control là cho phép bộ thu với lƣu lƣợng sao cho không bị tràn. Điển hình của Flow control là thực hiện với một số loại kỹ thuật nhƣ cửa sổ trƣợt Congestion control là kiểm tra sự nghẽn mục đích là nắm đƣợc số của packet đƣợc đƣa vào mạng theo mức. Mạng chuyển mạch gói là là một mạng xếp hàng tại mỗi Node, các gói đƣợc xếp hàng để dƣa ra theo một đƣờng ra nào đó, nếu nhƣ số lƣợng các gói đến xếp hàng nhiều hơn nhiều hơn lƣợng các gói có thể truyền thì độ lớn của hàng càng phình ra, còn nếu nhƣ lƣợng các gói đến (tốc độ) ít hơn lƣợng gửi đi thì vấn dề xếp hàng không xảy ra và tốc độ đến bằng tốc độ truyền đi. Trên mỗi đƣờng có các gói đến hoặc đi. Ta có thể giả thiết rằng có 2 buffer cho mỗi đƣờng 1 dành cho các gói đến và 1 dành cho gói xếp hàng chuyển đi. Trong trƣờng hợp, gói đến nó đƣợc lƣu lại ở bộ nhớ đệm đến của đƣờng dây tƣơng ứng, Node kiểm tra gói đến và quyết định đƣờng đi và chuyển gói đó đến buffer ra thích hợp. gói đƣợc xếp hàng chờ đƣa ra với khả năng nhanh nhất, Nếu nhƣ gói đến quá nhanh so KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -13- với hoạt động của Node hoặc quá nhanh so với việc xoá trong bộ nhớ đệm ra thì đƣơng nhiên gói sẽ đến mà không đƣợc giữ lại và làm cho đƣờng truyền bị nghẽn. Deadlock control Một Node không chấp nhận chuyển tiếp các gói vì nó không có buffer để dùng Error control chức năng cuối cùng của chuyển mạch gói là kiểm tra sai có nhiều nguyên nhân dẫn đến sai, mất gói trong chuyển mạch gói đó là: Đƣờng nối hƣ, Node hƣ, Trạm thu nhận hƣ 1.5. Chuẩn hóa mô hình tham chiếu OSI (Open System Interconnection) 1.5.1 Kiến trúc phân tầng Để giảm độ phức tạp khi thiết kế và cài đặt mạng số liệu đƣợc thiết kế theo quan điểm kiến trúc 7 tầng nguyên tắc là: mỗi hệ thống trong một mạng đều có số lƣợng tầng là 7 chức năng của mỗi tầng là nhƣ nhau, xác định giao diện giữa 2 tầng kề nhau và giao thức giữa 2 tầng đồng mức của 2 hệ thống kết nối với nhau. Trên thực tế dữ liệu không đƣợc truyền trực tiếp từ tầng thứ i của hệ thống này sang tầng thứ i của hệ thống kia (trừ tầng thấp nhất trực tiếp sử dụng đƣờng truyền vật lý). Từ hệ thống gửi truyền sang hệ thống nhận theo quy trình nhƣ sau: Dữ liệu từ tầng i của hệ thống gửi sẽ đi từ tầng trên xuống tầng dƣới và tiếp tục đến tầng dƣới cùng – tầng vật lý qua đƣờng truyền vật lý chuyển đến hệ thống nhận và dữ liệu sẽ đi ngƣợc lên các tầng trên đến tầng đồng mức thứ i. Nhƣ vậy 2 hệ thống kết nối với nhau chỉ có tầng vật lý mới có kết nối vật lý còn các tầng khác chỉ có kết nối logic 1.5.2 Mô hình tham chiếu Mô hình OSI đƣợc hình thành vào năm 1974 bởi hội đồng các tiêu chuẩn đƣợc biết nhƣ tổ chức các tiêu chuẩn quốc tế (ISO). Mô hình này, nhƣ là mô hình liên kết các hệ thống mở, hoặc mô hình OSI, phân chia hệ thống thông tin thành 7 lớp. Mỗi lớp thực hiện một chức năng riêng biệt nhƣ một phần công việc để cho phép các chƣơng trình ứng dụng trên các hệ thống khác liên lạc, nếu nhƣ chúng đang hoạt động trên cùng một hệ thống. Mô hình OSI là một mô hình kiến trúc cơ bản. Mô hình không dành riêng cho phần mềm hoặc phần cứng nào. OSI miêu tả các chức năng của mỗi lớp nhƣng không cung cấp phần mềm hoặc thiết kế phần cứng để phục vụ cho mô hình này. Mục đích sau cùng của mô hình là cho khả năng hoạt động tƣơng lai của nhiều thiết bị truyền thông. Một thiết bị truyền thông có thể đƣợc thiết kế dựa trên mô hình này. Thông qua việc đề cập nhiều lần bởi các qui định của LAN, có một số dữ liệu và thông tin thoại đƣợc thiế t kế theo mô hình OSI. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -14- Có 7 và chỉ 7 lớp tạo lên mô hình này (việc qui định các mức và các lớp có thể đƣợc sử dụng, hình 1.6 mô tả các lớp theo trình tự từ dƣới lên trên; Lớp vật lý (physical layer), lớp liên kết dữ liệu Data link layer), lớp mạng (Network layer), lớp vận chuyển (Transport layer), lớp tập hợp (Session layer), lớp trình bầy (presentation) và lớp ứng dụng (application layer). Mỗi lớp có một mục đích riêng và có chức năng độc lập của chúng. Hình 1.6. Mô hình OSI Physical layer: Lớp này định nghĩa các phƣơng pháp sử dụng để truyền và thu dữ liệu trên mạng, nó bao gồm: cáp, các thiết bị đƣợc sử dụng để kết nối bộ giao tiếp mạng của trạm tới cáp. Tín hiệu liên quan tới dữ liệu truyền/thu và khả năng xác định các lối dữ liệu trê phƣơng tiện mạng ( the cable plant). Datalink layer: lớp này đồng bộ hoá truyền dẫn và vận dụng điều khiển lối vào mức khung và phục hồi thông tin có thể truyền trên lớp vật lí. Khuôn dạng khung và CRC (kiểm tra vòng) đƣợc thực hiện tại các lớp vật lý. Lớp này thực hiện các phƣơng pháp truy nhập nhƣ Ethernet và Token Ring. Nó luôn cung cấp địa chỉ lớp vật lí cho khung truyền. Network layer: Lớp này điều khiển việc chuyển tiếp các thông báo giữa các trạm. Trên cơ sở một số thông tin, lớp này sẽ cho phép dữ liệu theo trình tự giữa hai trạm để hạn chế cho cả hai đƣờng logic và vật lí. Lớp này cho phép các khối dữ liệu đƣợc truyền tới các mạng khác thông qua việc sử dụng một số thiết bị đƣợc biết nhƣ router. Qua các router đƣợc định nghĩa tại lớp này. Transport layer: Lớp này cung cấp cho truyền dẫn end-to-end của dữ liệu ( trạm nguồn tới trạm đích). Nó cho phép dữ liệu đƣợc truyền một cách tin cậy, và đảm bảo rằng Application Presentation Session Transport Network Datalink Physical Ứng dụng Trình bày Phiên Vận chuyển Mạng Liên kết dữ liệu Vật lý KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -15- dữ liệu đƣợc truyền hoặc đƣợc thu không có lỗi, chính xác theo trình tự. Session layer: Lớp này thiết lập, duy trì và cắt đứt liên kết giữa hai trạm trên một mạng. Lớp này chịu trách nhiệm biên dịch địa chỉ tên trạm. Presentation layer: Lớp này thực hiện chuyển đổi cú pháp dữ liệu để đáp ứng yêu cầu truyền dữ liệu của các ứng dụng qua môi trƣờng OSI. Application layer: Lớp này đƣợc sử dụng cho các ứng dụng, đó là yếu tố để thực hiện trên mạng. Các ứng dụng nhƣ truyền file, thƣ điện tử ... Trên đây là những gì mà mô hình OSI đã thực hiện. Ngay sau khi mô hình OSI này ra đời thì nó đƣợc dùng làm có sở để nối các hệ thống mở phục vụ cho các ứng dụng phân tán. Từ “mở” ở đây nói lên khả năng hai hệ thống có thể kết nối để trao đổi thông tin với nhau, nếu chúng tuân thủ theo mô hình tham chiến và các chuẩn liên quan. Điều quan trọng nhất của mô hình OSI là đƣa ra các giải pháp cho vấn đề truyền thông giữa các trạm không giống nhau. Hai hệ thống dù khác nhau nhƣ thế nào đều có thể truyền thông với nhau nếu chúng bảo đảm những điều kiện sau: Chúng cài đặt cùng một tập các chức năng truyền thông. - Các chức năng đó đƣợc tổ chức thành một tập các tầng, các tầng đồng mức phải cung cấp các chức năng nhƣ nhau - Các tầng đồng mức phải sử dụng một giao thức chung Để bảo đảm bảo các điều kiện trên cần phải có các chuẩn. Các chuẩn phải xác định các chức năng và dịch vụ của tầng. Các chuẩn cũng phải xác định các giao thức giữa các tầng đồng mức. Mô hình OSI 7 lớp chính là cơ sở để xây dựng các chuẩn đó. 1.5.3. Phương thức hoạt động Ơ mỗi tầng trong mô hình OSI có 2 phƣơng thức hoạt động: phƣơng thức có liên kết (connection oriented) và phƣơng thức không liên kết (connectionless) Với phƣơng thức có liên kết trƣớc khi truyền dữ liệu cần thiết lập một liên lết logic giữa các thực thể đồng mức. nhƣ vậy quá trình truyền thông gồm 3 giai đoạn: - Thiết lập liên kết logic: 2 thực thể đồng mức ở 2 hệ thống sẽ thƣơng lƣợng với nhau về các thông số sẽ sử dụng trong giai đoạn sau - Truyền dữ liệu : Dữ liệu sẽ đƣợc truyền với cơ chế kiểm soát và quản lý kèm theo (nhƣ kiểm soát lỗi , kiểm soát luồng, cắt/hợp dữ liệu) - Huỷ bỏ liên kết : giải phóng các tài nguyên hệ thống đã đƣợc cấp phát cho liên kết để dùng cho các liên kết khác Mỗi giai đoạn trên thƣờng đƣợc thể hiện bằng một hàm tƣơng ứng. Thí dụ hàm connect thể hiện giai đoạn thiết lập liên kết, hàm Data thể hiện giai đoạn truyền dữ liệu và KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -16- hàm Disconnect thể hiện giai đoạn huỷ bỏ liên kết. Cùng với 4 hàm nguyên thuỷ trên cho mỗi giai đoạn ta sẽ có 12 thủ tục chính để xây dựng các dịch vụ và các giao thức chuẩn theo kiểu OSI. Còn đối với phƣơng thức không liên kết thì không cần thiết lập liên kết logic và mỗi đơn vị dữ liệu đƣợc truyền độc lập với các đơn vị dữ liệu trƣớc hoặc sau nó. Phƣơng thức này chỉ có duy nhất một giai đoạn truyền dữ liệu So sánh 2 phƣơng thức hoạt động trên thi phƣơng thức có liên kết cho phép truyền dữ liệu tin cậy, do đƣợc kiểm soát và quản lý chặt chẽ theo từng liên kết lôgic, nhƣng cài đặt khó khăn . Phƣơng thức không liên kết cho phép các PDU có thể đƣợc truyền đi theo nhiều đƣờng khác nhau để tới đích, thích nghi đƣợc với sự thay đổi trạng thái của mạng, nhƣng lại gặp phải khó khăn khi tập hợp lại các PDU để chuyển tới ngƣời dùng. Về nguyên tắc 2 tầng lân cận không nhất thiết phải dùng chung một phƣơng thức hoạt động. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -17- Chƣơng 2. ĐỊNH TUYẾN TRONG MẠNG THÔNG TIN 2.1. YÊU CẦU VỀ ĐỊNH TUYẾN TRONG MẠNG THÔNG TIN Phần này giới thiệu các thuật ngữ và các khái niệm cơ bản nhằm mô tả các mạng, graph, và các thuộc tính của nó. Lý thuyết graph là một môn học xuất hiện từ lâu, nhƣng lý thuyết này có một số thuật ngữ đƣợc chấp nhận khác nhau dùng cho các khái niệm cơ bản. Vì thế có thể sử dụng một số thuật ngữ khác nhau để lập mô hình graph cho mạng. Các thuật ngữ đƣợc trình bày dƣới đây này là các thuật ngữ đã đƣợc công nhận và đƣợc sử dụng thƣờng xuyên chƣơng này. Một graph G, đƣợc định nghiã bởi tập hợp các đỉnh V và tập hợp các cạnh E. Các đỉnh thƣờng đƣợc gọi là các nút và chúng biểu diễn vị trí (ví dụ một điểm chứa lƣu lƣợng hoặc một khu vực chứa thiết bị truyền thông). Các cạnh đƣợc gọi là các liên kết và chúng biểu diễn phƣơng tiện truyền thông. Graph có thể đƣợc biểu diễn nhƣ sau: G=(V, E) Hình 2.1 là một ví dụ của một graph. Hình 2.1. Một graph đơn giản Mặc dù theo lý thuyết, V có thể là tập hợp rỗng hoặc không xác định, nhƣng thông thƣờng V là tập hợp xác định khác rỗng, nghĩa là có thể biểu diễn V={vi | i=1,2,......N} trong đó N là số lƣợng nút. Tƣơng tự E đƣợc biểu diễn: E={ei | i=1,2,......M} Một liên kết, ej, tƣơng ứng một kết nối giữa một cặp nút. Có thể biểu diễn một liên kết ej giữa nút i và k bởi ej=(vi,vk) hoặc bởi ej=(i,k) KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -18- Một liên kết gọi là đi tới một nút nếu nút đó là một trong hai điểm cuối của liên kết. Nút i và k gọi là kề nhau nếu tồn tại một liên kết (i, k) giữa chúng. Những nút nhƣ vậy đƣợc xem là các nút láng giềng. Bậc của nút là số lƣợng liên kết đi tới nút hay là số lƣợng nút láng giềng. Hai khái niệm trên là tƣơng đƣơng nhau trong các graph thông thƣờng. Tuy nhiên với các graph có nhiều hơn một liên kết giữa cùng một cặp nút, thì hai khái niệm trên là không tƣơng đƣơng. Trong trƣờng hợp đó, bậc của một nút đƣợc định nghĩa là số lƣợng liên kết đi tới nút đó. Một liên kết có thể có hai hƣớng. Khi đó thứ tự của các nút là không có ý nghiă. Ngƣợc lại thứ tự các nút có ý nghĩa. Trong trƣờng hợp thứ tự các nút có ý nghĩa, một liên kết có thể đƣợc xem nhƣ là một cung và đƣợc định nghĩa aj=[vi,vk] hoặc đơn giản hơn aj=[i,k] ở đây k đƣợc gọi là cận kề hƣớng ra đối với i nếu một cung [i,k] tồn tại và bậc hướng ra của i là số lƣợng các cung nhƣ vậy. Khái niệm cận kề hƣớng vào và bậc cận kề hƣớng vào cũng đƣợc định nghĩa tƣơng tự. Một graph gọi là một mạng nếu các liên kết và các nút có mặt trong liên kết có các thuộc tính (chẳng hạn nhƣ độ dài, dung lƣợng, loại...). Các mạng đƣợc sử dụng để mô hình các vấn đề cần quan tâm trong truyền thông, các thuộc tính riêng biệt của nút và liên kết thì liên quan đến các vấn đề cụ thể trong truyền thông. Sự khác nhau giữa các liên kết và các cung là rất quan trọng cả về việc lập mô hình cho mạng lẫn quá trình hoạt động bên trong của các thuật toán, vì vậy sự khác nhau cần phải luôn đƣợc phân biệt rõ ràng. Về mặt hình học các liên kết là các đƣờng thẳng kết nối các cặp nút còn các cung là các đƣờng thẳng có mũi tên ở một đầu, biểu diễn chiều của cung. Một graph có các liên kết gọi là graph vô hƣớng, tuy nhiên một graph có các cung gọi là graph hữu hƣớng. Một graph hữu hƣớng có thể có cả các liên kết vô hƣớng. Thông thƣờng , các graph đƣợc giả sử là vô hƣớng, hoặc sự phân biệt đó là không có ý nghĩa. Có thể có khả năng xảy ra hiện tƣợng xuất hiện nhiều hơn một liên kết giữa cùng một cặp nút (điều này tƣơng ứng với việc có nhiều kênh thông tin giữa hai chuyển mạch). Những liên kết nhƣ vậy đƣợc gọi là các liên kết song song. Một graph có liên kết song song gọi là một multigraph. Cũng có khả năng xuất hiện các liên kết giữa một nút nào đó và chính nút đó. Những liên kết đó đƣợc gọi là các self loop. Chúng ít khi xuất hiện và thƣờng xuất hiện do việc xem hai nút nhƣ là một nút trong quá trình lập mô hình graph cho một mạng hoặc phát sinh trong quá trình KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -19- thực hiện một thuật toán có việc hợp nhất các nút. Hình 4.2 minh hoạ một graph có các liên kết song song và các self loop. Một graph không có các liên kết song song hoặc các self loop gọi là một graph đơn giản. Việc biểu diễn và vận dụng các graph đơn giản là tƣơng đối dễ dàng, vì vậy giả thiết rằng các graph đƣợc xem xét là các graph đơn giản. Nếu có sự khác biệt với giả thiết này, chúng sẽ đƣợc chỉ ra. 2.2. CÁC MÔ HÌNH ĐỊNH TUYẾN QUẢNG BÁ (broadcast routing) 2.2.1 Lan tràn gói (flooding) Một dạng mạnh hơn của định tuyến riêng biệt đó là lan tràn gói. Trong phƣơng thức này, mỗi gói đi đến router sẽ đƣợc gửi đi trên tất cả các đƣờng ra trừ đƣờng mà nó đi đến. Phƣơng thức lan tràn gói này hiển nhiên là tạo ra rất nhiều gói sao chép (duplicate). Trên thực tế, số gói này là không xác định trừ khi thực hiện một số biện pháp để hạn chế quá trình này. Một trong những biện pháp đó là sử dụng bộ đếm bƣớc nhảy trong phần tiêu đề của mỗi gói. Giá trị này sẽ bị giảm đi một tại mỗi bƣớc nhảy. Gói sẽ bị loại bỏ khi bộ đếm đạt giá trị không. Về mặt lý tƣởng, bộ đếm bƣớc nhảy sẽ có giá trị ban đầu tƣơng ứng với độ dài từ nguồn đến đích. Nếu nhƣ ngƣời gửi không biết độ dài của đƣờng đi, nó có thể đặt giá trị ban đầu của bộ đếm cho trƣờng hợp xấu nhất. Khi đó giá trị ban đầu đó sẽ đƣợc đặt bằng đƣờng kính của mạng con. Một kỹ thuật khác để ngăn sự lan tràn gói là thêm số thứ tự vào tiêu đề các gói. Mỗi router sẽ cần có một danh sach theo nút nguồn để chỉ ra những số thứ tự từ nguồn đó đã đƣợc xem xét. Để tránh danh sách phát triển không giới hạn, mỗi danh sách sẽ tăng lên bởi số đếm k để chỉ ra rằng tất cả các số thứ tự đến k đã đƣợc xem. Khi một gói đi tới, rất dễ dàng có thể kiểm tra đƣợc gói là bản sao hay không. Nếu đúng gói là bản sao thì gói này sẽ bị loại bỏ. Lan tràn gói có ƣu điểm là lan tràn gói luôn luôn chọn đƣờng ngắn nhất. Có đƣợc ƣu điểm này là do về phƣơng diện lý thuyết nó chọn tất cả các đƣờng có thể do đó nó sẽ chọn đƣợc đƣờng ngắn nhất. Tuy nhiên nhƣợc điểm của nó là số lƣợng gói gửi trong mạng quá nhiều. Sử dụng lan tràn gói trong hầu hết các ứng dụng là không thực tế. Tuy vậy lan tràn gói có thể sử dụng trong những ứng dụng sau. - Trong ứng dụng quân sự, mạng sử dụng phƣơng thức lan tràn gói để giữ cho mạng luôn luôn hoạt động tốt khi đối mặt với quân địch. - Trong những ứng dụng cơ sở dữ liệu phân bố, đôi khi cần thiết phải cập nhật tất cả cơ sở dữ liệu. Trong trƣờng hợp đó sử dụng lan tràn gói là cần thiết. Ví dụ sự dụng lan tràn gói để gửi cập nhật bản định tuyến bởi vì cập nhật không dựa trên độ chính xác của bảng định tuyến. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -20- - Phƣơng pháp lan tràn gói có thể đƣợc dùng nhƣ là đơn vị để so sánh phƣơng thức định tuyến khác. Lan tràn gói luôn luôn chọn đƣờng ngắn nhất. Điều đó dẫn đến không có giải thuật nào có thể tìm đƣợc độ trễ ngắn hơn. Một biến đổi của phƣơng pháp lan tràn gói là lan tràn gói có chọn lọc. Trong giải thuật này, router chỉ gửi gói đi ra trên các đƣờng mà đi theo hƣớng đích. Điều đó có nghĩa là không gửi gói đến những đƣờng mà rõ rang nằm trên hƣớng sai. 2.2.2 Định tuyến bước ngẫu nhiên (random walk) Trong phƣơng pháp định tuyến này, router sẽ chuyển gói đi đến trên một đƣờng đầu ra đƣợc chọn một cách ngẫu nhiên. Mục tiêu của phƣơng pháp này là các gói lang thang trong mạng cuối cùng cũng đến đích. Với phƣơng pháp này giúp cho quá trình cân bằng tải giữa các đƣờng. Cũng giống nhƣ phƣơng pháp định tuyến lan tràn gói, phƣơng pháp này luôn đảm bảo là gói cuối cùng sẽ đến đích. So với phƣơng pháp trƣớc thì sự nhân rộng gói trong mạng sẽ ít hơn. Nhƣợc điểm của phƣơng pháp này là đƣờng từ nguồn đến đích có thể dài hơn đƣờng ngắn nhất. Do đó trễ đƣờng truyền sẽ dài hơn sẽ trễ ngắn nhất thực sự tồn tại trong mạng. 2.2.3 Định tuyến khoai tây nóng (hot potato) Định tuyến riêng biệt là loại định tuyến mà router quyết định tuyến đi chỉ dựa vào thông tin bản thân nó lƣợm lặt đƣợc. Đây là một thuật toán tƣơng thích riêng biệt (isolated adaptive algorithm). Khi một gói đến một nút, router sẽ cố gắng chuyển gói đó đi càng nhanh càng tốt bằng cách cho nó vào hàng chờ đầu ra ngắn nhất. Nói cách khác, khi có gói đi đến router sẽ tính toán số gói đƣợc nằm chờ để truyền tren mỗi đƣờng đầu ra. Sau đó nó sẽ gán gói mới vào cuối hàng chờ ngắn nhất mà không quan tâm đến đƣờng đó sẽ đi đâu. Hình biễu diễn các hàng chờ đầu ra bên trong một router tại một thời điểm nào đó. Có ba hàng chờ đầu ra tƣơng ứng với 03 đƣờng ra. Các gói đang xếp hàng trên mỗi đƣờng để chờ đƣợc truyền đi. Trong ví dụ ở đây, hàng chờ đến F là hàng chờ ngắn nhất với chỉ có một gói nằm trên hàng chờ này. Giảu thuật khoai tây nóng do đó sẽ đặt gói mới đến vào hàng chờ này. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -21- Hình 2.1. Hàng chờ bên trong router Có thể biến đổi ý tƣởng này một chút bằng cách kết hợp định tuyến tĩnh với giải thuật khoai tây nóng. Khi gói đi đến, router sẽ tính đến cả những trọng số tĩnh của đƣờng dây và độ dài hàng chờ. Một khả năng là sử dụng lựa chọn tĩnh tốt nhất trừ khi độ dài hàng chờ lớn hơn một ngƣỡng nào đó. Một khả năng khác là sử dụng độ dài hàng chờ ngắn nhất trừ trọng số tĩnh của nó là quá thấp. Còn một cách khác là sắp xếp các đƣờng theo trọng số tĩnh của nó và sau đó lại sắp xếp theo độ dài hàng chờ của nó. Sau đó sẽ chọn đƣờng có tổng vị trí sắp xếp là nhỏ nhất. Dù giải thuật nào đƣợc chọn đi chăng nữa cũng có đặc tính là khi ít tải thì đƣờng có trọng số cao nhất sẽ đƣợc chọn, nhƣng sẽ làm cho hàng chờ cho đƣờng này tăng lên. Sau đó một số lƣu lƣợng sẽ đƣợc chuyển sang đƣờng ít tải hơn. 2.2.4 Định tuyến nguồn (source routing) và mô hình cây (spanning tree) Chúng ta sẽ xét một số thuật toán cơ bản dùng cho việc tìm kiếm các cây đƣợc sử dụng để thiết kế và phân tích mạng. Một cây là một graph không có các vòng; bất kỳ một cặp nút nào cũng chỉ có duy nhất một đƣờng đi. ở đây chủ yếu xem xét các graph vô hƣớng, những graph đó có các liên kết đƣợc sử dụng cả hai chiều trong quá trình tạo ra các đƣờng đi. Vì một số lý do, các cây rất hữu dụng và đƣợc sử dụng nhƣ là graph cơ bản cho các thuật toán và các kỹ thuật phân tích và thiết kế mạng. Thứ nhất, các cây là mạng tối thiểu; cung cấp một sự kết nối mà không một liên kết nào là không cần thiết. Thứ hai, do việc chỉ cung cấp duy nhất một đƣờng đi giữa một cặp nút bất kỳ, các cây giải quyết các vần đề về định tuyến (nghĩa là quyết định việc chuyển lƣu lƣợng giữa hai nút). Điều đó làm đơn giản mạng và dạng của nó. Tuy nhiên, vì các cây liên thông tối thiểu nên cũng đơn giản và có độ tin cậy tối thiểu. Đó là nguyên nhân tại sao các mạng thực tế thƣờng có tính liên thông cao hơn. Chính vì vậy, việc thiết kế một mạng thƣờng bắt đầu bằng một cây. 2.2.5 Duyệt cây Cho trƣớc một cây nào đó, chúng ta có thể đi tới mọi nút của nó. Quá trình đó gọi là một quá trình duyệt cây. Trong quá trình thực hiện, các cạnh trong cây đƣợc duyệt hai lần, mỗi lần theo một hƣớng khác nhau. Có nhiều cách duyệt khác nhau. Đầu tiên, chỉ ra một nút của cây làm nút gốc. Việc duyệt đƣợc thực hiện xoay quanh nút đó. Có một số điều kiện để lựa chọn nút gốc này (chẳng hạn nút gốc là một khu vực máy tính trung tâm). Ngoài ra, nút gốc có thể đƣợc chọn một cách ngẫu nhiên. Giả sử nút A trong hình 4.1 là nút gốc của cây. Từ A chúng ta có thể lần lƣợt đi tới các nút kề cận của nó nhƣ là B, C hoặc D. Sau đó, lại đi theo các nút kề cận của chúng (B, C và D) là E, F, G và H. Tiếp tục đi tới lần lƣợt các nút kề cận khác bên cạnh các nút này. Khi đó, việc duyệt này sẽ kết thúc khi tới các nút I, J, K và L. Quá trình này đƣợc gọi là tìm kiếm theo KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -22- chiều rộng. Trong quá trình tìm kiếm theo chiều rộng một đặc điểm cần chú ý là những nút gần nút gốc nhất sẽ đƣợc tới trƣớc. Việc tìm kiếm sẽ thực hiện theo mọi hƣớng cùng lúc. Điều đó đôi khi có ích và đƣợc thực hiện dễ dàng. Một thuật toán nhằm đi tới mọi nút của cây thì đƣợc gọi là thuật toán duyệt cây. Thuật toán sau đây, Bfstree, thực hiện một quá trình tìm kiếm theo chiều rộng. (Chúng ta quy ƣớc rằng, các tên hàm có ký tự đầu tiên là ký tự hoa để phân biệt chúng với các tên biến). Bfstree sẽ sử dụng một danh sách kề cận n_adj_list, danh sách này liệt kê tất cả các nút kề cận của mỗi nút thuộc cây. Để đơn giản hơn, giả sử rằng cây này là một cây hữu hƣớng hƣớng ra nhìn từ gốc và do đó n_adj_list sẽ chỉ bao gồm các nút kề cận với một nút nào đó mà các nút kề cận đó xa gốc hơn so với nút đang xét. Hình 2.2. Duyệt cây KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -23- void <-BfsTree ( n, root, n_adj_list ): dcl n_adj_list [n, list ] scan_queue [queue ] InitializeQueue (scan_queue ) Enqueue( root, scan_queue ) while (NotEmpty(scan_queue)) node <- Dequeue (scan_queue) Visit(node ) for each (neighbor , n_adj_list [node ]) Enqueue(neighbor, scan_queue) Visit là một thủ tục trong đó thực hiện một số quá trình nào đó đối với mỗi nút (chẳng hạn nhƣ in lên màn hình các thông tin của mỗi nút .v.v). Thuật toán này đƣợc thực hiện cùng một hàng đợi. Hàng đợi là một FIFO; trong đó các phần tử đƣợc thêm vào từ phía sau hàng đợi và chuyển ra từ phía trƣớc. Các thủ tục InitializeQueue, Enqueue, Dequeue, NotEmpty làm việc trên các hàng đợi. InitializeQueue thiết lập một hàng đợi rỗng. Enqueue, Dequeue là các thủ tục để thêm một phần tử vào cuối hàng đợi và chuyển một phần tử ra từ đầu hàng đợi. Hàm NotEmpty trả về TRUE hoặc FALSE tuỳ thuộc vào hàng đợi có rỗng hay không. n_adj_list là một chuỗi mà mỗi phần tử của chuỗi là một danh sách. n_adj_list[n] là một danh sách các nút kề cận nút n. Nhƣ đã nói ở chƣơng trƣớc, for_each(element, list), là một cấu trúc điều khiển thực hiện vòng lặp đối với tất cả các phần tử của list và thực hiện các mã ở bên trong vòng lặp, trong vòng lặp đó các phần tử của list lần lƣợt đƣợc sử dụng. Thủ tục trên hoạt động với giả thiết là n_adj_list đã đƣợc thiết lập trƣớc khi thủ tục BfsTree đƣợc gọi. Tƣơng tự, ta có thể định nghĩa một quá trình tìm kiếm theo chiều sâu. Quá trình này cũng bắt đầu từ nút gốc. Quá trình duyệt tiếp tục thực hiện nút láng giềng chƣa đƣợc duyệt của nút vừa mới đƣợc duyệt. Ta cũng giả sử rằng cây bao gồm các liên kết có hƣớng đi ra xa nút gốc. Ví dụ 2.1: Trở lại với graph trong hình 4.1, ta có thể tới nút B từ nút A. Sau đó, ta tới nút E, kề cận với nút B-nút đƣợc duyệt gần thời điểm hiện tại nhất. Nút E này không có nút kề cận chƣa duyệt nào, do vậy ta phải quay trở lại nút B để đi sang nút F. Ta tiếp tục đi tới các nút I, J, K (cùng với việc quay lại nút I), và nút L. Sau đó ta quay trở về nút A, tiếp tục tới các nút còn lại là C, D, G và H. Do vậy, toàn bộ quá trình duyệt là: A, B, E, F, I, J, K, L, C, D, G, H KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -24- Nhớ rằng thứ tự của quá trình duyệt là không duy nhất. Trong quá trình duyệt trên ta chọn các nút kề cận để xâm nhập theo thứ tự từ trái qua phải. Nếu chọn theo thứ tự khác, quá trình duyệt là: A, B, F, I, J, K, L, E, D, H, G, C Trật tự thực tế của quá trình duyệt phụ thuộc vào từng thuật toán cụ thể. Điều này cũng đúng với một quá trình tìm kiếm theo chiều rộng. Kiểm tra thuật toán BfsTree, trật tự này là một hàm của trật tự các nút cận kề trong n_adj_list. Thuật toán DfsTree sau sẽ thực hiện một quá trình tìm kiếm theo chiều sâu. void <- DfsTree(n, root, n_adj_list): dcl n_adj_list [n, list] Visit(root) for each(neighbor, n_adj_list[node]) DfsTree(n, neighbor, n_adj-list) Quá trình tìm kiếm này sẽ đƣợc thực hiện với sự trợ giúp của một ngăn xếp theo kiểu LIFO, nghĩa là phần tử đƣợc thêm vào và chuyển ra từ đỉnh ngăn xếp. Trong trƣờng hợp này, chúng ta thƣờng gọi đệ quy DfsTree, thực tế chúng ta đã sử dụng ngăn xếp hệ thống, nghĩa là sử dụng loại ngăn xếp mà hệ thống sử dụng để lƣu giữ các lời gọi hàm và đối số. Cả hai loại duyệt trình bày ở trên đều là quá trình duyệt thuận (nghĩa là các quá trình này duyệt một nút rồi sau đó duyệt tới nút tiếp theo của nút đó). Quá trình duyệt ngƣợc đôi khi cũng rất cần thiết, trong quá trình duyệt ngƣợc một nút đƣợc duyệt sau khi đã duyệt nút tiếp của nút đó. Dĩ nhiên, cũng có thể thành lập một danh sách thuận và sau đó đảo ngƣợc danh sách đó. Cũng có thể thay thế trật tự tìm kiếm một cách trực tiếp nhƣ thủ tục sau: void <- PostorderDfsTree(n, root, n_adj_list): dcl n_adj_list [n, list] for each(neighbor, n_adj_list[node]) PostorderDfsTree(n, neighbor, n_adj_list) Visit (root) a. Các thành phần liên thông trong các graph vô hƣớng Ta có thể áp dụng khái niệm duyệt các nút vào một graph vô hƣớng, đơn giản chỉ bằng cách theo dõi các nút đã đƣợc duyệt và sau đó không duyệt các nút đó nữa. Có thể duyệt một graph vô hƣớng nhƣ sau: KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -25- void <- Dfs(n, root, n_adj_list): dcl n_adj_list [n, list] visited [n] void <- DfsLoop (node) if (not(visited [node]) visited [node]<-TRUE visit [node] for each(neighbor, n_adj_list[node]) DfsLoop (neighbor) visited <-FALSE DfsLoop (root) Chú ý rằng câu lệnh Visited <-FALSE dùng khởi tạo toàn bộ các phần tử mảng đƣợc duyệt bằng FALSE. Cũng cần chú ý rằng thủ tục DfsLoop đƣợc định nghĩa bên trong thủ tục Dfs nên DfsLoop có thể truy cập tới visited và n_adj_list (Lƣu ý rằng cách dễ nhất để đọc các giả mã cho các hàm có dạng hàm Dfs ở trên là trƣớc tiên hãy đọc thân của hàm chính rồi quay trở lại đọc thân của các hàm nhúng nhƣ hàm DfsLoop). Chú ý rằng trong quá trình duyệt chúng ta đã ngầm kiểm tra tất cả các cạnh trong graph, một lần cho mỗi đầu cuối của mỗi cạnh. Cụ thể, với mỗi cạnh (i, j) của graph thì j là một phần tử của n_adj_list[i] và i là một thành phần trong n_adj_list[j]. Thực tế, có thể đƣa chính các cạnh đó vào các danh sách kề cận của nó và sau đó tìm nút ở điểm cuối khác của cạnh đó bằng hàm: node <- OtherEnd(node1, edge) Hàm này sẽ trả về một điểm cuối của edge khác với node1. Điều đó làm phức tạp quá trình thực hiện đôi chút. Có thể dễ dàng thấy rằng độ phức tạp của các thuật toán duyệt cây này bằng O(E), với E là số lƣợng cạnh trong graph. Bây giờ chúng ta có thể tìm đƣợc các thành phần liên thông của một graph vô hƣớng bằng cách duyệt mỗi thành phần. Chúng ta sẽ đánh dấu mỗi nút bằng một chỉ số thành phần khi chúng ta tiến hành. Các biến n_component sẽ theo dõi bất kỳ thành phần nào mà chúng ta đi tới KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -26- void <- LabelComponent (n, n_adj_list): dcl n_component_number [n], n_adj_list[n,list] void <- Visit [node] n_component_number [node]<- ncomponents n_component_number<-0 ncomponent<-0 for each(node, node_set) if (n_component_number [node]=0) ncomponent +=1 Dfs (node, n_adj_list) Chúng ta định nghiã một hàm Visit để thiết lập một chỉ số thành phần các nút đƣợc duyệt. Hàm này nằm bên trong thủ tục LabelComponent và chỉ có thể đƣợc gọi từ trong thủ tục đó. Mặt khác, Dfs còn đƣợc định nghĩa ở bên ngoài, vì thế nó có thể đƣợc gọi từ bất kỳ đâu. Trong khi thực hiện quá trình duyệt theo chiều rộng và chiều sâu một graph vô hƣớng, những cạnh nối một nút với một nút láng giềng chƣa duyệt trƣớc khi duyệt nút đó tạo ra một cây, nếu graph là không liên thông thì tạo ra một rừng. Hình 2.3. Các thành phần Hình2.3 biểu diễn một graph có 4 thành phần. Giả sử vòng trên tập các nút đi theo tuần tự alphabet, các thành phần đƣợc đánh số theo trật tự các nút có chữ cái "thấp nhât" và chỉ số thành phần đƣợc biểu diễn ở bên cạnh nút. Với mỗi thành phần, thuật toán trên sẽ gọi Dfs để kiểm tra thành phần đó. Trong đó, thuật toán cũng kiểm tra các cạnh, mỗi cạnh một lần. Vì thế, độ phức tạp của nó có bậc bằng bậc của KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -27- tổng số các nút cộng với số các cạnh trong tất cả các thành phần (nghĩa là độ phức tạp của thuật toán bằng O(N+E)). b. Cây bắc cầu tối thiểu (Minimum Spanning Tree) Có thể sử dụng Dfs để tìm một cây bắc cầu nếu có một cây bắc cầu tồn tại. Cây tìm đƣợc thƣờng là cây vô hƣớng. Việc tìm cây "tốt nhất" thƣờng rất quan trọng . Chính vì vậy, chúng ta có thể gắn một "độ dài" cho mỗi cạnh trong graph và đặt ra yêu cầu tìm một cây có độ dài tối thiểu. Thực tế, "độ dài" có thể là khoảng cách, giá, hoặc là một đại lƣợng đánh giá độ trễ hoặc độ tin cậy. Một cây có tổng giá là tối thiểu đƣợc gọi là cây bắc cầu tối thiểu. Nói chung, nếu graph là một graph không liên thông, chúng ta có thể tìm đƣợc một rừng bắc cầu tối thiểu. Một rừng bắc cầu tối thiểu là một tập hợp các cạnh nối đến graph một cách tối đa có tổng độ dài là tối thiểu. Bài toán này có thể đƣợc xem nhƣ là việc lựa chọn một graph con của graph gốc chứa tất cả các nút của graph gốc và các cạnh đƣợc lựa chọn. Đầu tiên, tạo một graph có n nút, n thành phần và không có cạnh nào cả. Mỗi lần, chúng ta chọn một cạnh để thêm vào graph này hai thành phần liên thông trƣớc đó chƣa đƣợc kết nối đƣợc liên kết lại với nhau tạo ra một thành phần liên thông mới (chứ không chọn các cạnh thêm vào một thành phần liên thông trƣớc đó và tạo ra một vòng). Vì vậy, tại bất kỳ giai đoạn nào của thuật toán, quan hệ: n=c+e luôn đƣợc duy trì, ở đây n là số lƣợng nút trong graph, e là số cạnh đƣợc lựa chọn tính cho tới thời điểm xét và c là số lƣợng thành phần trong graph tính cho tới thời điểm xét. Ở cuối thuật toán, e bằng n trừ đi số thành phần trong graph gốc; nếu graph gốc là liên thông, chúng ta sẽ tìm đƣợc một cây có (n-1) cạnh. Nhƣ đã giải thích ở trên, Dfs sẽ tìm ra một rừng bắc cầu. Tuy nhiên, chúng ta thƣờng không tìm đƣợc cây bắc cầu có tổng độ dài tối thiểu.  Thuật toán "háu ăn" Một cách tiếp cận khả dĩ để tìm một cây có tổng độ dài tối thiểu là, ở mỗi giai đoạn của thuật toán, lựa chọn cạnh ngắn nhất có thể. Thuật toán đó gọi là thuật toán "háu ăn". Thuật toán này có tính chất "thiển cận" nghĩa là không lƣờng trƣớc đƣợc các kết quả cuối cùng do các quyết định mà chúng đƣa ra ở mỗi bƣớc gây ra. Thay vào đó, chúng chỉ đƣa ra cách chọn tốt nhất cho mỗi quá trình lựa chọn. Nói chung, thuật toán "háu ăn" không tìm đƣợc lời giải tối ƣu cho một bài toán. Thực tế thuật toán thậm chí còn không tìm đƣợc một lời giải khả thi ngay cả khi lời giải đó tồn tại. Tuy nhiên chúng hiệu quả và dễ thực hiện. Chính vì vậy chúng đƣợc sử dụng rộng rãi. Các thuật toán này cũng thƣờng tạo cơ sở cho các thuật toán có tính hiệu quả và phức tạp hơn. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -28- Vì thế, câu hỏi đầu tiên đặt ra khi xem xét việc ứng dụng một thuật toán để giải quyết một bài toán là liệu bài toán ấy có hay không cấu trúc nào đó đảm bảo cho thuật toán hoạt động tốt. Hy vọng rằng thuật toán ít ra cũng đảm bảo đƣợc một lời giải khả thi nếu lời giải đó tồn tại. Khi đó, nó sẽ đảm bảo tính tối ƣu và đảm bảo yêu cầu nào đó về thời gian thực hiện. Bài toán tìm các cây bắc cầu tối thiểu thực sự có một cấu trúc mạnh cho phép thuật toán "háu ăn" đảm bảo cả tính tối ƣu cũng nhƣ đảm bảo độ phức tạp tính toán ở mức độ vừa phải. Dạng chung của thuật toán "háu ăn" là: Bắt đầu bằng một lời giải rỗng s. Trong khi vẫn còn có các phần tử cần xét Tìm e, phần tử "tốt nhất" vẫn chƣa xét Nếu việc thêm e vào s là khả thi thì e đƣợc thêm vào s, nếu việc thêm đó không khả thi thì loại bỏ e. Các yêu cầu các khả năng sau:  So sánh giá trị của các phần tử để xác định phần tử nào là "tốt nhất"  Kiểm tra tính khả thi của một tập các phần tử Khái niệm "tốt nhất" liên quan đến mục đích của bài toán. Nếu mục đích là tối thiểu, "tốt nhất" nghĩa là bé nhất. Ngƣợc lại, "tốt nhất" nghĩa là lớn nhất. Thƣờng thƣờng, mỗi giá trị gắn liền với một phần tử, và giá trị gắn liền với một tập đơn giản chỉ là tổng các giá trị đi cùng của các phần tử trong tập đó. Đó là trƣờng hợp cho bài toán cây bắc cầu tối thiểu đƣợc xét trong phần này. Tuy nhiên, đó không phải là trƣờng hợp chung. Chẳng hạn, thay cho việc tối thiểu tổng độ dài của tất cả các cạnh trong một cây, mục đích của bài toán là tối thiểu hoá độ dài các cạnh dài nhất trong cây. Trong trƣờng hợp đó, giá trị của một cạnh là độ dài của cạnh đó và giá trị của một tập sẽ là độ dài của cạnh dài nhất nằm trong tập. Muốn tìm đƣợc cạnh "tốt nhất" để bổ sung, hãy đánh giá các cạnh theo độ ảnh hƣởng về giá trị của nó tới giá trị của tập. Giả sử V(S) là giá trị của tập S và v(e,S) là giá trị của một phần tử e thì v(e,S) có quan hệ với tập S bởi công thức v(e,S)= V(S  e) - V(S) Trong trƣờng hợp tối thiểu độ dài của cạnh dài nhất trong một cây. v(e,S) bằng 0 đối với bất kỳ cạnh nào không dài hơn cạnh dài nhất đã đƣợc chọn. Ngƣợc lại, nó sẽ bằng hiệu độ dài giữa cạnh với cạnh dài nhất đã đƣợc chọn, khi hiệu đó lớn hơn 0. Trong trƣờng hợp chung, giá trị của tập có thể thay đổi một cách ngẫu nhiên khi các phần tử đƣợc bổ sung vào nó. Chúng ta có thể gán giá trị 1 cho các tập có số lƣợng phần tử là chẵn và 2 cho các tập có số lƣợng phần tử là lẻ. Điều đó làm cho các giá trị của các phần tử chỉ là một KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -29- trong hai giá trị +1 và -1. Trong trƣờng hợp này, thuật toán "háu ăn" không đƣợc sử dụng. Bây giờ giả sử rằng "trọng lƣợng" của một tập biến đổi theo một cách hợp lý hơn thì khi đó, sẽ có một cơ sở hợp lý hơn cho việc chỉ ra phần tử "tốt nhất". Một điều quan trọng cần chú ý đó là, khi tập lớn lên, giá trị của phần tử mà trƣớc đó không đƣợc xem xét có thể thay đổi do các phần tử thêm vào tập đó. Khi điều này xảy ra, thuật toán "háu ăn" có thể mắc lỗi trong các lựa chọn của nó và sẽ ảnh hƣởng tới chất lƣợng của lời giải mà chúng ta nhận đƣợc. Tƣơng tự, trong hầu hết các trƣờng hợp, tính khả thi có thể bị ảnh hƣởng một cách ngẫu nhiên do sự bổ sung phần tử. Chính vì vậy, trong các bài toán mà những tập có số lƣợng phần tử chẵn có thể đƣợc xem là khả thi và những tập có số phần tử là lẻ có thể đƣợc xem là không khả thi thì thuật toán "háu ăn" hoặc bất kỳ thuật toán nào có bổ sung các phần tử, mỗi lần một phần tử, sẽ không hoạt động. Vì vậy chúng ta sẽ giả thiết các tính chất sau, những tính chất này luôn đƣợc duy trì trong mọi trƣờng hợp xem xét: Tính chất 1: Bất kỳ một tập con nào của một tập khả thi thì cũng khả thi, đặc biệt tập rỗng cũng là một tập khả thi. Ngoài ra giả thiết rằng độ phức tạp của thuật toán để tính toán giá trị của một tập và kiểm tra sự khả thi của chúng là vừa phải, đặc biệt, khi độ phức tạp này là một đa thức của số nút và cạnh trong graph. list<-Greedy (properties) dcl properties [list, list] candidate_set[list] solution[list] void<-GreedyLoop ( *candidate_set, *solution) dcl test_set[list],solution[list], candidate_set[list] element <- SelectBestElement(candidate_set) test_set <-Append(element,solution) if(Test(test_set)) solution<-test_set candidate_set<-Delete(element,candidate_set) if(not(Empty(candidate_set))) Greedy_loop(*candidate_set, *solution) candidate_set<-ElementsOf(properties) KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -30- solution<- if(!(Empty(element_set))) GreedyLoop(*candidate_set, *solution) return(solution) Bây giờ ta đã có thể xem xét sâu hơn các câu lệnh của thuật toán "háu ăn". Các câu lệnh của thuật toán hơi khó hiểu vì chúng dựa trên định nghĩa của hai hàm, Test và SelestBestElement (là hàm kiểm tra tính khả thi và đánh giá các tập). Chúng ta cũng giả sử rằng có một cấu trúc properties, là một danh sách của các danh sách chứa tất cả các thông tin cần thiết để kiểm tra và đánh giá tất cả các tập. Một danh sách của các danh sách đơn giản chỉ là một danh sách liên kết, mà mỗi thành viên của nó là một danh sách. Thậm chí cấu trúc đó có thể đƣợc lồng vào nhau sâu hơn, nghĩa là có các danh sách nằm bên trong các danh sách nằm bên trong các danh sách. Cấu trúc nhƣ vậy tƣơng đối phổ biến và có thể đƣợc sử dụng để biểu diễn hầu hết các kiểu thông tin. Có thể lƣu giữ độ dài, loại liên kết, dung lƣợng, hoặc địa chỉ. Bản thân các mục thông tin này có thể là một cấu trúc phức tạp; nghĩa là cấu trúc đó có thể lƣu giữ giá và các dung lƣợng của một vài loại kênh khác nhau cho mỗi liên kết. Trên thực tế, điều đó rất có ích cho việc duy trì các cấu trúc dữ liệu trợ giúp để cho phép thuật toán thực hiện hiệu quả hơn. Bài toán về cây bắc cầu tối thiểu là một ví dụ. Tuy nhiên, để rõ ràng, giả sử rằng tất cả quá trình tính toán đƣợc thực hiện trên một cấu trúc properties sẵn có (đã đƣợc khởi tạo).  đƣợc sử dụng để biểu diễn tập rỗng. Append và Delete là các hàm bổ sung và chuyển đi một phần tử khỏi một danh sách. ElementsOf chỉ đơn giản để chỉ ra các phần tử của một danh sách; vì vậy, ban đầu tất cả các phần tử trong properties là các ứng cử. Có rất nhiều cách thực hiện các quá trình này. properties có thể là một dãy và các hàm Append, Delete và ElementsOf có thể hoạt động với các danh sách chỉ số (danh sách mà các phần tử là các chỉ số mạng). Trong thực tế cách thực hiện đƣợc chọn là cách làm sao cho việc thực hiện các hàm Test và SelectBestElement là tốt nhất. Đoạn giả mã trên giả thiết rằng thuật toán "háu ăn" sẽ dừng lại khi không còn phần tử nào để xem xét. Trong thực tế, có nhiều nguyên nhân để thuật toán dừng lại. Một trong những nguyên nhân là khi kết quả xấu đi khi các phần tử đƣợc tiếp tục thêm vào. Điều nay xảy ra khi tất cả các phần tử còn lại đều mang giá trị âm trong khi chúng ta đang cố tìm cho một giá trị tối đa. Một nguyên nhân khác là khi biết rằng không còn phần tử nào ở trong tập ứng cử có khả năng kết hợp với các phần tử vừa đƣợc chọn tạo ra một lời giải khả thi. Điều này xảy ra khi một cây bắc cầu toàn bộ các nút đã đƣợc tìm thấy. Giả sử rằng thuật toán dừng lại khi điều đó là hợp lý, còn nếu không, các phần tử không liên quan sẽ bị loại ra khỏi lời giải. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -31- Giả thiết rằng, các lời giải cho một bài toán thoả mãn tính chất 1 và giá trị của tập đơn giản chỉ là tổng các giá trị của các phần tử trong tập. Ngoài ra, giả thiết thêm rằng tính chất sau đƣợc thoả mãn: Tính chất 2: Nếu hai tập Sp và Sp+1 lần lƣợt có p và p+1 phần tử là các lời giải và tồn tại một phần tử e thuộc tập Sp+1 nhƣng không thuộc tập Sp thì Sp{e} là một lời giải. Chúng ta thấy rằng, các cạnh của các rừng thoả mãn tính chất 2, nghĩa là nếu có hai rừng, một có p cạnh và rừng kia có p+1 thì luôn tìm đƣợc một cạnh thuộc tập lớn hơn mà việc thêm cạnh đó vào tập nhỏ hơn không tạo ra một chu trình. Một tập các lời giải thoả mãn các tính chất trên gọi là một matroid. Định lý sau đây là rất quan trọng (chúng ta chỉ thừa nhận chứ không chứng minh). Định lý 2.1 Thuật toán “háu ăn” đảm bảo đảm một lời giải tối ƣu cho một bài toán khi và chỉ khi các lời giải đó tạo ra một matroid. Có thể thấy rằng, tính chất 1 và tính chất 2 là điều kiện cần và đủ để đảm bảo tính tối ƣu của thuật toán “háu ăn” . Nếu có một lời giải cho một bài toán nào đó mà nó thoả mãn hai tính chất 1 và 2 thì cách đơn giản nhất là dùng thuật toán “háu ăn” để giải quyết nó. Điều đó đúng với một cây bắc cầu. Sau đây là một định lý không kém phần quan trọng. Định lý 2.2 Nếu các lời giải khả thi cho một bài toán nào đó tạo ra một matroid thì tất cả các tập khả thi tối đa có số lƣợng phần tử nhƣ nhau. Trong đó, một tập khả thi tối đa là một tập mà khi thêm các phần tử vào thì tính khả thi của nó không đƣợc bảo toàn; Nó không nhất thiết phải có số lƣợng phần tử tối đa cũng nhƣ không nhất thiết phải có trọng lƣợng lớn nhất. Định lý đảo của định lý trên cũng có thể đúng nghiã là nếu tính chất 1 đƣợc thoả mãn và mọi tập khả thi tối đa có cùng số lƣợng phần tử, thì tính chất 2 đƣợc thoả mãn. Định lý 2.2 cho phép chúng ta chuyển đổi một bài toán tối thiểu P thành một bài toán tối đa P' bằng cách thay đổi các giá trị của các phần tử. Giả thiết rằng tất cả v(xj) trong P có giá trị âm. Lời giải tối ƣu cho bài toán P có số lƣợng phần tử tối đa là m thì chúng ta có thể tạo ra một bài toán tối đa P' từ P bằng cách thiết lập các giá trị của các phần tử trong P' thành -v(xj). Tất cả các phần tử đều có giá trị dƣơng và P' có một lời giải tối ƣu chứa m phần tử. Thực ra, thứ tự của các lời giải tối đa phải đƣợc đảo lại: lời giải có giá trị tối đa trong P' cũng là lời giải có giá trị tối thiểu trong P. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -32- Giả sử lúc nay ta cần tìm một lời giải có giá trị tối thiểu, tuân theo điều kiện là có số lƣợng tối đa các phần tử. Sẽ tính cả các phần tử có giá trị dƣơng. Có thể giải quyết bài toán P nhƣ là một bài toán tối đa P' bằng cách thiết lập các giá trị của các phần tử thành B-v(xj) với B có giá trị lớn hơn giá trị lớn nhất của xj. Khi đó các giá trị trong P' đều dƣơng và P' là một lời giải tối ƣu có m phần tử. Thứ tự của tất cả các tập khả thi tối đa đã bị đảo ngƣợc: một tập có giá trị là V trong P thì có giá trị là mB-V trong lời giải P'. Một giá trị tối đa trong P' thì có giá trị tối thiểu trong P. Quy tắc này cũng đúng với các cây bắc cầu thoả mãn tính chất 1 và tính chất 2 và có thể tìm một cây bắc cầu tối thiểu bằng cách sử dụng một thuật toán “háu ăn”. a. Thuật toán Kruskal Thuật toán Kruskal là một thuật toán “háu ăn” đƣợc sử dụng để tìm một cây bắc cầu tối thiểu. Tính đúng đắn của thuật toán dựa trên các định lý sau: Định lý 2.3 Các rừng thì thoả mãn tính chất 1 và 2. Nhƣ chúng ta đã biết, một rừng là một tập hợp các cạnh mà tập hợp đó không chứa các chu trình. Rõ ràng là bất kỳ một tập con các cạnh nào của một rừng (thậm chí cả tập rỗng) cũng là một rừng, vì vậy tính chất 1 đƣợc thoả mãn. Để thấy rằng tính chất 2 cũng thoả mãn, xét một graph đƣợc biểu diễn trong hình 2.4. Hình 2.3. xét một graph được biểu diễn trong hình 4.4. Giả sử có một rừng F1 có p cạnh. Rừng {2,4} là một ví dụ với p=2, và nó đƣợc biểu diễn bằng nét đứt trong hình 4.4. Khi đó xét một rừng khác F2 có p+1 cạnh. Có hai trƣờng hợp đƣợc xét. Trƣờng hợp 1: F2 đi tới một nút n, nhƣng F1 không đi tới nút đó. Một ví dụ của trƣờng hợp này là rừng {1, 4, 6}, rừng này đi tới E còn F1 thì không. Trong trƣờng hợp này, có thể tạo ra rừng {2, 4, 6} bằng cách thêm cạnh 6 vào rừng {2,4}. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -33- Trƣờng hợp 2: F2 chỉ đi tới các nút mà F1 đi tới. Một ví dụ của trƣờng hợp này là rừng {1. 4. 5}. Xét S, một tập các nút mà F1 đi tới. Cho rằng có k nút trong tập S. Vì F1 là một rừng nên mỗi cạnh trong F1 giảm số lƣợng thành phần trong S đi một, do đó tổng số lƣợng thành phần là k-p. Tƣơng tự, F2 tạo ra k-(p+1) thành phần từ S (số lƣợng thành phần vừa nói bé hơn với số lƣợng thành phần của F1). Vì vậy, một cạnh tồn tại trong F2 mà các điểm cuối của nó nằm ở các thành phần khác nhau trong F1 thì có thể thêm cạnh đó vào F1 mà không tạo ra một chu trình. Cạnh 3 là một cạnh có tính chất đó trong ví dụ này (cạnh 1 và 5 cũng là những cạnh nhƣ vậy). Vì thế, chúng ta thấy rằng nếu tính chất 1 và 2 đƣợc thoả mãn thì một thuật toán “háu ăn” có thể tìm đƣợc một lời giải tối ƣu cho cả bài toán cây bắc cầu tối thiểu lẫn bài toán cây bắc cầu tối đa. Chú ý rằng một cây bắc cầu là một rừng có số cạnh tối đa N-1 cạnh với N là số nút trong mạng. Sau đây chúng ta sẽ xét bài toán tối thiểu. Thuật toán Kruskal thực hiện việc sắp xếp các cạnh với cạnh đầu tiên là cạnh ngắn nhất và tiếp theo chọn tất cả các cạnh mà những cạnh này không cùng với các cạnh đƣợc lựa chọn trƣớc đó tạo ra các chu trình. Chính vì thế, việc thực hiện thuật toán đơn giản là: list <- kruskal_l( n, m, lengths ) dcl length[m], permutation[m], solution[list] permution <- VectorSort( n , lengths ) solution <-  for each ( edge , permutation ) if ( Test(edge , solution ) ) solution <- Append ( edge , solution ) return( solution ) VectorSort có đầu vào là một vector có độ dài là n và kết quả trả về là thứ tự sắp xếp các số nguyên từ 1 tới n. Sự sắp xếp đó giữ cho giá trị tƣơng ứng trong vector theo thứ tự tăng dần. Ví dụ 2.2: Giả sử rằng n= 5 và giá trị của một vector là 31, 19, 42, 66, 27 VectorSort sẽ trả về thứ tự sắp xếp nhƣ sau: 2, 5, 1, 3, 4 Test nhận một danh sách các cạnh và trả về giá trị TRUE nếu các cạnh đó không chứa một chu trình. Vì Test đƣợc gọi cho mỗi nút, sự hiệu quả của toàn bộ thuật toán tuỳ thuộc vào tính hiệu quả của việc thực hiện Test. Nếu mỗi khi các cạnh đƣợc thêm vào cây, chúng ta theo dõi KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -34- đƣợc các nút của cạnh thuộc các thành phần nào thì Test trở nên đơn giản; đó đơn giản chỉ là việc kiểm tra xem các nút cuối của các cạnh đang đƣợc xét có ở cùng một thành phần không. Nếu cùng, cạnh sẽ tạo ra một chu trình. Ngƣợc lại, cạnh đó không tạo nên chu trình. Tiếp đó là xem xét việc duy trì cấu trúc thành phần. Có một số cách tiếp cận. Một trong các cách đó là ở mỗi nút duy trì một con trỏ đến một nút khác trong cùng một thành phần và có một nút ở mỗi thành phần gọi là nút gốc của thành phần thì trỏ vào chính nó. Vì thế lúc đầu, bản thân mỗi nút là một thành phần và nó trỏ vào chính nó. Khi một cạnh đƣợc thêm vào giữa hai nút i và j, trỏ i tới j. Sau đó, khi một cạnh đƣợc thêm vào giữa một nút i trong một thành phần có nút gốc là k và một nút j trong một thành phần có nút gốc là l thì trỏ k tới l. Vì vậy, chúng ta có thể kiểm tra một cạnh bằng cách dựa vào các con trỏ từ các nút cuối của nó và xem rằng chúng có dẫn đến cùng một nơi hay không. Chuỗi các con trỏ càng ngắn, việc kiểm tra càng dễ dàng. Nhằm giữ cho các chuỗi các con trỏ đó ngắn, Tarjan gợi ý nên làm gọn các chuỗi khi chúng đƣợc duyệt trong quá trình kiểm tra. Cụ thể, ông gợi ý một hàm FindComponent đƣợc tạo ra nhƣ sau: index <- FindComponent(node , *next) dcl next[] p=next[node] q=next[p] while ( p!=q ) next[node]= q node = q p=next[node] q=next[p] return (p) FindComponent trả về nút gốc của thành phần chứa node. Hàm này cũng điều chỉnh next , nút hƣớng về nút gốc chứa nút đó. Đặc biệt, hàm này điều chỉnh next hƣớng tới điểm ở tầng cao hơn. Tarjan chỉ ra rằng, bằng cách đó, thà làm gọn đƣờng đi tới nút gốc một các hoàn toàn còn hơn là không làm gọn một chút nào cả và toàn bộ kết quả trong việc tìm kiếm và cập nhật next chỉ lớn hơn so với O(n+m) một chút với n là số lƣợng nút và m là số lƣợng cạnh đƣợc kiểm tra. Ví dụ 2.3: KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -35- Hình 2.4. Phép tính Minimum Spanning Tree (MST) Xét một mạng đƣợc biểu diễn trong hình 4.4. các dấu * trong hình đƣợc giải thích dƣới đây. Đầu tiên, sắp xếp các cạnh và sau đó lần lƣợt xem xét từng cạnh, bắt đầu từ cạnh nhỏ nhất. Vì thế, chúng ta xem (A, C) là cạnh đầu tiên. Gọi FindComponent cho nút A ta thấy cả p lẫn q đều là A nên FindComponent trả về A nhƣ là nút gốc của thành phần chứa nút A. Tƣơng tự, FindComponent trả về C nhƣ là nút gốc của thành phần chứa nút C. Vì thế, chúng ta mang A và C vào cây và thiết lập next[A] bằng C. Sau đó, xét (B, D). Hàm cũng thực hiện tƣơng tự và B, D đƣợc thêm vào cây, next[B] bằng D. Chúng ta xét (C, E), chấp nhận nó và thiết lập next[C] bằng E. Bây giờ, xét (A, E). Trong FindComponent, p là C còn q là E. Vì thế chúng ta chạy vào vòng lặp while , thiết lập next[A] bằng E và rút ngắn đƣờng đi từ A tới E với E là nút gốc của thành phần chứa chúng. Node, p và q đƣợc thiết lập thành E và FindComponent trả về E nhƣ là nút gốc của thành phần chứa nút A. FindComponent cũng trả về E nhƣ là nút gốc của thành phần chứa E. Vì thế, cả hai điểm cuối của (A, E) là cùng một thành phần nên (A, E) bị loại bỏ. Tiếp đến, xét (A, B). Trong quá trình gọi FindComponent đối với nút A, chúng ta thấy rằng p=q=E và next không thay đổi. Tƣơng tự, quá trình gọi FindComponent đối với nút B ta đƣợc p=q=D. Vì thế, chúng ta thiết lập next[E] bằng D. Chú ý rằng, chúng ta không thiết lập next[A] bằng B, mà lại thiết lập next đối với nút gốc của thành phần của A bằng với nút gốc của thành phần của B. Cuối cùng, (C, D) đƣợc kiểm tra và bị loại bỏ. Trong hình 2.4 những cạnh trong cây bắc cầu đƣợc phân biệt bởi một dấu * ở ngay bên cạnh các cạnh đó. Nội dung các next đƣợc chỉ ra bằng các cung (các cạnh hữu hƣớng) có mũi tên. Chẳng hạn, next[B] bằng D đƣợc chỉ ra bằng một mũi tên từ B tới D. Chú ý rằng, các cung đƣợc định nghĩa bởi next tạo ra một cây, nhƣng nói chung cây đó không phải là một cây bắc cầu tối thiểu. Thực vậy, với trƣờng hợp có một cung (E, D), ngay cả khi các cung đó không cần thiết phải là một phần graph. Vì vậy, bản thân next chỉ định nghĩa cấu trúc thành phần khi KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -36- tiến hành thực hiện thuật toán. Chúng ta tạo một danh sách hiện các cạnh đƣợc chọn dành cho việc bao gộp trong cây. Giá của cây đƣợc định nghĩa bởi next tƣơng đối bằng phẳng, nghiã là các đƣờng đi tới các nút gốc của các thành phần là ngắn khiến FindComponent hoạt động hiệu quả. Hiển nhiên, sự phức tạp của thuật toán Kruskal đƣợc quyết định bởi việc sắp xếp các cạnh, sự sắp xếp đó có độ phức tạp là O(m log m). Nếu có thể tìm đƣợc cây bắc cầu trƣớc khi phải kiểm tra tất cả các cạnh thì chúng ta có thể cải tiến quá trình đó bằng cách thực hiện sắp xếp phân đoạn. Cụ thể, chúng ta có thể lƣu giữ các cạnh trong một khối (heap) và sau đó lấy ra, kiểm tra mỗi cạnh cho đến khi một cây đƣợc tạo ra. Chúng ta dễ dàng biết đƣợc quá trình đó dừng vào lúc nào; chỉ đơn giản là theo dõi số lƣợng cạnh đă đƣợc xét và dừng lại khi đã có n-1 cạnh đƣợc chấp nhận. Chúng ta giả sử rằng, các quá trình quản lý khối (heap) nhƣ thiết lập, bổ xung và lấy dữ liệu ra là đơn giản. Điều quan trọng cần chú ý ở đây là độ phức tạp của việc thiết lập một khối (heap) có m phần tử là O(m), độ phức tạp của việc tìm phần tử bé nhất là O(1) và độ phức tạp của việc khôi phục một khối (heap) sau khi bổ xung, xoá, hoặc thay đổi một giá trị là O(logm). Chính vì vậy, nếu chúng ta xét k cạnh để tìm cây bắc cầu, độ phức tạp trong việc duy trì một khối (heap) bằng O(m+klogm), độ phức tạp này bé hơn O(mlogm) nếu k có bậc bé hơn bậc của m. k tối thiểu bằng O(n) nên nếu graph là khá mỏng thì việc sử dụng khối (heap) sẽ không có lợi. Nếu graph là dày đặc thì việc lƣu trữ đó có thể đƣợc xem xét. Đây là phiên bản cuối cùng của thuật toán Kruskal, thuật toán này tận dụng các hiệu ứng nói trên. list <- Kruskal_l( n, m, lengths ) dcl length[m], ends[m,2], next[n], solution[list], l_heap[heap] for each ( node , n ) next[node]<-node l_heap <-HeapSet(m, lengths) #_accept <-0 solution <-  while ( (#_accept < n-1) and !(HeapEmpty(l_heap)) edge <- HeapPop(*l_heap) c1=FindComponent(ends[edge,1], *next) c2=FindComponent(ends[edge,2], *next) KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -37- if (c1 !=c2 ) next[c2] <- c1 solution <- Append ( edge , solution ) #_accept=#_accept+1 return( solution ) HeapSet tạo ra một khối (heap) dựa vào các giá trị cho trƣớc và trả về chính khối (heap) đó. HeapPop trả về chỉ số của giá trị ở đỉnh của khối (heap) chứ không phải bản thân giá trị đó. Điều này có lợi hơn việc trả về một giá trị vì từ chỉ số luôn biết đƣợc giá trị có chỉ số đó chứ từ giá trị không thể biết đƣợc chỉ số của giá trị đó. Cũng cần chú ý rằng HeapPop làm khối (heap) thay đổi. HeapEmpty trả về giá trị TRUE nếu khối (heap) rỗng. Mảng ends chứa các điểm cuối của các cạnh. b. Thuật toán Prim Thuật toán này có những ƣu điểm riêng biệt, đặc biệt là khi mạng dày đặc, trong việc xem xét một bài toán tìm kiếm các cây bắc cầu tối thiểu (MST). Hơn nữa các thuật toán phức tạp hơn đƣợc xây dựng dựa vào các thuật toán MST này; và một số các thuật toán này hoạt động tốt hơn với các cấu trúc dữ liệu đƣợc sử dụng cho thuật toán sau đây, thuật toán này đƣợc phát biểu bởi Prim. Tóm lại, các thuật toán này phù hợp với các quá trình thực hiện song song bởi vì các quá trình đó đƣợc thực hiện bằng các toán tử vector. Thuật toán Prim có thể đƣợc miêu tả nhƣ sau: Bắt đầu với một nút thuộc cây còn tất cả các nút khác không thuộc cây (ở ngoài cây). Trong khi còn có các nút không thuộc cây Tìm nút không thuộc cây gần nhất so với cây Đƣa nút đó vào cây và ghi lại cạnh nối nút đó với cây Thuật toán Prim dựa trên những định lý sau đây: Định lý 2.4. Một cây là một MST nếu và chỉ nếu cây đó chứa cạnh ngắn nhất trong mọi cutset chia các nút thành hai thành phần. Để thực hiện thuật toán Prim, cần phải theo dõi khoảng cách từ mỗi nút không thuộc cây tới cây và cập nhật khoảng cách đó mỗi khi có một nút đƣợc thêm vào cây. Việc đó đƣợc thực hiện dễ dàng; đơn giản chỉ là duy trì một dãy d_tree có các thông tin về khoảng cách đã nói ở trên. Quá trình đó tuân theo: KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -38- array[n] <- Prim( n , root , dist ) dcl dist[n,n] , pred[n], d_tree[n], in_tree[n] index <- FindMin() d_min <- INFINITY for each( i , n ) if(!(in_tree[j]) and (d_tree[i]< d_min)) i_min <- i d_min <- d_tree[i] return ( i_min ) void <-Scan(i) for each ( j , n ) if(!(in_tree[j]) and (d_tree[j]>dist{i,j])) d_tree[j]<- dist[i,j] pred[j]<-i d_tree <- INFINITY pred <- -1 in_tree <- FALSE d_tree(root)<-0 #_in_tree <-0 while (#_in_tree < n) i <- FindMin() in_tree[i]<- TRUE Scan(i) #_in_tree =#_in_tree + 1 return (pred) FindMin trả về một nút không thuộc cây và gần cây nhất. Scan cập nhật khoảng cách tới cây đối với các nút không thuộc cây. Có thể thấy rằng độ phức tạp của thuật toán này là O(n2); cả hai hàm FindMin và Scan có độ phức tạp là O(n) và mỗi hàm đƣợc thực hiện n lần. So sánh với thuật toán Kruskal ta thấy rằng độ phức tạp của thuật toán Prim tăng nhanh hơn so với độ phức tạp của thuật toán Kruskal nếu KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -39- m, số lƣợng các cạnh, bằng O(n2),còn nếu m có cùng bậc với n thì độ phức tạp của thuật toán Kruskal tăng nhanh hơn. Có thể tăng tốc thuật toán Prim trong trƣờng hợp graph là một graph mỏng bằng cách chỉ quan tâm đến các nút láng giềng của nút i vừa đƣợc thêm vào cây. Nếu sẵn có các thông tin kề liền, vòng lặp for trong Scan có thể trở thành. for each (j , n_adj_list[i] ) Độ phức tạp của Scan trở thành O(d) với d là bậc của nút i. Chính vì thế độ phức tạp tổng cộng của Scan giảm từ O(n2) xuống O(m). Thiết lập một tập kề liền cho toàn bộ một graph là một phép toán có độ phức tạp bằng O(m): index[nn,list] <- SetAdj(n ,m, ends) dcl ends[m,2], n_adj_list[n,list] for node = 1 to n n_adj_list[node] <-  for edge = 1 to m Append(edge, n_adj_list[end[edge,1]]) Append(edge, n_adj_list[end[edge,2]]) Có thể tăng tốc FindMin nếu ta thiết lập một khối (heap) chứa các giá trị trong d_tree. Vì thế, chúng ta có thể lấy ra giá trị thấp nhất và độ phức tạp tổng cộng của quá trình lấy ra là O(nlogn). Vấn đề ở chỗ là chúng ta phải điều chỉnh khối (heap) khi một giá trị trong d_tree thay đổi. Quá trình điều chỉnh đó có độ phức tạp là O(mlogn) trong trƣờng hợp xấu nhất vì có khả năng mỗi cạnh sẽ có một lần cập nhật và mỗi lần cập nhật đòi hỏi một phép toán có độ phức tạp là O(logn). Do đó, độ phức tap của toàn bộ thuật toán Prim là O(mlogn). Qua thí nghiệm có thể thấy rằng hai thuật toán Prim và Kruskal có tốc độ nhƣ nhau, nhƣng nói chung, thuật toán Prim thích hợp hơn với các mạng dày còn thuật toán Kruskal thích hợp hơn đối với các mạng mỏng. Tuy vậy, những thuật toán này chỉ là một phần của các thủ tục lớn và phức tạp hơn, đó là những thủ tục hoạt động hiệu quả với một trong những thuật toán này. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -40- Hình 2.5. Graph có liên kết song song và self loop Bảng 2.1 Nút init. A C E B D A 0 0(-) 0(-) 0(-) 0(-) 0(-) B 100 10(A) 10(A) 10(A) 10(A) 10(A) C 100 2(A) 2(A) 2(A) 2(A) 2(A) D 100 100(-) 11(A) 11(A) 5(B) 5(B) E 100 7(A) 6(C) 6(C) 6(C) 6(C) Ví dụ 2.4: Trở lại hình 4.4, giả sử rằng các cạnh không đƣợc biểu diễn có độ dài bằng 100. Thuật toán Kruskal sẽ chọn (A, C), (B, D), (C, E), và loại (A, E) bởi vì nó tạo ra một chu trình với các cạnh đã đƣợc chọn là (A, C) và (C, E), chọn (A, B) sau đó dừng lại vì một cây bắc cầu hoàn toàn đã đƣợc tìm thấy. Thuật toán Prim bắt đầu từ nút A, nút A sẽ đƣợc thêm vào cây. Tiếp theo là các nút C, E, B và D. Bảng 4.1 tổng kết các quá trình thực hiện của thuật toán Prim, biểu diễn d_tree và pred khi thuật toán thực hiện. Cuối thuật toán, pred[B] là A, tƣơng ứng với (A, B) là một phần của cây. Tƣơng tự, pred chỉ ra (A, C), (B, D) và (C, E) là các phần của cây. Vì vậy, thuật toán Prim sẽ lựa chọn đƣợc cây giống với cây mà thuật toán Kruskal nhƣng thứ tự các liên kết đƣợc lựa chọn là khác nhau. Một đường đi trong một mạng là một chuỗi liên tiếp các liên kết bắt đầu từ một nút s nào đó và kết thúc tại một nút t nào đó. Những đƣờng đi nhƣ vậy đƣợc gọi là một đường đi s, t. Chú ý rằng thứ tự các liên kết trong đƣờng đi là có ý nghĩa. Một đƣờng đi có thể là hữu hƣớng hoặc vô hƣớng tuỳ thuộc vào việc các thành phần của nó là các liên kết hay là các cung. Ngƣời ta gọi một đƣờng đi là đƣờng đi đơn giản nếu không có nút nào xuất hiện quá hai lần trong đƣờng đi đó. Chú ý rằng một đƣờng đi đơn giản trong một graph đơn giản có thể đƣợc biểu diễn bằng chuỗi liên tiếp các nút mà đƣờng đi đó chứa vì chuỗi các nút đó biểu diễn duy nhất một chuỗi các liên kết . KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -41- Nếu s trùng với t thì đƣờng đi đó gọi là một chu trình, và nếu một nút trung gian xuất hiện không quá một lần thì chu trình đó đƣợc gọi là chu trình đơn giản. Một chu trình đơn giản trong một graph đơn giản có thể đƣợc biểu diễn bởi một chuỗi các nút liên tiếp. Ví dụ 2.5: Xét graph hữu hƣớng trong hình 4.4. Các thành phần liên thông bền đƣợc xác dịnh bởi {A B C D} {E F G} {H} {I} {J} Các cung (A, H), (D, I), (I, J) và (J, G) không là một phần một thành phần liên thông bền nào cả. Xem graph trong hình 4.3 là một graph vô hƣớng (nghĩa là xem các cung là các liên kết vô hƣớng), thì graph này có một thành phần duy nhất, vì thế nó là một graph liên thông. Cho một graph G = (V, E), H là một graph con nếu H = (V', E'), trong đó V' là tập con của V and E' là tập hợp con của E. Các tập con này có thể có hoặc không tuân theo quy định đã nêu. Hình 2.6. Graph hữu hướng Một graph không hề chứa các chu trình gọi là một cây. Một cây bắc cầu là một graph liên thông không có các chu trình. Những graph nhƣ vậy đƣợc gọi một cách đơn giản là cây. Khi graph không liên thông hoàn toàn đƣợc gọi là một rừng. Chúng ta thƣờng đề cập các cây trong các graph vô hƣớng. Trong các graph hữu hƣớng, có một cấu trúc tƣơng tự với cây gọi là cây phân nhánh. Một cây phân nhánh là một graph hữu hƣớng có các đƣờng đi từ một nút (gọi là nút gốc của cây phân nhánh) tới tất cả các nút khác hoặc nói một cách khác là graph hữu hƣớng có các đƣờng đi từ tất cả các nút khác đến nút gốc. Một cây phân nhánh sẽ trở thành một cây nếu nó là vô hƣớng. Các cây bắc cầu có rất nhiều thuộc tính đáng quan tâm, những thuộc tính đó khiến cho các cây bắc cầu rất hữu ích trong quá trình thiết kế mạng truyền thông. Thứ nhất, các cây bắc cầu là liên thông tối thiểu có nghĩa là: chúng là các graph liên thông nhƣng không tồn tại một tập con KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -42- các cạnh nào trong cây tạo ra một graph liên thông. Chính vì vậy, nếu mục đích chỉ đơn giản là thiết kế một mạng liên thông có giá tối thiểu thì giải pháp tối ƣu nhất là chọn một cây. Điều này có thể hiểu đƣợc vì trong một cây luôn có một và chỉ một đƣờng đi giữa một cặp nút. Điều đó không gây khó khăn đáng kể trong việc định tuyến trong cây và làm đơn giản các thiết bị truyền thông liên quan đi rất nhiều. Chú ý rằng một graph có N nút thì bất kỳ một cây nào bắc cầu tất cả các nút thì có đúng (N-1) cạnh. Bất kỳ một rừng nào có k thành phần thì chứa đúng (N-k) cạnh. Nhận xét này có thể suy ra từ lập luận sau: khi có một graph có N nút và không có cạnh nào thì có N thành phần, và cứ mỗi cạnh thêm vào nhằm kết nối hai thành phần thì số lƣợng thành phần giảm đi một. Một tập hợp các cạnh mà sự biến mất của nó chia cắt một graph (hay nói một cách khác là làm tăng số lƣợng thành phần của graph) đƣợc gọi là một tập chia cắt. Một tập chia cắt nào đó chia cắt các nút thành hai tập X và Y đƣợc gọi là một cutset hoặc một XY-cutset. Hầu hết các vấn đề cần quan tâm đều liên quan đến các cutset tối thiểu (nghiă là các cutset không phải là tập con của một cutset khác). Trong một cây, một cạnh bất kỳ là một cutset tối thiểu. Một tập tối thiểu các nút mà sự biến mất của nó phân chia các nút còn lại thành hai tập gọi là một cut. Các vấn đề cần quan tâm cũng thƣờng liên quan đến các cut tối thiểu. Ví dụ 2.6: Hình 2.6 biểu diễn một graph vô hƣớng. Các tập các liên kết {(A, C), (B, D)} và {(C, E), (D, E), (E, F)} là các ví dụ của các cutset tối thiểu. Tập cuối cùng là một ví dụ về một loại tập trong đó tập các liên kết đi tới một nút thành viên bất kỳ đều là một cutset và các cutset đó chia cắt nút đó ra khỏi các nút khác. Tập (C, D) là một cut. Nút A cũng là một cut. Một nút duy nhất mà sự biến mất của nó chia cắt graph gọi là một điểm khớp nối. Tập hợp các liên kết: {(A, B), (A, C), (A, G), (C, D), (C, E), (E, F)} là một cây. Bất kỳ tập con nào của tập này, kể cả tập đầy hay tập rỗng, đều là một rừng. KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -43- Hình 2.7. Các cutset, các cut, các cây b. Các mô hình định tuyến thông dụng Định tuyến ngắn nhất (Shortest path Routing) Bài toán tìm các đƣờng đi ngắn nhất là một bài toán khá quan trọng trong quá trình thiết kế và phân tích mạng. Hầu hết các bài toán định tuyến có thể giải quyết nhƣ giải quyết bài toán tìm đƣờng đi ngắn nhất khi một "độ dài " thích hợp đƣợc gắn vào mỗi cạnh (hoặc cung) trong mạng. Trong khi các thuật toán thiết kế thì cố gắng tìm kiếm cách tạo ra các mạng thoả mãn tiêu chuẩn độ dài đƣờng đi. Bài toán đơn giản nhất của loại toán này là tìm đƣờng đi ngắn nhất giữa hai nút cho trƣớc. Loại bài toán này có thể là bài toán tìm đƣờng đi ngắn nhất từ một nút tới tất cả các nút còn lại, tƣơng đƣơng bài toán tìm đƣờng đi ngắn nhất từ tất cả các điểm đến một điểm. Đôi khi đòi hỏi phải tìm đƣờng đi ngắn nhất giữa tất cả các cặp nút. Các đƣờng đi đôi khi có những giới hạn nhất định (chẳng hạn nhƣ giới hạn số lƣợng các cạnh trong đƣờng đi). Tiếp theo, chúng ta xét các graph hữu hƣớng và giả sử rằng đã biết độ dài của một cung giữa mỗi cặp nút i và j là lij. Các độ dài này không cần phải đối xứng. Khi một cung không tồn tại thì độ dài lij đƣợc giả sử là rất lớn (chẳng hạn lớn gấp n lần độ dài cung lớn nhất trong mạng). Chú ý rằng có thể áp dụng quá trình này cho các mạng vô hƣớng bằng cách thay mỗi cạnh bằng hai cung có cùng độ dài. Ban đầu giả sử rằng lij là dƣơng hoàn toàn; sau đó giả thiết này có thể đƣợc thay đổi. 1. Thuật toán Dijkstra Tất cả các thuật toán tìm đƣờng đi ngắn nhất đều dựa vào các nhận xét đƣợc minh hoạ trên hình 4.5, đó là việc lồng nhau giữa các đƣờng đi ngắn nhất nghĩa là một nút k thuộc một đƣờng đi ngắn nhất từ i tới j thì đƣờng đi ngắn nhất từ i tới j sẽ bằng đƣờng đi ngắn nhất từ i KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -44- tới k kết hợp với đƣờng đi ngắn nhất từ j tới k. Vì thế, chúng ta có thể tìm đƣờng đi ngắn nhất bằng công thức đệ quy sau: )(min kjik k ij ddd  dxy là độ dài của đƣờng đi ngắn nhất từ x tới y. Khó khăn của cách tiếp cận này là phải có một cách khởi động đệ quy nào đó vì chúng ta không thể khởi động với các giá trị bất kỳ ở vế phải của phƣơng trình 4.2. Có một số cách để thực hiện việc này, mỗi cách là cơ sở cho một thuật toán khác nhau. Hình 2.8. Các đường ngắn nhất lồng nhau Thuật toán Dijkstra phù hợp cho việc tìm đƣờng đi ngắn nhất từ một nút i tới tất cả các nút khác. Bắt đầu bằng cách thiết lập dii = 0 và dij =   i  j sau đó thiết lập dij  lij  j là nút kề cận của i Sau đó tìm nút j có dij là bé nhất. Tiếp đó lấy chính nút j vừa chọn để khai triển các khoảng cách các nút khác, nghĩa là bằng cách thiết lập dikmin (dik, dij+ljk) Tại mỗi giai đoạn của quá trình, giá trị của dik là giá trị ƣớc lƣợng hiện có của đƣờng đi ngắn nhất từ i tới k; và thực ra là độ dài đƣờng đi ngắn nhất đã đƣợc tìm cho tới thời điểm đó. Xem djk nhƣ là nhãn trên nút k. Quá trình sử dụng một nút để triển khai các nhãn cho các nút khác gọi là quá trình quét nút. Thực hiện tƣơng tự, tiếp tục tìm các nút chƣa đƣợc quét có nhãn bé nhất và quét nó. Chú ý rằng, vì giả thiết rằng tất cả các ljk đều dƣơng do đó một nút không thể gán cho nút khác một nhãn bé hơn chính nhãn của nút đó. Vì vậy, khi một nút đƣợc quét thì việc quét lại nó nhất thiết không bao giờ xảy ra. Vì thế, mỗi nút chỉ cần đƣợc quét một lần. Nếu nhãn trên một nút thay đổi, nút đó phải đƣợc quét lại. Thuật toán Dijkstra có thể đƣợc viết nhƣ sau: array[n] <-Dijkstra (n, root, dist) dcl dist[n,n], pred[n], sp_dist[n], scanned[n] index <- FindMin( ) d_min <- INFINITY KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -45- for each (i , n ) if (!(scanned[j])&& (sp_dist[i]< d_min) ) i_min <- i d_min <- sp_dist[i] return (i_min) void <- Scan( i ) for each ( j , n) if((sp_dist[j] > sp_dist[i] + dist[i,j])) sp_dist[j]<- sp_dist[i] + dist[i,j] pred[j]<- i sp_dist<- INFINITY pred <- -1 scanned <-FALSE sp_dist[root]<- 0 #_scanned <- 0 while (#_scanned < n ) i <- FindMin() Scan( i ) #_scanned= #_scanned + 1 return ( pred ) Trong thuật toán đã viết ở trên, hàm chỉ trả về dãy pred , dãy này chứa tất cả các đƣờng đi. Hàm cũng có thể trả về dãy sp_dist, dãy này chứa độ dài của các đƣờng đi, hoặc hàm trả về cả hai dãy nếu cần thiết. Thuật toán trông rất quen thuộc. Nó gần giống với thuật toán tìm cây bắc cầu tối thiểu Prim. Chỉ khác nhau ở chỗ, các nút trong thuật toán này đƣợc gắn nhãn là độ dài của toàn bộ đƣờng đi chứ không phải là độ dài của một cạnh. Chú ý rằng thuật toán này thực hiện với graph hữu hƣớng trong khi thuật toán Prim chỉ thực hiện với graph vô hƣớng. Tuy nhiên về mặt cấu trúc, các thuật toán là rất đơn giản. Độ phức tạp của thuật toán Dijkstra, cũng giống nhƣ độ phức tạp của thuật toán Prim , là O(N2). Cũng giống nhƣ thuật toán Prim, thuật toán Dijkstra thích hợp với các mạng dày và đặc biệt thích hợp với các quá trình thực hiện song song (ở đây phép toán scan có thể đƣợc thực hiện KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -46- song song, về bản chất độ phức tạp của quá trình đó là O(1) chứ không phải là O(N)). Hạn chế chủ yếu của thuật toán này là không có đƣợc nhiều ƣu điểm khi mạng là mỏng và chỉ phù hợp với các mạng có độ dài các cạnh là dƣơng. Hình 2.9. Các đường đi ngắn nhất từ A Ví dụ 2.7: Xét một mạng trong hình 4.6. Mục tiêu ở đây là tìm các đƣờng đi ngắn nhất từ nút A tới các nút khác. Khởi đầu, A đƣợc gắn nhãn 0 và các nút khác đƣợc gắn nhãn là vô cùng lớn. Quét nút A, B đƣợc gán bằng 5 và C đƣợc gán là 1. C là nút mang nhãn bé nhất nên sau đó C đƣợc quét và B đƣợc gán bằng 4 (=1+3), trong khi D đƣợc gán bằng 6. Tiếp theo B (có nhãn bằng 4) đƣợc quét; D và E đƣợc gán lần lƣợt là 5 và 10. Sau đó D (có nhãn bằng 5) đƣợc quét và F đƣợc gán bằng 9. E đƣợc quét và dẫn đến không có nhãn mới. F là nút có nhãn bé nhất nên không cần phải quét vì không có nút nào phải đánh nhãn lại. Mỗi nút chỉ đƣợc quét một lần. Chú ý rằng việc quét các nút có các nhãn theo thứ tự tăng dần là một điều cần lƣu ý vì trong quá trình thực hiện thuật toán một số nút đƣợc đánh lại số. Các nút đƣợc quét ngay tức thì hoặc là phải đƣợc quét lại sau đó. Chú ý rằng các đƣờng đi từ A đến các nút khác (nghĩa là (A, C), (C, B), (B, D), (B, E) và (D, F)) tạo ra một cây. Điều này không là một sự trùng hợp ngẫu nhiên. Nó là hệ quả trực tiếp từ việc lồng nhau của các đƣờng đi ngắn nhất. Chẳng hạn, nếu k thuộc đƣờng đi ngắn nhất từ i tới j thì đƣờng đi ngắn nhất từ i tới j sẽ là tổng của đƣờng đi ngắn nhất từ i tới k và đƣờng đi ngắn nhất từ k tới j. Tƣơng tự nhƣ trong ví dụ minh hoạ cho thuật toán Prim, kết quả của ví dụ trên có thể đƣợc trình bày một cách ngắn gọn nhƣ bảng sau: KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -47- Bảng 2.2 Nút init. A(0) C(1) B(4) D(5) F(9) E(10) A 0(-) 0(-) 0(-) 0(-) 0(-) 0(-) 0(-) B  (-) 5(A) 4(C) 4(C) 4(C) 4(C) 4(C) C  (-) 1(A) 1(A) 1(A) 1(A) 1(A) 1(A) D  (-)  (-) 6(C) 5(B) 5(B) 5(B) 5(B) E  (-)  (-)  (-) 10(B) 10(B) 10(B) 10(B) F  (-)  (-)  (-)  (-) 9(D) 9(D) 9(D) 2. Thuật toán Bellman Một thuật toán khác của dạng thuật toán Dijkstra do Bellman phát biểu và sau đó đƣợc Moore và Page phát triển, đó là việc quét các nút theo thứ tự mà chúng đƣợc đánh nhãn. Việc đó loại trừ việc phải tìm nhãn nhỏ nhất, nhƣng tạo ra khả năng; một nút có thể cần quét nhiều hơn một lần. Trong dạng đơn giản nhất, thuật toán Bellman duy trì một hàng đợi các nút để quét. Khi một nút đƣợc đánh nhãn nó đƣợc thêm vào hàng đợi trừ khi nó đã tồn tại trong hàng đợi. Hàng đợi đƣợc quản lý theo quy tắc vào trƣớc, ra trƣớc. Vì thế các nút đƣợc quét theo thứ tự mà chúng đƣợc đánh nhãn. Nếu một nút đƣợc đánh nhãn lại sau khi nút đó đƣợc quét thì nó đƣợc thêm vào sau hàng đợi và đƣợc quét lần nữa. Ví dụ 2.8: Trong ví dụ ở hình 2.9, chúng ta bắt đầu quá trình bằng các đặt nút A vào hàng đợi. Quét A các nhãn 5 và 1 lần lƣợt đƣợc gán cho nút B và C, đồng thời các nút B và C đƣợc đƣa vào hàng đợi (vì các nút này nhận giá trị mới và chƣa có mặt trong hàng đợi). Tiếp đó chúng ta quét nút B và các nút E và D đƣợc đánh nhãn lần lƣợt là 11 và 6. D và E cũng đƣợc đặt vào hàng đợi. Sau đó chúng ta quét C, khi đó B đƣợc gán nhãn là 4 và lại đƣợc đặt vào sau hàng đợi. E đƣợc quét và F đƣợc gán nhãn 13 và đƣa vào hàng đợi. D đƣợc quét và F đƣợc gán nhãn là 10; F vẫn còn ở trong hàng đợi nên F không đƣợc đƣa vào hàng đợi. B đƣợc quét lần thứ hai. trong lần quét này E và D lần lƣợt đƣợc đánh nhãn là 10 và 5 đồng thời cả hai nút đƣợc đặt vào hàng đợi. F đƣợc quét và không đánh nhãn nút nào cả. E đƣợc quét không đánh nhãn nút nào cả. D đƣợc quét và F đƣợc đánh nhãn 9 và đƣợc đƣa vào hàng đợi. F đƣợc quét và không đánh dấu nút nào cả. Các nút B, C, D và F đƣợc quét hai lần. Đó là cái giá phải trả cho việc không quét các nút theo thứ tự. Mặt khác trong thuật toán này không cần thiết phải tìm kiếm các nút có nhãn nhỏ nhất. Cũng nhƣ trong hai ví dụ 4.4 và 4.5 cho thuật toán Prim và thuật toán Dijkstra, chúng ta có thể trình bày kết quả của các quá trình trong ví dụ này nhƣ trong bảng sau KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -48- Bảng 2.3 Nút init. A(0) B(5) C(1) E(11) D(6) A 0(-) A 0(-) B 0(-) C 0(-) E 0(-) D 0(-) B B  (-) 5(A) C 5(A) E 4(C) D 4(C) B 4(C) F C  (-) 1(A) 1(A) D 1(A) B 1(A) F 1(A) D  (-)  (-) 6(B) 6(B) 6(B) 6(B) E  (-)  (-) 11(B) 11(B) 11(B) 11(B) F  (-)  (-)  (-)  (-) 13(E) 10(D) B(4) F(10) E(10) D(5) F(9) A 0(-) F 0(-) E 0(-) D 0(-) F 0(-) B 4(C) E 4(C) D 4(C) 4(C) 4(C) C 1(A) D 1(A) 1(A) 1(A) 1(A) D 5(B) 5(B) 5(B) 5(B) 5(B) E 10(B) 10(B) 10(B) 10(B) 10(B) F 10(D) 10(D) 10(D) 9(D) 9(D) Thuật toán có thể viết nhƣ sau: array[n]<-Bellman (n, root, dist) dcl dist[n][n], pred[n], sp_dist[n], in_queue[n] scan_queue[queue] void <- Scan( i ) in_queue[i]<- FALSE for j=1 to n if((sp_dist[j] > sp_diat[i] + dist[i,j])) sp_dist[j]<- sp_diat[i] + dist[i,j] pred[j]<- i if ( not ( in_queue[j] ) ) Push(scan_queue, j ) in_queue[j]<- TRUE sp_dist<- INFINITY pred <- -1 in_queue <-FALSE initialize_queue( scan_queue ) sp_dist[root]<- 0 KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -49- Push(scan_queue , root ) in_queue <-TRUE while (not(Empty( scan_queue )) i <- Pop(scan_queue) Scan( i ) return ( pred ) Một hàng đợi chuẩn đƣợc sử dụng quá trình trên. Có thể sử dụng dãy in_queue để theo dõi nút nào đang hiện có trong hàng đợi. Theo quá trình đƣợc viết ở trên thì thuật toán Bellman là một quá trình tìm kiếm theo chiều rộng. Ngƣời ta đã chứng minh đƣợc rằng trong trƣờng hợp xấu nhất, một nút đƣợc quét n-1 lần. Vì vậy quá trình quét trong trƣờng hợp xấu nhất có độ phức tạp là O(n) với n là số lƣợng các nút. Từ đó suy ra rằng độ phức tạp của toàn bộ thuật toán là O(n3). Tuy nhiên trong thực tế các nút không thƣờng xuyên đƣợc quét lại nhiều lần. Trong hầu hết các trƣờng hợp thực tế, số lần quét trung bình trên một nút là rất nhỏ, tối đa là 3 hoặc 4, ngay cả khi mạng có hàng ngàn nút. Nếu bậc trung bình của nút nhỏ, điều này thƣờng xảy ra trong các mạng thực tế, thì thời gian cho việc tìm kiếm nút chƣa quét bé nhất là phần có ảnh hƣởng nhất của thuật toán Dijkstra. Vì vậy trong thực tế thuật toán Bellman đƣợc xem là nhanh hơn so với thuật toán Dijkstra mặc dù độ phức tạp trong trƣờng hợp xấu nhất của thuật toán Bellman lớn hơn. Tƣơng tự có thể cải tiến độ phức tạp của thủ tục Scan bằng cách duy trì một danh sách kề cận cho mỗi nút. Độ phức tạp của Scan trở thành O(d) thay vì O(n) với d là bậc của nút đang quét. Vì vậy, trên thực tế độ phức tạp của thuật toán Bellman thƣờng bằng O(E) với E là số cạnh của graph. Ngoài việc có thể cải thiện chất lƣợng trung bình của thuật toán trong nhiều trƣờng hợp, thuật toán Bellman còn có một ƣu điểm nữa đó là thuật toán hoạt động ngay cả khi độ dài các cạnh là các giá trị âm. Thuật toán Dijkstra dựa vào quy tắc: một nút không thể gán cho nút khác một nhãn bé hơn nhãn của chính nút. Điều đó chỉ đúng khi không có các cung có độ dài là âm trong khi thuật toán Bellman không cần phải giả thiết nhƣ vậy và quét lại các nút mỗi khi nút đó đƣợc gán nhãn lại. Vì thế, thuật toán này rất phù hợp khi xuất hiện các cung có độ dài âm. Tuy nhiên cần chú ý rằng khi graph có một chu trình có tổng độ dài âm thì thậm chí thuật toán Bellman cũng không khả dụng. Trong trƣờng hợp này, thuật toán không kết thúc và các nút tiếp tục đánh nhãn các nút khác một cách vô hạn. Có một số dạng khác nhau của thuật toán KHOA ĐIỆN-ĐIỆN TỬ ĐHSP KT HƯNG YÊN TS. NGUYỄN VĂN VINH MẠNG THÔNG TIN -50- Bellman, ngoài thuật toán này ra còn có một số các thuật toán tìm đƣờng đi ngắn nhất từ một điểm tới các điểm khác trong trƣờng hợp khác nhau. 3. Thuật toán Floyd Có thể thấy rằng bài toán tìm kiếm đƣờng ngắn nhất giữa mọi cặp nút nặng nề gấp N lần bài toán tìm đƣờng đi ngắn nhất từ một nút đến tất cả các nút khác. Một khả năng có thể đó là sử dụng thuật toán Bellman hoặc thuật toán Dijkstra N lần, bắt đầu từ mỗi nút nguồn. Một khả năng khác, đặc biệt thích hợp với các mạng dày, là sử dụng thuật toán Floyd. Thuật toán Floyd dựa vào quan hệ đệ quy đã đƣợc trình bày trong phần giới thiệu thuật toán Dijkstra, nhƣng thuật toán này sử dụng quan hệ đệ quy đó theo một cách khác. Lúc này, dij(k) đƣợc định nghĩa là đƣờng đi ngắn nhất từ i tới j sử dụng các nút đƣợc đánh số là k hoặc thấp hơn nhƣ là các nút trung gian. Vì thế dij(0) đƣợc định nghiã nhƣ là lij, độ dài của liên kết từ nút i tới nút j, nếu liên kết đó tồn tại hoặc dij(0) sẽ bằng vô cùng nếu liên kết đó không tồn tại. Vì vậy, dij(k) = min (dij(k-1), dik(k-1) + dkj(k-1) ) nghĩa là, chúng ta chỉ quan tâm đến việc sử dụng nút k nhƣ là một điểm quá giang cho mỗi đƣờng đi từ i tới j. Thuật toán có thể đƣợc viết nhƣ sau: array[n] <-Floyd (n, dist) dcl dist[n][n], pred[n][n], sp_dist[n,n] for each (i , n ) for each (i , n ) sp_dist[i,j] <- dist[i, j] pred[i, j]<- i for each (k , n ) for each (i , n ) for each (j , n ) if((sp_dist[i,j]> sp_dist[i,k] + dist[k,j])) sp_dist[i,j]<- sp_dist[i,k] + dist[k,j] pred[i, j]<- pred[k,j] return ( pred ) pred[i,j] chứa nút

Các file đính kèm theo tài liệu này:

  • pdf05200067_0882_1984592.pdf