Giới thiệu Logic mờ

Một phần của tài liệu LUẬN VĂN: NGHIÊN CỨU PHÁT TRIỂN HỆ THỐNG DỊCH VỤ DỰA TRÊN VỊ TRÍ ĐỊA LÝ VÀ THỬ NGHIỆM doc (Trang 35 - 91)

Trong cuộc sống, con người truyền thông tin cho nhau chủ yếu là bằng ngôn ngữ tự nghiên. Ngôn ngữ tự nhiên thường đa nghĩa hoặc thâm chí có lúc còn thiếu tính chính xác, nhưng nó vẫn là phương tiện chính mà con người dùng để truyền thông tin cho nhau. Với khả năng đặc biệt của mình, con người thường vượt qua những hạn chế của ngôn ngữ tự nhiên (đa nghĩa, chiếu chính xác, không rõ ràng) và thường là hiểu đúng các thông tin nhận được. Đây là điều mà máy móc chưa thể thực hiện được. Tham vọng của các nhà khoa học là mong muốn máy móc có khả năng hiểu được ngôn ngữ tự nghiên, có khả năng suy diễn, có khả năng xử lý thông tin tương tự như bộ óc con người, để con người có thể ra lệnh cho máy móc bằng ngôn ngữ tự nhiên, yêu cầu đến sự trợ giúp của máy móc mà qua đó đòi hỏi máy móc phải xử lý các dữ liệu mang nhiều ý nghĩa khác nhau, có khi thiếu tính chính xác, chưa được xác định một cách rõ ràng giống như ngôn ngữ tự nhiên.

Ví dụ như chúng ta có thể yêu cầu máy móc chỉ ra một đường đi “tốt nhất” để đi từ vị trí A đến một ví trí B nào đó. Việc có tồn tài một đường đi từ A đến B hay không thường là có thể xác định một cách rõ ràng, thậm chí có thể chỉ ra nhiều đường đi khác nhau để có thể đi từ A đến B. Vấn đề là xác định con đường nào là “tốt nhất” để đi từ A đến B. Ở đây, ngay mệnh đề “tốt nhất” bản thân đã không được xác định một cách rõ ràng, thế nào là tốt nhất. Một con đường tốt có thể là con đường ngắn nhất những cũng có thể không phải vậy. Nếu đường ngắn nhưng dễ xảy ra tắc đường thì chưa hẳn đã là “tốt”, thậm chí còn “tệ” hơn con đường dài nhưng luôn thông suốt. Độ tốt của con đường phụ thuộc vào nhiều yếu tố, có những yếu tố cố định và xác định được ngay từ đầu, nhưng cũng có những yếu tố là chưa xác định và thường xuyên thay đổi ví dụ như yếu tố tắc đường, sự cố bất thường khiến đường đi bị nghẽn,...

Để máy móc có thể hiểu và xử lý được những tri thức được diễn đạt bằng ngôn ngữ tự nhiên người ta cần phải xây dựng một lý thuyết logic toán cho phép mô tả chính xác ý nghĩa của các mệnh đề không rõ ràng, đa nghĩa. chẳng hạn như: đường tốt, đượng rộng, đường hẹp, giàu, nghèo, đắt, rẻ,... Năm 1965, Lotti

Zahden, một nhà toán học và cũng là nhà logic học người Hà Lan, đã xây dựng thành công lý thuyết tập mờ và hệ thống logic mờ. Phát minh này của Lotti Zahden cho phép người ta có thể lượng hóa giá trị các mệnh đề mờ, qua đó có thể truyền đạt một số thông tin cho máy móc bằng ngôn ngữ tự nhiên, có thể yêu cầu máy móc xử lý các dữ liệu mang nhiều thông tin, thiếu tính chính xác, không rõ ràng.

1.1.1. Nhắc lại về tập hợp kinh điển

Khái niệm về tâp hợp được hình thành trên nền tảng logic và được G.Cantor định nghĩa như là một sự xếp đặt chung các vật, các đối tượng có cùng một tính chất, được gọi là phần tử của tập hợp đó. Ý nghĩa logic của khái niệm tập hợp được xác định ở chỗ một vật hoặc một đối tượng bất kỳ chỉ có thể có hai khả năng hoặc là phaàn tử của tập đang xét hoặc không [3].

