Một số cách tiếp cận giải các bài toán NP-khó

Một phần của tài liệu Nghiên cứu ảnh hưởng của chất liệu sợi dệt và quá trình nhuộm tới khả năng ngăn ngừa tia uv của vải (Trang 37)

Như ta đã biết, các bài toán NP-khó (trong đó có NP-đầy đủ) hiện vẫn chưa có thuật toán hiệu quả để giải. Do đó người ta hướng tới các phương pháp giải gần đúng và các phương pháp dùng tính toán tiến hóa, một số phương pháp giải các bài toán NP

thường gặp là:

 Phương pháp xấp xỉ (Approximation)  Phương pháp xác xuất (Probabilistic)  Phương pháp Heuristic

 Phương pháp tính toán tiến hóa (Evolutionary Computation)

1.3.1 Phƣơng pháp xấp xỉ

Phương pháp xấp xỉ là phương pháp cho đảm bảo rằng sẽ tìm ra một lời giải gần đúng sai khác với lời giải đúng không quá một sai số tuyệt đối cho trước (hoặc một sai số tỉ lệ cho trước) trong thời gian đa thức. Trong phương pháp xấp xỉ người ta thường sử dụng đến kỹ thuật quy hoạch tuyến tính nới lỏng (relaxed linear programming).

Chỉ số đặc trưng cho phương pháp xấp xỉ chính là sai số tuyệt đối hoặc tỷ số chênh lệch tương đối cho phép giữa lời giải gần đúng và lời giải đúng.

hoặc

