Trong khuôn khổ bài thu hoạch này, em sử dụng Maple giải một số bài toán đặc trưng của lý thuyết đồ thị của Toán rời rạc.. Chúng ta có thể xác định hai máy tính trong mạng có thể trao đổ
Trang 1CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT
BÁO CÁO CHUYÊN ĐỀ : LẬP TRÌNH SYMBOLIC
SỬ DỤNG MAPLE GIẢI MỘT SỐ BÀI
TOÁN VỀ LÝ THUYẾT ĐỒ THỊ
Konigsberg’s Problem
Trang 2HV : VŨ MINH THÀNH
MS : CH1101134 Lớp : Cao học khóa 6 Email :
thanhauco@gmail.com
GVHD : GS-TS ĐỖ VĂN NHƠN
2
Trang 3Lời Mở Đầu
Ngày nay, ngành công nghệ thông tin trên thế giới đang trên đà phát triển mạnh mẽ, và ngày càng ứng dụng vào nhiều lĩnh vực: kinh tế, khoa học kĩ thuật, quân sự, y tế, giáo dục… và nó đã đáp ứng ngày càng nhiều yêu cầu của các lĩnh vực này, để phục vụ cho nhu cầu của con người Ở nước ta, hòa nhập chung với sự phát triển ngành công nghệ thông tin và ứng dụng vào các lĩnh vực của cuộc sống nhằm phục vụ các nhu cầu như: nghiên cứu, học tập, lao động và giải trí… của con người Nhà nước ta đã có những chính sách cần thiết để đưa ngành công nghệ thông tin vào vị trí then chốt trong chiến lược phát triển kinh tế của Đất nước
Ứng dụng CNTT đóng vai trò quan trọng trong giáo dục, môn học Lập trình Symbolic nói chung và Maple nói riêng là một môn học khá hay và thú vị Qua môn học sinh động này do thầy Nhơn phụ trách, ta có thể thấy rõ Maple là một thư viện và công cụ toán học đa năng và mạnh mẽ, giúp cho các sinh viên, học sinh, và thầy cô giáo có thể dễ dàng giải các bài toán và lập trình dễ dàng
Trong khuôn khổ bài thu hoạch này, em sử dụng Maple giải một số bài toán đặc trưng của lý thuyết đồ thị của Toán rời rạc
Qua đây, em cũng xin gởi lời cám ơn chân thành đến GS-TS Đỗ Văn Nhơn, người đã
tận tâm truyền đạt những kiến thức lập trình Maple một cách trực quan sinh động môn học “Lập trình Symbolic với Maple” Phải nói là môn học do thầy phụ trách rất lôi cuốn
và sinh động
Xin chân thành cám ơn !
Vũ Minh Thành – 01/2013
Trang 4NỘI DUNG
4
Trang 51 PHẦN 1 : GIỚI THIỆU VỀ MAPLE – CÔNG CỤ LT SYMBOLIC
Maple là một hệ thống tính toán trên các biểu thức đại số và minh hoạ toán học
mạnh mẽ của công ty Warterloo Maple Inc (http : / /ww w m a p l e s o f t c om ) Maple ra đời năm 1991 đến nay đã phát triển đến phiên bản 15 Maple có cách cài đặt đơn giản, chạy được trên nhiều hệ điều hành, có cấu trúc linh hoạt để sử dụng tối ưu cấu hình máy và có trình trợ giúp (help) rất dễ sử dụng Từ phiên bản 7, Maple cung cấp ngày càng nhiều các công cụ trực quan, các gói lệnh tự học gắn liền với toán học phổ thông
và đại học Ưu điểm đó làm cho nhiều người trên thế giới lựa chọn sử dụng Maple cùng các phần mềm toán học khác áp dụng trong dạy học toán và các công việc tính toán đòi hỏi của thực tiễn và sự phát triển của giáo dục
C ó t h ể nhận thấy rằng ngoài các tính năng tính toán và minh hoạ rất mạnh
mẽ bằng các câu lệnh riêng biệt (thường chỉ cho ta kết quả cuối cùng), Maple còn là một ngôn ngữ lập trình hướng thủ tục (procedure) Thủ tục là một dãy các lệnh của Maple theo thứ tự mà người lập trình định sẵn để xử lí một công việc nào đó, khi thực hiện thủ tục này Maple sẽ tự động thực hiện các lệnh có trong thủ tục đó một cách tuần
tự và sau đó trả lại kết quả cuối cùng
Mapple có các chức năng cơ bản sau:
• Là một hệ thống tính toán trên các biểu thức đại số
• Có thể thực hiện được hầu hết các phép toán cơ bản trong chương trình toán đại học và sau đại học
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị động
và tĩnh của các đường và mặt được cho bởi các hàm tùy ý và trong các
hệ tọa độ khác nhau
• Là một ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác với các ngôn ngữ lập trình khác
• Cho phép trích xuất ra các định dạng khác nhau như word, HTML…
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học tương tác trực tiếp
• Một trợ giáo hữu ích cho học sinh sinh viên trong việc tự học
Trang 62 PHẦN 2 : SỬ DỤNG MAPLE GIẢI MỘT SỐ BÀI TOÁN LÝ THUYẾT
ĐỒ THỊ
1.1 GIỚI THIỆU VỀ LÝ THUYẾT ĐỒ THỊ
Lý thuyết đồ thị là một lĩnh vực đã có từ lâu và có nhiều ứng dụng hiện đại Những tư tưởng
cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sỹ Lenhard Eurler Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái cầu ở thành phố Konigsberg
Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh vực khác nhau Chẳng hạn, đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề giải tích mạch điện Chúng ta có thể phân biệt các hợp chất hóa học hữu cơ khác nhau với cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ thị Chúng ta
có thể xác định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay không nhờ mô hình đồ thị của mạng máy tính Đồ thị có trọng số trên các cạnh có thể
sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạng giao thông Chúng ta cũng còn sử dụng đồ thị để giải các bài toán về lập lịch, thời khóa biểu, và phân bố tần số cho các trạm phát thanh và truyền hình…
1.1.1 Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này Chúng ta phân biệt các loại đồ thị khác nhau bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của đồ thị Để có thể hình dung được tại sao lại cần đến các loại đồ thị khác nhau, chúng ta sẽ nêu ví dụ sử dụng chúng để mô tả một mạng máy tính Giả sử ta có một mạng gồm các máy tính và các kênh điện thoại (gọi tắt là kênh thoại) nối các máy tính này Chúng ta có thể biểu diễn các vị trí đặt náy tính bởi các điểm và các kênh thoại nối chúng bởi các đoạn nối, xem hình 1
Hình 1 Sơ đồ mạng máy tính.
6
Trang 7Nhận thấy rằng trong mạng ở hình 1, giữa hai máy bất kỳ chỉ có nhiều nhất là một kênh thoại nối chúng, kênh thoại naỳ cho phép liên lạc cả hai chiều và không có máy tính nào lại được nối với chính nó Sơ đồ mạng máy cho trong hình 1 được gọi là đơn đồ thị vô hướng Ta đi đến định nghĩa sau
• Định nghĩa 1: Đơn đồ thị vô hướng G = (V,E) bao gồm V là tập các đỉnh, và E là tập các
cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông tin người
ta phải nối hai máy nàu bởi nhiều kênh thoại Mạng với đa kênh thoại giữa các máy được cho trong hình 2
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải truyền tải nhiều thông tin người
ta phải nối hai máy nàu bởi nhiều kênh thoại Mạng với đa kênh thoại giữa các máy được cho trong hình 2
Hình 2 Sơ đồ mạng máy tính với đa kênh thoại.
• Định nghĩa 2 : Đa đồ thị vô hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các
cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh Hai cạnh e1 và e2 được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh
Trang 8Hình 3 Sơ đồ mạng máy tính với kênh thoại thông báo.
Rõ ràng mỗi đơn đồ thị đều là đa đồ thị, nhưng không phải đa đồ thị nào cũng là đơn đồ thị, vì trong đa đồ thị có thể có hai (hoặc nhiều hơn) cạnh nối một cặp đỉnh nào đó
Trong mạng máy tính có thể có những kênh thoại nối một náy nào đó với chính nó (chẳng hạn vời mục đính thông báo) Mạng như vậy được cho trong hình 3 Khi đó đa đồ thị không thể mô
tả được mạng như vậy, bởi vì có những khuyên (cạnh nối một đỉnh với chính nó) Trong 3 trường hợp nàychúng ta cần sử dụng đến khái niệm giả đồ thị vô hướng, được định nghĩa như sau:
• Định nghĩa 3 : Giả đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các
cặp không có thứ tự gồm hai phần tử (không nhất thiết phải khác nhau) của V gọi là cạnh Cạnh e được gọi là khuyên nếu nó có dạng e = (u, u)
Hình 4 Mạng máy tính với kênh thoại một chiều
8
Trang 9Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều Chẳng hạn, trong hình 4 máy chủ ở Hà Nội chỉ có thể nhận tin từ các máy ở địa phương, có một số máy chỉ
có thể gửi tin đi, còn các kênh thoại cho phép truyền tin theo cả hai chiều được thay thế bởi hai cạnh có hướng ngược chiều nhau
Ta đi đến định nghĩa sau
• Định nghĩa 4 : Đơn đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập
các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung
Nếu trong mạng có thể có đa kênh thoại một chiều, ta sẽ phải sử dụng đến khái niệm đa đồ thị
có hướng:
• Định nghĩa 5 : Đa đồ thị có hướng G = (V, E) bao gồm V là tập các đỉnh và E là tập các
cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung Hai cung e1, e2 tương ứng với cùng một cặp đỉnh được gọi là cung lặp
Trong Maple cung cấp cho ta gói GraphTheory dùng để xử lý các bài toán về đồ thị,
ta sử dụng câu lệnh with để nạp gói này như sau :
1.2 GIẢI BÀI TOÁN TÌM CHU TRÌNH EULER
1.2.1 Giới thiêu đường đi và chu trình Euler
• Định nghĩa 1 : Chu trình đơn trong đồ thị G đi qua mỗi cạnh của nó một lần được gọi là
chu trình Euler Đường đi đơn trong G đi qua mỗi cạnh của nó một lần được gọi là đường đi Euler Đồ thị được gọi là đồ thị Euler nếu nó có chu trình Euler, và gọi là đồ thị nửa Euler nếu nó có đường đi Euler
Rõ ràng mọi đồ thị Euler luôn là nửa Euler, nhưng điều ngược lại không luôn đúng
Thí dụ 1 Đồ thị G1 trong hình 1 là đồ thị Euler vì nó có chu trình Euler a, e, c, d, e, b, a
Đồ thị G3 không có chu trình Euler nhưng nó có đường đi Euler a, c, d, e, b, d, a, b, vì thế G3 là đồ thị cửa Euler Đồ thị G2 không có chu trình cũng như đường đi Euler
Trang 1010
Trang 11Thí dụ 2 Đồ thị H2 trong hình 2 là đồ thị Euler vì nó có chu trình Euler a, b, c, d, e, a
Đồ thị H3 không có chu trình Euler nhưng nó có đường đi Euler c, a, b, c, d, b vì thế H3
là đồ thị nửa Euler Đồ thị H1 không có chu trình cũng như đường đi Euler
Điều kiện cần và đủ để một đồ thị là một đồ thị Euler được Euler tìm ra vào năm 1736 khi ông giải quyết bài toán hóc búa nổi tiếng thế giới thời đó về bảy cái cầu ở thành phố Konigsberg và đây là định lý đầu tiên của lý thuyết đồ thị
Định lý 1 (Euler) Đồ thị vô hướng liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh
của G đều có bậc chẵn
1.2.2 Giải tìm chu trình Euler bằng Maple
Trang 12Mặc dù Maple đã trang bị sẵn hàm IsEulerian để kiểm tra xem một đồ thị có chu trình Euler hay không, nhưng hàm này chỉ áp dụng cho các đồ thị đơn giản (không vòng hay
đa cạnh) Ta sẽ đi xây dựng hàm kiểm tra chu trình Euler cho đa đồ thị (multigraphs)
Sourcecode trong đường dẫn ở đĩa CD :
\Sourcecode\Euler.mw
Ta đi xây dựng 1 số hàm con phụ trợ
Giả đồ thị (Pseudograph) : là đồ thị vô hướng, có vòng và đa cạnh.
12
Trang 13• Hàm tính bậc của 1 đỉnh cho đồ thị bất kỳ (vô hướng, có vòng và đa cạnh)
Để tính bậc của 1 đỉnh, đầu tiên ta kiểm tra xem đồ thị có trọng số hay không sử dụng lệnh
IsWeighted Nếu không có trọng số, dùng hàm Degree Nếu có trọng số, ta sử dụng lệnh IncidentEdgesđể xác định các cạnh kề với đỉnh cho trước Lệnh add thêm trọng số, sau đó ta chỉ
việc kiểm tra xem có loop hay không, nếu có thì cộng 2 vào bậc của đỉnh Hàm này được sử dụng để tính chu trình Euler bên dưới
Theo định lý Euler ta có, đa đồ thị liên thông với ít nhất 2 đỉnh thì có 1 chu trình Euler nếu và chỉ nếu bậc của mỗi đỉnh là số chẵn Ta dễ dàng kiểm chứng một giả đồ thị có chu trình Euler hay không như hàm sau
Trang 14Ta dùng hàm này để giải bài toán cây cầu Konigsberg nổi tiếng Đầu tiên ta tạo đồ thị mô tả bài
toán gồm các thành phố và các cầu như hình Sau đó ta gọi để kiểm tra Lưu ý, giữa 2 đỉnh A và
C có 2 cạnh, tương tự cho A và B, ở đây vẽ đậm lên cho dễ thấy
> Konigsberg := Graph({[{"A","B"},2], [{"A","C"},2],
{"A","D"}, {"B","D"}, {"C","D"}});
> SetVertexPositions(Konigsberg,[[0,1],[0,0],[0,2],[1,1]]);
14
Trang 18Chương trình bắt đầu với việc dùng hàm IsPseudoEulerianđể tránh tìm kiếm chu trình
mà không tồn tại trong đồ thị Sau đó ta gán đồ thị cho 1 biến H Ta dùng biến H này để lưu giữ đồ thị cần xử lý sau này
Có 2 ý chính trong giải thuật này Một là, đối với 1 đồ thị mà đỉnh đều có bậc chẵn, nếu
ta lấy bất kỳ đỉnh nào để bắt đầu và đi theo cạnh ngẫu nhiên nhưng không lặp lại, ta sẽ quay về đỉnh ban đầu và tạo nên 1 chu trình Ý thứ 2 là đối với đồ thị liên thông, nếu chu trình của ta không bao gồm tất cả các cạnh của đồ thị, thì vài đỉnh được sử dụng trong chu trình có sẵn có thể được dùng làm điểm khởi đầu cho 1 chu trình con mới Chu trình con mới này sau đó có thể được ghép vào trong chu trình chính Việc này cuối cùng sẽ dẫn đến việc sử dụng tất cả các cạnh và kết quả ta được chu trình Euler
Biến circuit lưu giữ kết quả chu trình Euler và trả về kết quả cần tìm, nó chứa list các
đỉnh mà chu trình đi qua nó và ban đầu khởi tạo là rỗng Vòng While chính gồm 3
phần : (1) xác định điểm bắt đầu của chu trình con (gọi là subC); (2) xây dựng chu trình
con; (3) ghép chu trình con vào chu trình chính
Bước đầu tiên, tìm điểm bắt đầu của chu trình con, phụ thuộc vào trạng thái của chu
trình chính Nếu circuit là ds rỗng, điểm bắt đầu là đỉnh đầu tiên trong đồ thị Nếu
circuit không rỗng, thì câu lệnh else sẽ xem các đỉnh trong chu trình chính và tìm 1 đỉnh
mà có láng giềng Đỉnh đầu tiên có láng giềng được sử dụng như điểm bắt đầu của chu
trình con Biến insertPoint được sử dụng để lưu trữ các chỉ số, tương đối với circuit,
của đỉnh bắt đầu của chu trình con Nó được sử dụng khi chu trình con được ghép vào chu trình chính
Bước thứ 2 là xây dựng subC Biến buildingSub được sử dụng để điều khiển vòng while Nó được khởi tạo là true và được gán false khi biến subC trả về đỉnh khởi đầu của nó và vì thế nó là 1 chu trình Biến v được gán là đỉnh cuối hiện thời được tính như
là 1 phần của chu trình con và w biểu diễn cho 1 láng giềng của v Biến e = {v, w} biểu
diễn 1 cạnh của đồ thị mà chưa được duyệt trong chu trình Nếu H có trọng số, trọng số này hoặc là giảm đi 1 để biểu thị việc loại 1 trong vài cạnh giữa các đỉnh hay là bị xóa nếu có chỉ 1 cạnh như thế Trong trường hợp không trọng số, cạnh thì luôn luôn bị xóa khỏi đồ thị Sau khi cạnh bị xóa, đỉnh w được thêm vào chu trình con, biểu diễn việc thêm vào của cạnh Cuối cùng, đỉnh mới nhất được so sánh với đỉnh bắt đầu để xác định xem chu trình kết thúc hay chưa Nếu đỉnh mới kết thúc chu trình, thì biến buildingSub sẽ set bằng false, khiến cho vòng while sẽ dừng Nếu không thì while sẽ thực hiện việc xây dựng chu trình con
Bước thứ 3, một khi chu trình con được xây dựng xong, sẽ được ghép với chu trình
chính Ở lần đầu ở vòng lặp chính, chu trình chính rỗng và subC được copy vào
circuit những lần lặp tiếp theo của vòng lặp chính, biến oldC được dùng để lưu giá trị
cũ của chu trình Lưu ý biến insertPoint lưu chỉ số của đỉnh bắt đầu của subC Mục
đích là đưa chu trình con vào vị trí đó
18
Trang 19Vòng lặp chính tiếp tục cho đến khi tất cả cạnh của đồ thị đã có trong chu trình, làm cho biến circuit là 1 chu trình Euler trong đồ thị Như ví dụ minh họa sau, in ra chu trình Euler.
Dữ liệu thử nghiệm
> Test := Graph({{"a","b"},[{"a","e"},3],{"b","c"},{"b","d"}, {"b","e"},[{"c","d"},2],{"c","e"},{"d","e"}});
> SetVertexPositions(Test,[[0,2],[1,2],[2,.5],[1,1],[0,1]]);
> DrawPseudograph(Test);
Trang 20> TestPath := FindMultiEuler(Test);
20
Trang 211.3 BÀI TOÁN TÔ MÀU ĐỒ THỊ (GRAPH COLORING)
1.3.1 Giới thiệu bài toán tô màu đồ thị
Vấn đề liên quan đến tô màu các miền trên bản đồ, ví dụ bản đồ các vùng trên thế giới
đã dẫn đến nhiều kết quả trong lí thuyết đồ thị Khi tô màu bản đồ, ta thường tô 2 miền
có chung đường biên giới bằng 2 màu khác nhau Để đảm bảo điều này, ta có thể sử dụng màu sắc riêng cho mỗi miền Tuy nhiên, cách làm này là không hiệu quả, và nếu bản đồ có quá nhiều miền, sẽ rất khó để phân biệt giữa các miền có màu sắc gần giống nhau Do đó, ta nên sử dụng số màu ít nhất có thể được Nó dẫn đến bài toán xác định
số màu tối thiểu cần sử dụng để tô màu các miền bản đồ sao cho các miền lân cận luôn khác màu nhau
VD: Bản đồ H1a có thể tô được bằng 4 màu, nhưng không thể tô bằng 3 màu -> Số màu tối
thiểu phải là 4
Bản đồ H1b có thể tô bằng 3 màu,nhưng 2 màu là không thể ->Số màu tối thiểu là 3
Mỗi bản đồ trên mặt phẳng có thể biểu diễn bằng đồ thị: Mỗi miền biểu diễn bằng 1 đỉnh; 2 đỉnh
sẽ được nối với nhau khi 2 miền tương ứng có chung đường biên giới Hai miền chỉ tiếp xúc nhau tại 1 điểm coi như không kề nhau Đồ thị này được gọi là đồ thị kép của bản đồ Từ phương pháp xây dựng đồ thị kép của 1 bản đồ, dễ thấy mỗi bản đồ phẳng sẽ tương ứng với 1
đồ thị kép phẳng
H2 thể hiện đồ thị phẳng tương ứng của các bản đồ trong H1
Trang 23• Định lí 4 màu :
Số màu của 1 đồ thị phẳng không lớn hơn 4
Giả thuyết 4 màu được đề ra từ những năm 1850 Nó cuối cùng đã được chứng minh bởi 2 nhà
toán học Mĩ là Kenneth Appel và Wolfgang Haken năm 1976 Trước đó, nhiều người đã đề ra
các cách chứng minh khác nhau của bài toán, nhưng tất cả đều sai và thường mắc phải những lỗi khó phát hiện Bên cạnh đó là những cố gắng vô ích trong việc phủ định giả thuyết bằng cách chỉ ra những bản đồ đòi hỏi nhiều hơn 4 màu
Có lẽ, sai lầm nổi tiếng nhất là chứng minh được xuất bản năm 1879 bởi một luật sư
ở Luân Đôn và một nhà toán học nghiệp dư, Afred Kempe Các nhà toán học công nhận chứng minh này là đúng cho đến năm 1890, khi Percy Heawood tìm ra lỗi Tuy nhiên, hướng lí luận của Kempe lại trở thành cơ sở cho thành công của Appel và Haken sau này Chứng minh của họ dựa trên phân tích cẩn thận từng trường hợp trên máy tính Họ chỉ ra rằng nếu giả thuyết 4 màu sai, họ phải tìm ra được phản ví dụ của 1 trong khoảng 2000 trường hợp khác nhau Họ đã sử dụng máy tính chạy trong 1000 tiếng để thực hiện chứng minh của mình Chứng minh này đã gây ra nhiều tranh cãi khi
sử dụng máy tính để thực hiện các thao tác chính Ví dụ, chương trình máy tính có thể mắc lỗi dẫn đến kết quả sai Liệu lí lẽ của họ có thật sự là 1 chứng minh khi phụ thuộc vào những kết quả không đáng tin cậy của máy tính?
Định lí 4 màu chỉ ứng dụng trên đồ thị phẳng Đồ thị không phẳng có thể có số màu lớn hơn 4
2 điều kiện được yêu cầu để xác định số màu của 1 đồ thị là n: Đầu tiên,phải chứng minh đồ thị có thể tô bằng n màu.Việc này có thể thực hiện bằng cách xây dựng, như tô màu Thứ 2, chúng ta phải chỉ ra rằng đồ thị không thể tô bằng số màu ít hơn n Các ví
dụ sau điển hình cho cách tìm số màu đồ thị
Trang 24Một số ví dụ
24