Có nhiều cách để biểu diễn tập hợp. Cách biểu diễn vừa đơn giản lại dễ được chấp nhận nhất là liệt kê các phẩn tử của tập hợp, ví dụ

S1 = {0, 2, 4, 6, 8} hay S2 = {nhà, xe, cây}

Trong trường hợp không thể liệt kê hết được các phần tử của tập A, người ta có thể chỉ ra những tính chất chính xác mà những phần tử trong tập A phải thoả mãn, chẳng hạn A = {x | x là số tự nhiên}. Tập hợp mà các phần tử của nó có thể được xác định một cách rõ ràng như vậy còn được gọi là “tập rõ”.

Với tập hợp A, ánh xạ µA(x): A->R được định nghĩa như sau

      A x nÕu 0 A x nÕu 1 A(x) (1)

được gọi là hàm thuộc của tập A.

Một tính chất quan trọng nhất của tập rõ mà chúng ta cần chú ý, đó là một tập rõ hoàn toàn được xác định bởi hàm thuộc của nó. Hàm thuộc của tập rõ A được ký hiệu là µA(x), là một hàm chỉ nhận một trong hai giá trị (0/1). Hàm nhận giá trị 1 khi x thuộc tập A và nhận giá trị 0 khi x không thuộc tập A. Các phần tử của tập rõ luôn có một ranh giới rõ ràng giữa các phần tử thuộc và các phần tử không thuộc nó.

Một tập X luôn có µA(x)=1, với mọi x được gọi là không gian nền (tập nền).

1.1.2. Khái niệm chung về tập mờ

Trong thực tế, có những vấn đề không biểu diễn bằng tập rõ được. Ví dụ như khi nói về vận tốc của một chiếc xe ô tô chạy trên đường, ta cần chỉ ra là xe chạy với “vận tốc cao”, “vận tốc thấp”. Giả sử quy ước vận tốc dưới 40Km/h là vận tốc thấp, trên 60Km/h là vận tốc cao. Như vậy dải vận tốc từ 40Km/h đến

60Km/h sẽ thuộc vào vận tốc thấp hay vận tốc cao? Ngay cả quy ước giới hạn vận tốc thấp hay cao tùy từng con đường, thời điểm cũng có thể khác nhau. Như vậy mệnh đề “vận tốc cao”, “vận tốc thấp” không phải là một mệnh đề rõ cho phép xác định một tập rõ. Tương tự như vậy, mệnh đề “người giàu”, “người nghèo”, “người trẻ”, “người già”,... đều không phải là “mệnh đề chính xác”. Trong các trường hợp tương tự như các ví dụ trên người ta sử dụng tập mờ để biểu diễn. Nếu tập rõ được xác định bởi các tính chất chính xác cho phép chúng ta biết một đối tượng là thuộc hay không thuộc tập đã cho và hàm thuộc của tập rõ chỉ nhận hai giá trị 0 hoặc 1, hàm thuộc của tập rõ nhận giá trị là 1 khi đối tượng thuộc tập đã cho; ngược lại, nó sẽ nhận giá trị 0 khi đối tượng không thuộc tập đó. Từ những ví dụ trên cho thấy, các tập mờ có đặc trưng là tính không rõ ràng, không chính xác. Các tập mờ được xác định bởi hàm thuộc mà giá trị của nó là các số thực từ 0 đến 1.

Trong tập mờ S, mỗi phần tử được xác định [8]:

µS : Ω -> M (2)

trong đó µS là hàm xác định phần tử của tập (hàm thành viên - membership function), Ω là tập nền, M là miền giá trị cho phép. Thông thường M lựa chọn trong phạm vi [0,1]. vì vậy công thức (2) có thể viết lại:

µS : Ω -> [0,1] (3)

Support của tập mờ S, ký hiệu là supp(S), bao gồm các phần tử có bậc tư cách thành viên dương:

supp(S) = { x ∈ Ω | μs(x) > 0 } (4)