Trong đó gọi là đảm bảo về tỷ số chênh lệch tương đối (relative performance guarantee) và gọi là đảm bảo về sai số tuyệt đối (absolute performance guarantee). Tuy nhiên phương pháp xấp xỉ không phải lúc nào cũng đảm bảo được tính chất này với mọi bài toán NP-khó, nghĩa là có những bài toán (ví dụ như bài toán đóng thùng

~ 37 ~

– bin packing – người ta đã xây dựng được những phương án xấp xỉ trong thời gian đa thức (polynomial time approximation schemes – PTAS) cho phép đạt tới kết quả sai khác với kết quả đúng không quá một sai số cho trước bất kì. Tuy nhiên với một số bài toán, ví dụ như bài toán tìm bè lớn nhất của đồ thị vô hướng (Maximum Clique), thì không thể làm được điều này, thậm chí không thể xấp xỉ kết quả tới một giá trị sai khác với lời giải đúng một sai số hoặc một tỉ số đa thức.

Một hạn chế khác của phương pháp xấp xỉ là chúng chỉ có thể được áp dụng để giải những bài toán tối ưu hóa mà không áp dụng để giải những bài toán dạng quyết định thuần túy được (tuy nhiên người ta có thể chuyển đổi qua lại giữa dạng tối ưu hóa và dạng quyết định của những bài toán như vậy)

1.3.2 Phƣơng pháp xác xuất

Phương pháp xác xuất (probabilistic methods) hay còn gọi là phương pháp ngẫu nhiên (randomized) sử dụng các bộ sinh giá trị ngẫu nhiên như là đầu vào phụ giúp thuật toán định hướng xử lí và hy vọng thuật toán sẽ có hiệu quả hoạt động cao trong tình huống trung bình. Với phương pháp này khả năng thuật toán hoạt động tồi vẫn có thể xảy ra nhưng xác suất xảy ra là nhỏ.

ví dụ sau: Hãy tìm một kí tự ‗a‘ trong mảng gồm n thành phần trong đó một nửa là kí tự ‗a‘, một nửa còn lại là kí tự ‗b‘.

Một cách tiếp cận tự nhiên là ta đi xét từng phần tử của mảng, nhưng rõ ràng cách làm này khá tốn thời gian (cần n/2 phép toán) nếu mảng được xếp bởi các kí tự ‗b‘ trước rồi đến các kí tự ‗a‘ sau. Còn nếu ta duyệt các phần tử của mảng theo chiều ngược từ cuối trở về hoặc theo chiều xuôi nhưng với bước nhảy là 2 phần tử ta vẫn có thể gặp vấn đề tương tự với một bộ dữ liệu nào đó. Tóm lại là với bất kì một thuật toán có tính xác định (deterministic) nào, ta không thể đảm bảo rằng thuật toán đó sẽ hoạt động tốt với mọi bộ dữ liệu. Nhưng nếu ta sử dụng phương pháp xác suất để duyệt các phần tử của mảng trên một cách ngẫu nhiên, ta có thể hy vọng với

~ 38 ~

xác suất cao là thuật toán đó sẽ hoạt động quả, nhanh chóng tìm ra một kí tự ‗a‘ trong mảng, và không cần biết đầu vào là thế nào.

Một số thuật toán nằm trong phương pháp xác suất này như thuật toán Monte Carlo, thuật toán Las Vegas …

Phương pháp xác suất được ứng dụng nhiều trong lĩnh vực bảo mật. Tuy nhiên đôi khi người ta cũng áp dụng phương pháp này (như là một thủ tục hỗ trợ) cho các phương pháp khác để giải các bài toán NP-khó. Điều đó là bởi vì hiện nay các thuật toán đơn định vẫn chưa thể giải các bài toán NP-khó một cách hiệu quả, vì vậy người ta muốn sử dụng yếu tố ngẫu nhiên với hy vọng có thể tìm ra lời giải đúng với một xác suất may mắn nào đó.

1.3.3. Phƣơng pháp heuristic

Ta hãy xét bài toán tìm đường đi ngắn nhất làm ví dụ. Trong quá trình tìm kiếm đường đi ngắn nhất, người ta thường sử dụng một hàm , là một hàm số định nghĩa trên các nút trên cây tìm kiếm, để ước đoán chi phí nhỏ nhất từ nút là đối số của hàm đó tới nút đích. Thông tin heuristic này sẽ được các thuật toán tìm kiếm đã biết khác như thuật toán tìm kiếm tham lam Best-First Search hay thuật toán A* sử dụng để lựa chọn nút tiếp theo trên đường đi. Thuật toán tham lam Best-First Search lựa chọn nút có chi phí thấp nhất theo hàm heuristic , trong khi đó A* chọn nút có chi phí thấp nhất theo hàm trong đó là chi phí chính xác của đường đi từ trạng thái đầu tới nút đang xét. Nếu là một hàm dự đoán tốt thì hiển nhiên A* cũng có nhiều khả năng tìm ra lời giải tốt, trong đó có thể có lời giải tối ưu. Vấn đề thực sự giờ đây nằm ở chỗ lựa chọn hàm như thế nào để hỗ trợ tìm kiếm hiệu quả. Có nhiều cách để xây dựng heuristic cho bài toán

 Sử dụng hàm chi phí của các bài toán con làm heuristic, vì chi phí của bài toán tổng được tổ hợp từ chi phí của bài toán con, tất nhiên có thể hàm tổ hợp đó rất phức tạp, nhưng những thông tin về chi phí các bài toán con là rất

~ 39 ~

hữu ích cho việc ước đoán chi phí của bài toán tổng, đặc biệt nếu ta có nhiều kinh nghiệm tiếp xúc với dạng bài toán này. Để tiết kiệm thời gian tính toán người ta thường hay sử dụng một cơ sở dữ liệu mẫu (pattern database) lưu trữ lại lời giải đúng của mọi bài toán con

 Sử dụng lời giải của chính bài toán đó nhưng đã được loại bỏ một số điều kiện ràng buộc (việc loại bỏ này cho phép ta có thể tìm được lời giải đúng cho bài toán với thời gian tính chấp nhận được)

Phương pháp heuristic có nét giống với phương pháp xác suất ở chỗ nó đôi lúc cho ra những lời giải tồi hoặc có thời gian thực hiện là rất lâu. Tuy nhiên xác suất để xảy ra điều đó lại là rất thấp. Hơn thế nữa, nhờ sử dụng những tri thức và kinh nghiệm bổ trợ (heuristic), các phương pháp heuristic thường cho mang lại hiệu quả cao xét về cả chất lượng lời giải lẫn thời gian tính toán trong quá trình ứng dụng thực tế, nhưng nó không đảm bảo được rằng điều đó lúc nào cũng xảy ra.

Các phương pháp heuristic có một ưu điểm là giúp cải thiện đáng kể hiệu quả tính toán. Giả sử ta đang đứng ở một nút trên cây tìm kiếm, khoảng cách từ nút này tới nút đích là , và trên cây tìm kiếm trung bình một nút rẽ thành nhánh. Nếu sử dụng thuật toán tìm kiếm vét cạn thời gian tính sẽ là . Ta tìm được lời giải tối ưu nhưng trả giá bằng chi phí thời gian quá đắt và nhiều lúc sẽ trở thành không chấp nhận được. Nhưng nếu sử dụng heuristic ta có thể rút hệ số rẽ nhánh (branching factor) từ xuống một giá trị thấp hơn nào đó, và hiển nhiên chi phí thời gian sẽ được rút xuống rất nhiều.

Kĩ thuật heuristic được ứng dụng nhiều trong trí tuệ nhân tạo (Artificial Intelligence - AI) nhưng ta cũng thấy với cơ chế như trên nó cũng giúp nâng cao hiệu quả các thuật toán giải các bài toán tối ưu hóa thuộc lớp NP-khó. (adsbygoogle = window.adsbygoogle || []).push({});

~ 40 ~

1.3.4. Phƣơng pháp tính toán tiến hóa

Trong phương pháp này dựa trên ý tưởng của các quá trình tiến hóa trong tự nhiên. Ý tưởng cơ bản ẩn chứa trong tính toán tiến hóa mà có liên quan đến sức mạnh của quá trình tiến hóa trong tự nhiên đó là cách giải quyết vấn đề theo kiểu : - thử và sai. Giả sử xem xét một quá tình tiến hóa trong tự nhiên đơn giản như sau. Cho một môi trường gồm một quần thể của các cá thể đang đấu tranh để tồn tại và phát triển. Sự thích nghi của mỗi cá thể này - được quyết định bởi môi trường – liên quan đến mức độ thành công trong việc đạt được mục đích của chúng. Trong ngữ cảnh của kiểu giải quyết vấn đề bằng cách thử và sai ngẫu nhiên (còn được biết đến là tạo ra và thử), chúng ta có một tập các giải pháp kiểm tra. Chất lượng của cá thể quyết định khả năng chúng sẽ được giữ lại và được sử dụng như là nhân để sinh ra các giải pháp để kiểm tra tiếp theo.

Bảng 1-1 Mối tương quan giữa quá trình tiến hóa và tính toán tiến hóa

Quá trình tiến hóa Giải quyết vấn đề

Môi trường Bài toán

Cá thể Giải pháp kiểm tra

Mức độ thích nghi Chất lượng

Tính toán tiến hóa được chia ra làm 4 nhánh chính gồm :  Lập trình tiến hóa

 Chiến lược tiến hóa  Giải thuật di truyền  Lập trình di truyền

Tính toán tiến hóa liên quan đến hầu hết các giải thuật meta-heuristic như là :

 Thuật toán tiến hóa (bao gồm giải thuật di truyền, lập trình tiến hóa, chiến lược tiến hóa và lập trình di truyền)

~ 41 ~

 Thông minh bầy đàn (bao gồm tối ưu quần thể kiến và tối ưu hóa bầy đàn) Hiện tại thì tính toán tiến hóa đang là một trong những hướng nghiên cứu chính có nhiều tiềm năng để giải các bài toán NP khó cũng như là các bài toán tối ưu tổ hợp phức tạp khác. Luận văn này sẽ khi khai thác hướng tiếp cận dùng phương pháp tính toán tiến hóa để giải bài toán cây khung truyền thông tối ưu.

1.4. Lý thuyết đồ thị

Trong toán học, lý thuyết đồ thị là một lĩnh vực đã xuất hiện từ lâu và có rất nhiều ứng dụng trong thực tế. 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ỹ Leonhard Euler.

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

Hình 1-15 Đồ thị vô hướng và đồ thị có hướng

Đồ thị là một cấu trúc rời rạc 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ểusố lượng cạnh nối các đỉnh này. Ta định nghĩa một số loại đồ thị như sau.

Đơn đồ thị vô hƣớngG = (V, E) bao gồm V là tập không rỗng chứa 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ạnh.

Đơn đồ thị có hƣớng G = (V, E) bao gồm tập các đỉnh V và tập các cạnh E là các cặp có thứ tự gồm hai phần tử khác nhau cảu V. Các cạnh của đồ thị có hướng còn được gọi là các cung.

Để mô hình các bài toán trong thực tế, chúng ta còn sử dụng các khái niệm đa đồ thị và giả đồ thị. Các giả đồ thị có tập cạnh là tập các cặp đỉnh không nhất thiết khác

~ 42 ~

nhau. Cạnh có hai đầu mút là cùng một đỉnh được gọi là khuyên. Đa đồ thị là đồ thị có thể có nhiều hơn một cạnh có cùng hai đầu mút. Những cạnh này gọi là cạnh lặp. Để tiện sử dụng, chúng ta sẽ gọi đồ thị vô hướng thay cho đơn đồ thị vô hướng mà không có chú thích gì thêm.

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

Phần này trình bày các thuật ngữ nhằm mô tả tính chất của các cạnh và đỉnh trong đồ thị vô hướng.

 Hai đỉnh u, v của đồ thị vô hướng G gọi là hai đỉnh kề (nhau) nếu e = (u, v)

là một cạnh của G. Khi đó e là cạnh liên thuộc, hay cạnh nối của hai đỉnh u, (adsbygoogle = window.adsbygoogle || []).push({});

v. Hai đỉnh u, v gọi là đầu mút của cạnh e. Định nghĩa này cũng dùng cho đồ thị có hướng.

 Bậc của một đỉnh trong đồ thị vô hướng là số cạnh liên thuộc với nó.

 Ký hiệu bậc của đỉnh v là deg(v). Xét Hình 1.5a, ta có deg(1) = 2, deg(2) = 4 và deg(4) = 3.

 Đối với đồ thị có hướng, có khái niệm bán bậc vào và bán bậc ra. Bán bậc vào (bán bậc ra) của một đỉnh thuộc đồ thị có hướng là số cung của đồ thị đi vào đỉnh đó (đi ra đỉnh đó). Bán bậc vào của đỉnh v ký hiệu là deg–(v), bán bậc ra ký hiệu là deg+(v). Quay lại Hình 1.5b, ta có deg+(1) = 2, deg–(1) = 0, với đỉnh 2 thì deg+(2) = 1, deg–(2) = 2.

Đƣờng đi và tính liên thông

Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dương trên đồ thị vô hướng G = (V, E) là dãy x0, x1, … xn-1, xn trong đó u = x0, v = xn, (xi, xi+1) E, i = 1..n. Đỉnh u được gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh đầu trùng với đỉnh cuối được gọi là chu trình. Chu trình được gọi là đơn nếu như không có cạnh nào bị lặp lại.

Để xác định xem có luôn tồn tại đường đi giữa các cặp đỉnh trong đồ thị, chúng ta đưa ra khái niệm tính liên thông.

Đồ thị vô hướng G = (V, E) được gọi là liên thông nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó.

~ 43 ~

Đồ thị có hướng G = (V, E) được gọi là liên thông mạnh nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của nó. Đồ thị có hướng G = (V, E) được gọi là liên thông yếu nếu đồ thị vô hướng tương ứng với nó là liên thông.

1.4.3. Cách biểu diễn đồ thị trên máy tính

Trước khi đi vào tìm hiểu các thuật toán trên đồ thị, chúng ta cùng xem xét các phương pháp biểu diễn đồ thị trên máy tính. Thực chất, các thuật toán về đồ thị được cài đặt thế nào phụ thuộc quyết định vào cách biểu diễn đồ thị.

Biểu diễn bằng ma trận kề

Cho đồ thị G = (V, E) có n đỉnh, các đỉnh được đánh số 1, 2, … n theo thứ tự tùy ý. Khi đó ma trận kề biểu diễn đồ thị G là một ma trận vuông cấp n A = (aij) với các phần tử được xác định theo quy tắc, aij là phần tử dòng i, cột j

{

Đối với đồ thị có trọng số, mỗi phần tử của ma trận kề sẽ biểu diễn trọng số của cạnh tương ứng. Tuy nhiên, ta cần chú ý về việc chon giá trị đặc biệt biểu diễn một phần tử của ma trận không là cạnh của đồ thị.

{

ở đây là trọng số của cạnh nối 2 đỉnh , , và NA là giá trị đặc biệt để chỉ ra giữa

i, j không tồn tại cạnh nối. Ví dụ, đối với đồ thị chỉ có trọng số dương, NA có thể chọn bằng 0.

Ta dễ dàng chỉ ra các tính chất sau của ma trận kề:

 Ma trận kề của đồ thị vô hướng là ma trận đối xứng, aij = aji.

 Lưu trữ ma trận kề đòi hỏi bộ nhớ (V2), độc lập với số cạnh của đồ thị.  Các thao tác trên phần tử của ma trận chiếm thời gian đơn vị.

~ 44 ~

Như vậy, ma trận kề có ưu điểm lớn nhất là các thao tác xử lý trên cạnh nhanh. Nhưng nó đòi hỏi bộ nhớ lớn đối với đồ thị thưa, phải lưu nhiều phần tử không phải cạnh của đồ thị.

Biểu diễn bằng danh sách kề

Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị, chúng ta lưu trữ danh sách các đỉnh kề với nó. Ký hiệu adj(v) là danh sách các đỉnh kề với v.

adj( ) {vu V v u, ( , ) E}.

Danh sách kề có thể được biến đổi để biểu diễn đồ thị có trọng số. Khi đó adj( ) {( ,vu cvu),u V v u, ( , ) E c, vuc v u( , )}.

Danh sách kề có các tính chất sau đáng quan tâm:

 Đối với đồ thị có hướng, tổng số phần tử phải lưu trong các danh sách kề là |E|, với đồ thị vô hướng, giá trị này là 2|E|. Cho cả đồ thị có hướng và vô (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Nghiên cứu ảnh hưởng của chất liệu sợi dệt và quá trình nhuộm tới khả năng ngăn ngừa tia uv của vải (Trang 37)