5.1Bài toán đƣờng đi ngắn nhất
Định nghĩa. Cho đồ thị G = (X, E) (có hƣớng hoặc không có hƣớng) là đồ thị có trọng lƣợng và
(e) là trọng lƣợng của cạnh e. Với G‟ ≤ G thì trọng lƣợng của G‟ là
' ( ') ( ) e G G e
Nếu G‟ là đƣờng đi hay chu trình thì (G‟) là độ dài của G‟. Nếu G‟ là một mạch và (G‟) < 0 thì ta bảo G‟ là mạch âm.
Định nghĩa. Cho đồ thị G = (X, E) có trọng lƣợng với X = {!,2,...,n} và I, j X. Gọi P là tập hợp các đƣờng đi từ i đến j. Xét bài toán
Tìm P0 P sao cho (P0) = min{(P) : P P}
Bài toán này gọi là bài toán tìm đƣờng đi ngắn nhất và P0 gọi là đƣờng đi ngắn nhất.
Định nghĩa. Cho G = (X, E) với X = {1,2,…,n}. Ma trận khoảng cách của G là ma trận D = (Dij) với 0 if i = j (, ) if (i,j) E if (i,j) E ij Di j
5.1.1 Thuật toán Dijkstra
Trong Maple ta có thể tìm đƣờng đi ngắn nhất bằng thuật toán Dijkstra, bằng cách sử dụng các lệnh sau đây :
34
DijkstrasAlgorithm(G, s, t)
DijkstrasAlgorithm(G, s, T)
DijkstrasAlgorithm(G, s)
Trong đó : G là đồ thị mà các trọng lƣợng các cạnh phải lớn hơn 0 hoặc không có trọng lƣợng.
s,t là các đỉnh của G.
T là danh sách các đỉnh của G.
Nếu G là đồ thị không trọng lƣợng, các cạnh đƣợc giả sử có trọng lƣợng bằng nhau và bằng 1. Nếu G là đồ thị có trọng lƣợng, DijkstrasAlgorithm(‘G’, ‘s’,’ t’) sẽ trả về đường đi có trọng lượng nhỏ nhất từ đỉnh s đến đỉnh t trong G. Nếu tồn tại đường đi ngắn nhất từ s đến t thì dữ liệu trả về có dạng **s,…,t+,w+,trong đó *s,…,t+ là đường đi, w là trọng lượng của đường đi. Nếu không tòn 6 tại đường đi dữ liệu trả về sẽ là ** +,∞+.
Lời gọi hàm thứ 2 DijkstrasAlgorithm(G, s, T) tương đương với [seq(DijkstrasAlgorithm(G, s, t),t
= T]
Lời gọi hàm thứ 3 DijkstrasAlgorithm(G, s) tương đương với DijkstrasAlgorithm(G, s,
Vertices(G)).
Ví dụ :
>with(GraphTheory):
>C6:=Graph({[{1,2},1],[{2,3},3],[{3.4},7],[{4,5},3],[{5,6},3],[{1,6},3]})
C6:=Graph 1: an undirected weighted graph with 6 vertices and 6 edge(s)
>DijkstrasAlgorithm(C6,1,4) >DrawGraph(C6)
35 >DijkstrasAlgorithm(C6,1)
[[[1],0],[[1,2],1],[[1,2,3],4],[[1, 6,5,4],9],[[1,6,5],6],[[1,6],3]]
>G:=Graph({[[1,2],2],[[1,3],2],[[2,3],2],[[3,1],2],[[4,5],2],[[5,6],2],[[6,4],2]})
G:=Graph 2: a directed weighted graph eith 6 vertices and 7 arc(s)
>DrawGraph(G) > DijkstrasAlgorithm(G,1,3) [[1,3],2] > DijkstrasAlgorithm(G,4,6) [[4,5,6],2] > DijkstrasAlgorithm(G,1,6) [[ ],∞]
36
5.1.2 Thuật toán BFS
Trong Maple ta có thể tìm đƣờng đi ngắn nhất bằng thuật toán duyệt theo chiều rộng (BFS), bằng cách sử dụng lệnh sau đây :
ShortestPath(G,u,v)
Trong đó : G là một đồ thị; u,v là các đỉnh trong G.
ShortestPath trả về đƣờng đi ngắn nhất từ u đến v. Trọng lƣợng của cạnh đƣợc bỏ qua. Nếu tồn tại đƣờng đi thì dữ liệu trả về là danh sách các đỉnh của đƣờng đi. Nếu không tồn tại đƣờng đi từ u đến v thì sẽ trả về một lỗi.
Ví dụ :
>with(GraphTheory): >C6:=CycleGraph(6)
C6:=Graph 1: an undirected unweighted graph with 6 vertices and 6 edge(s)
>ShortestPath(C,1,5)
[1,6,5]
5.1.3 Thuật toán DFS
5.1.4 Thuật toán Ford-Bellman
Trong Maple ta có thể tìm đƣờng đi ngắn nhất bằng thuật toán Ford-Bellman, bằng cách sử dụng các lệnh sau đây :
BellmanFordAlgorithm(G, s, t)
BellmanFordAlgorithm(G, s, T)
BellmanFordAlgorithm(G, s)
Trong đó : G là đồ thị không trọng lƣợng hoặc nếu có trọng lƣợng thì không đƣợc có chu trình có trong lƣợng âm.
s,t là các đỉnh của G.
T là danh sách các đỉnh của G.
Hàm BellmanFordAlgorithm sẽ tìm đƣờng đi có trọng lƣợng bé nhất đi từ s đến t.
37 Nếu G là đồ thị có trọng lƣợng, BellmanFordAlgorithm(‘G’, ‘s’,’ t’) sẽ trả về đường đi có trọng lượng nhỏ nhất từ đỉnh s đến đỉnh t trong G. Nếu tồn tại đường đi ngắn nhất từ s đến t thì dữ liệu trả về có dạng **s,…,t+,w+,trong đó *s,…,t+ là đường đi, w là trọng lượng của đường đi. Nếu không tòn 6 tại đường đi dữ liệu trả về sẽ là ** +,∞+.
Lời gọi hàm thứ 2 BellmanFordAlgorithm(G, s, T) tương đương với
[seq(BellmanFordAlgorithm(G, s, t),t = T]
Lời gọi hàm thứ 3 BellmanFordAlgorithm(G, s) tương đương với BellmanFordAlgorithm(G, s,
Vertices(G)). Ví dụ :
>with(GraphTheory):
>C6:=Graph({[[1,2],1],[[2,3],-3],[[3,4],7],[[1,5],4],[[5,6],-1],[[6,4],3]})
C6:=Graph 1: a directed weighted graph eith 6 vertices and 6 arc(s)
>BellmanFordAlgorithm(C6,1,4)
[[1,2,3,4],5]
>BellmanFordAlgorithm(C6,2,5)
[[ ], ∞]
>DrawGraph(C6)
38
5.2 Đƣờng đi Euler
Trong Maple để tìm đƣờng đi Euler trong đồ thị, ta gọi các hàm sau đây : IsEulerian(G)
IsEulerian(G,T)
Trong đó : G là đồ thị cần tìm đƣờng đi Euler.
T là đƣờng đi Euler tìm đƣợc nếu có.(T có thể thay thay bằng tên khác).
Lệnh IsEulerian(G) trả về giá trị true nếu đồ thị G là đồ thị Euler. Tức là G có chu trình Euler đi qua tất cả các cạnh của G đúng 1 lần. Và trả về giá trị false nếu G không phải đồ thị Euler. Tham số thứ 2 là T sẽ chứa dữ liệu đƣờng đi Euler, nếu tồn tại đƣờng đi Euler. Ngƣợc lại trả về false. Ví dụ : >with(GraphTheory): >IsEulerian(CompleteGraph(4)) False >IsEulerian(CompleteGraph(5)) True >T Trail(1,2,3,1,4,2,5,3,4,5,1) 5.3Đƣờng đi Hamilton
Trong Maple để tìm đƣờng đi Hamilton trong đồ thị, ta gọi các hàm sau đây : IsHamiltonian(G)
IsHamiltonian (G,C)
Trong đó : G là đồ thị cần tìm đƣờng đi Hamilton.
39 Lệnh IsHamiltonian sẽ trả về true nếu đồ thị đƣa vào là đồ thị Hamilton. Ngƣợc lại trả về false. Nếu có đƣờng đi Hamilton, lệnh IsHamiltonian(G,C) sẽ giúp thu đƣợc đƣờng đi Hamilton nằm trong C.
Ví dụ :
>with(GraphTheory): >with(SpecialGraphs): >P:=PetersenGraph()
P:=Graph 1: an undirected unwieghted graoh with 10 vitices and 15 edge(s)
>IsHamiltonian(P)
false
>AddEdge(P,{1,3})
Graph 1: an undirected unwieghted graoh with 10 vitices and 16 edge(s)
>IsHamiltonian(P,’C’) True >C [1,2,9,8,5,4,10,6,7,3,1] >DrawGraph(P) >H3:=HypercubeGraph(3)
40
H3:=Graph 2: an undirected unweighted graph with 8 vertices and 12 edge(s)
>IsHamitonian(H3,’C’) true >C [“000”,”100”,”110”,”010”,”011”,”111”,”101”,”001”,”000”] >HighlightTrail(H3, C, red) >DrawGraph(H3) >infolevel[IsHamiltonian]:=2 infolevel[GraphTheory:-IsHamiltonian]:=2 >IsHamiltonian(H3) true >K33:=CompleteGraph(3,3)
K33:=Graph 3: an undirected unweighted graph with 6 vertices and 9 edge(s)
>IsHamiltonian(K33)
IsHamiltonian: “graph satisfies MinimumDegree(G) >= NumberOf Vertices(G)/2 ==> it is hamiltonian”
true
41
K34:= Graph 4: an undirected unweighted graph with 7 vertices and 12 edge(s)
>IsHamiltonian(K34)
IsHamiltonian: “graph satisfies IndependenceNumber(G) > NumberOf Vertices(G)/2 ==> it’s not hamiltonian”
42
CHƢƠNG 4: KẾT LUẬN
Môn học cung cấp các kiến thức cơ bản về tính toán hình thức trên máy tính và việc lập trình tính toán hình thức, giúp học viên rèn luyện kỹ năng lập trình tính toán hình thức nâng cao với MAPLE. Từ đó dùng công cụ lập trình symbolic trong việc thiết kế cài đặt một số chƣơng trình giải quyết các vấn đề của trí tuệ nhân tạo nhƣ các thuật giải heuristic, biểu diễn và xử lý trí thức, suy luận dựa trên cơ sở tri thức.
Trong thời gian học tập, bản thân tôi và các bạn cùng lớp đã nhận đƣợc sự chỉ dạy, hƣớng dẫn rất nhiệt tình của PGS-TS. Đỗ Văn Nhơ, Thầy đã hỗ trợ bài giảng, tài liệu, cũng nhƣ luôn theo dõi và động viên chúng tôi kịp lúc. Chúng em rất cảm ơn và xin chúc Thầy nhiều sức khỏe, thành công. Cũng xin cám ơn các bạn cùng lớp Cao học CNTTQM khóa 6 đã giúp đỡ tôi trong thời gian học tập, nghiên cứu, trao đổi bài học trên diễn dàn.
Trân trọng.
43
TÀI LIỆU THAM KHẢO Các tài liệu tiếng Anh:
[1] Nils J. Nilson “Introduction to machine learning”, December 4, 1996. [2] Tom M. Mitchel, “Machine Learning”.
[3] M.R Anderber, Cluster analysis of application, A cademic Press, New York, 1973.
[4] B.S. Everitt, Cluster Analysis, Edward Amold coblished by Haisted Press and imprint of john Wiley & Sons Inc., 3rd edition, 1993.
[5] D.Fisher, Knowledged acquisition via incremental conceptual clustering, in Machine Learing
[6] Raymond J. Mooney, “Slide Machine Learning Introduction”
Các tài liệu tiếng Việt:
[5] Slide _ Công nghệ tri thức và ứng dụng _ GS.TSKH. Hoàng Kiếm
[6] Phan Đình Diệu (1999), “Lô Gích trong Các Hệ Tri Thức”, NXB Đại học Quốc gia Hà Nội, Hà Nội.
[7] GS.TSKH. Hoàng Kiếm, Lê Bá Phƣơng, “Ứng dụng khai phá dữ liệu để tìm hiểu thông tin khách hàng”
Các tài liệu trên internet:
[15] http://bis.net.vn/forums/p/374/650.aspx.