α-cut của tập mờ S được ký hiệu Sα:

Sα = { x ∈ Ω | μs(x) ≥ α } (5)

Tương tự, α-level cut của tập mờ S, ký hiệu là Sα, là tập con chứa tất cả các phần tử có bậc tư cách thành viên đúng bằng α:

Sα = { x ∈ Ω | μs(x) = α } (6)

1.1.3. Các phép toán trên tập mờ

Các phép toán cơ bản trên tập mờ là phép hợp, phép giao và phép bù [3] [1]. Tương tự như định nghĩa về tập mờ, các phép toán trên tập mờ cũng sẽ được định nghĩa thông qua hàm thuộc (hàm thành viên).

Tập mờ S được gọi là rỗng nếu µS(x)=0 với mọi x  X Tập mờ A=B khi µA(x)= µB(x) với mọi x  X

Tập mờ AB khi µA(x)< µB(x) với mọi x  X C=AB trong đó µC(x)=min{µA(x), µB(x)} C=AB trong đó µC(x)=max{µA(x), µB(x)} A’ là phần bù của A và µA’(x)=1-µA(x) Minh họa một số phép toán trên tập mờ:

Hình 2.1: Minh hoạ phép toán hợp trên tập mờ

Hình 2.2: Minh hoạ phép toán giao trên tập mờ

Trong các ứng dụng thực tế, như trong các mạng lưới giao thông đường bộ, đường thuỷ hay đường không. Người ta không chỉ quan tâm đến việc tìm đường đi giữa hai địa điểm mà còn phải lựa chọn một hành trình “tốt nhất” (theo tiêu chuẩn nào đó như không gian, thời gian hay chi phí). Khi đó phát sinh yêu cầu tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị. Trong đó, các đỉnh của đồ thị tương ứng với các điểm nút giao thông, các cạnh của đồ thị tương ứng với các tuyến đường nối các điểm nút giao thông với nhau, độ dài tuyến đường hay kết hợp với các thông số khác như độ rộng, tốc độ cho phép,… đóng vai trò là trọng số của cạnh tương ứng trên đồ thị. Bài toán này phát biểu dưới dạng tổng quát như sau: Cho đồ thị có trọng số G = (V, E), hãy tìm một đường đi ngắn

nhất từ đỉnh xuất phát S ∈ V đến đỉnh đích F ∈ V. Độ dài của đường đi này được

ký hiệu là d[S, F] và gọi là khoảng cách từ S đến F. Nếu như không tồn tại đường đi từ S tới F thì ta sẽ đặt khoảng cách đó = +∞.

Nếu như đồ thị có chu trình âm (chu trình với độ dài âm) thì khoảng cách giữa một số cặp đỉnh nào đó có thể không xác định, bởi vì bằng cách đi vòng theo chu trình này một số lần đủ lớn, ta có thể chỉ ra đường đi giữa hai đỉnh nào đó trong chu trình này nhỏ hơn bất kỳ một số cho trước nào.

Trong trường hợp như vậy, có thể đặt vấn đề tìm đường đi cơ bản (đường đi không có đỉnh lặp lại) ngắn nhất. Tuy nhiên đây là một vấn đề phức tạp, không nằm trong phạm vi nghiên cứu của đề tài nên không được trình bày cụ thể trong luận văn này.

Nếu như đồ thị không có chu trình âm thì ta có thể chứng minh được rằng một trong những đường đi ngắn nhất là đường đi cơ bản. Và nếu như biết được khoảng cách từ S tới tất cả những đỉnh khác thì đường đi ngắn nhất từ S tới F có thể tìm được một cách dễ dàng qua thuật toán sau:

Gọi c[u, v] là trọng số của cạnh [u, v]. Qui ước c[v, v] = 0 với mọi v ∈ V

và c[u, v] = +∞ nếu như (u, v) ∉ E. Đặt d[S, v] là khoảng cách từ S tới v. Để tìm

đường đi từ S tới F, ta có thể nhận thấy rằng luôn tồn tại đỉnh F1 ≠ F sao cho: d[S, F] = d[S, F1] + c[F1, F]

(Độ dài đường đi ngắn nhất S->F = Độ dài đường đi ngắn nhất S->F1 + Chi phí đi từ F1 tới F)

Đỉnh F1 đó là đỉnh liền trước F trong đường đi ngắn nhất từ S tới F. Nếu F1≡S thì đường đi ngắn nhất là đường đi trực tiếp theo cung (S, F). Nếu không thì vấn đề trở thành tìm đường đi ngắn nhất từ S tới F1. Và ta lại tìm được một đỉnh F2 khác F và F1 để:

d[S, F1] = d[S, F2] + c[F2, F1]

Cứ tiếp tục như vậy, sau một số hữu hạn bước, ta suy ra rằng dãy F, F1, F2, … không chứa đỉnh lặp lại và kết thúc ở S. Lật ngược thứ tự dãy cho ta đường đi ngắn nhất từ S tới F. Tuy nhiên, người ta thường không sử dụng phương pháp này mà sẽ kết hợp lưu vết đường đi ngay trong quá trình tìm kiếm.

Sau đây là một số thuật toán tìm đường đi ngắn nhất từ đỉnh S tới đỉnh F trên đơn đồ thị có hướng G = (V, E) có n đỉnh và m cung.

Thuật toán Ford-Bellman

Thuật toán Ford-Bellman áp dụng trên đồ thị không có chu trình âm và được phát biểu như sau:

Với đỉnh xuất phát S. Gọi d[v] là khoảng cách từ S tới v với các giá trị khởi tạo là:

d[S] = 0

d[v] = +∞ nếu v ≠ S

Sau đó ta tối ưu hoá dần các d[v] như sau: Xét mọi cặp đỉnh u, v của đồ thị, nếu có một cặp đỉnh u, v mà d[v] > d[u]+ c[u, v] thì ta đặt lại d[v] := d[u] + c[u, v].

Tức là nếu độ dài đường đi từ S tới v lại lớn hơn tổng độ dài đường đi từ S tới u cộng với chi phí đi từ u tới v thì ta sẽ huỷ bỏ đường đi từ S tới v đang có và coi đường đi từ S tới v chính là đường đi từ S tới u sau đó đi tiếp từ u tới v.

Chú ý rằng ta đặt c[u, v] = +∞ nếu (u, v) không là cung. Thuật toán sẽ kết thúc khi không thể tối ưu thêm bất kỳ một nhãn d[v] nào nữa.

Tính đúng đắn của thuật toán:

Tại bước khởi tạo thì mỗi d[v] chính là độ dài ngắn nhất của đường đi từ S tới v qua không quá 0 cạnh.

Giả sử khi bắt đầu bước lặp thứ i (i ≥ 1), d[v] đã bằng độ dài đường đi ngắn nhất từ S tới v qua không quá i - 1 cạnh. Do tính chất: đường đi từ S tới v qua không quá i cạnh sẽ phải thành lập bằng cách: lấy một đường đi từ S tới một đỉnh u nào đó qua không quá i - 1 cạnh, rồi đi tiếp tới v bằng cung (u, v), nên độ dài đường đi ngắn nhất từ S tới v qua không quá i cạnh sẽ được tính bằng giá trị nhỏ nhất trong các giá trị (Nguyên lý tối ưu Bellman):

Độ dài đường đi ngắn nhất từ S tới v qua không quá i - 1 cạnh

Độ dài đường đi ngắn nhất từ S tới u qua không quá i - 1 cạnh cộng với

trọng số cạnh (u, v) (∀u)

Vì vậy, sau bước lặp tối ưu các d[v] bằng công thức

d[v]bước i = min(d[v]bước i-1, d[u]bước i-1+ c[u, v]) (∀u)

thì các d[v] sẽ bằng độ dài đường đi ngắn nhất từ S tới v qua không quá i cạnh.

Sau bước lặp tối ưu thứ n - 1, ta có d[v] = độ dài đường đi ngắn nhất từ S tới v qua không quá n - 1 cạnh. Vì đồ thị không có chu trình âm nên sẽ có một đường đi ngắn nhất từ S tới v là đường đi cơ bản (qua không quá n - 1 cạnh). Tức là d[v] sẽ là độ dài đường đi ngắn nhất từ S tới v.

Do vậy số bước lặp tối ưu hoá sẽ không quá n - 1 bước.

Trong cài đặt chương trình, nếu mỗi bước lặp được mô tả dưới dạng: for u := 1 to n do

for v := 1 to n do

d[v] := min(d[v], d[u] + c[u, v]);

Do sự tối ưu bắc cầu (dùng d[u] tối ưu d[v] rồi lại có thể dùng d[v] tối ưu d[w] nữa…) chỉ làm tốc độ tối ưu nhãn d[v] tăng nhanh hơn nên số bước lặp tối ưu nhãn vẫn sẽ không quá n - 1 bước.

Thuật toán Dijkstra

Trong trường hợp trọng số trên các cung không âm, thuật toán do Dijkstra đề xuất dưới đây hoạt động hiệu quả hơn nhiều so với thuật toán Ford-Bellman. Ta hãy xem trong trường hợp này, thuật toán Ford-Bellman thiếu hiệu quả ở chỗ nào:

Với đỉnh v ∈ V, Gọi d[v] là độ dài đường đi ngắn nhất từ S tới v. Thuật

toán Ford-Bellman khởi gán d[S] = 0 và d[v] = +∞ với ∀v ≠ S, sau đó tối ưu hoá

dần các nhãn d[v] bằng cách sửa nhãn theo công thức: d[v] := min(d[v], d[u] +

c[u, v]) với ∀u, v ∈ V. Như vậy nếu như ta dùng đỉnh u sửa nhãn đỉnh v, sau đó

nếu ta lại tối ưu được d[u] thêm nữa thì ta cũng phải sửa lại nhãn d[v] dẫn tới việc d[v] có thể phải chỉnh đi chỉnh lại rất nhiều lần. Vậy nên chăng, tại mỗi bước không phải ta xét mọi cặp đỉnh (u, v) để dùng đỉnh u sửa nhãn đỉnh v mà sẽ chọn đỉnh u là đỉnh mà không thể tối ưu nhãn d[u] thêm được nữa.

Thuật toán Dijkstra có thể mô tả như sau:

Với đỉnh v ∈ V, gọi nhãn d[v] là độ dài đường đi ngắn nhất từ S tới v. Ta

sẽ tính các d[v]. Ban đầu d[v] được khởi gán như trong thuật toán Ford-Bellman

(d[S] = 0 và d[v] = ∞ với ∀v ≠ S). Nhãn của mỗi đỉnh có hai trạng thái tự do hay

cố định, nhãn tự do có nghĩa là có thể còn tối ưu hơn được nữa và nhãn cố định tức là d[v] đã bằng độ dài đường đi ngắn nhất từ S tới v nên không thể tối ưu thêm.

Để làm điều này ta có thể sử dụng kỹ thuật đánh dấu: Free[v] = TRUE hay FALSE tuỳ theo d[v] tự do hay cố định. Ban đầu các nhãn đều tự do.

Bước 2: Lặp

Bước lặp gồm có hai thao tác:

1. Cố định nhãn: Chọn trong các đỉnh có nhãn tự do, lấy ra đỉnh u là đỉnh có d[u] nhỏ nhất, và cố định nhãn đỉnh u.

2. Sửa nhãn: Dùng đỉnh u, xét tất cả những đỉnh v và sửa lại các d[v] theo công thức:

d[v] := min(d[v], d[u] + c[u, v])

Bước lặp sẽ kết thúc khi mà đỉnh đích F được cố định nhãn (tìm được đường đi ngắn nhất từ S tới F); hoặc tại thao tác cố định nhãn, tất cả các đỉnh tự

Một phần của tài liệu LUẬN VĂN: NGHIÊN CỨU PHÁT TRIỂN HỆ THỐNG DỊCH VỤ DỰA TRÊN VỊ TRÍ ĐỊA LÝ VÀ THỬ NGHIỆM doc (Trang 35 - 91)

Tải bản đầy đủ (PDF)

(91 trang)