Ví dụ 1: Bài toán thỏa CNF
Bài toán thỏa mãn dạng chuẩn hội (Conjunctive normal form – CNF) là một bài toán đơn giản: Một biểu thức của các mệnh đề (clause) ở dạng chuẩn hội hay CNF khi nó là một dãy các biến mệnh đề được kết nối với nhau bởi toán tử quan hệ and (∧). Mỗi mệnh đề có dạng là một tuyển (disjunction), gồm các toán tử quan hệ or (∨) trên các biến mệnh đề (literal).
Ví dụ : Nếu ta có 6 biến mệnh đề a, b, c, d, e và f, thì biểu thức sau đây là một CNF:
(1-3)
Thỏa mãn CNF có nghĩa rằng chúng ta phải tìm ra một phép gán true hoặc false (1 hoặc 0) cho mỗi biến mệnh đề a, b, c, d, e, f sao cho biểu thức CNF có giá trị là TRUE.
Một cách biểu diễn tự nhiên cho lời giải của bài toán này là một dãy sáu bit, mỗi bit theo thứ tự a, b, c, d, e, f biểu diễn true (1) hoặc false (0) cho mỗi biến mệnh đề. Như vậy mẫu bit:
1 0 1 0 1 0
cho biết a, c, và e là true và b, d, và f là false, và do đó khi thay các giá trị này vào biểu thức (1-3), thì cho giá trị false.
Chúng ta muốn rằng các toán tử di truyền sinh ra các thế hệ lời giải sao cho biểu thức CNF mang trị true, vì vậy mỗi toán tử phải sinh ra một mẫu 6-bit của phép gán true cho biểu thức. Cách biểu diễn lời giải dưới dạng một mẫu các bit như trên mang lại cho ta rất một điều rất thuận lợi là bất kỳ toán tử di truyền nào (lai ghép, đột biến, đảo ngược, hay trao đổi) đều tạo ra một mẫu bit mới là một lời giải khả dĩ hợp lệ.
Việc chọn lựa một hàm thích nghi cho quần thể các chuỗi bit này không phải hoàn toàn dễ dàng. Thoạt nhìn chuỗi bit, ta khó có thể xác định một hàm thích nghi để đánh giá được chất lượng của nó như thế nào, nghĩa là khó đoán được độ tốt của nó so với đáp án đúng. Đáp án đúng ở đây chính là chuỗi bit sao cho biểu thức CNF có giá trị true.
Tuy nhiên có một số cách khác. Nếu ta chú ý đến biểu thức CNF (1-3), thì ta thấy rằng nó được tạo thành từ hội của 5 mệnh đề. Do đó chúng ta có thể thiết lập một hệ phân hạng cho phép chúng ta sắp hạng các lời giải (mẫu bit) tiềm năng trong khoảng giá trị từ 0 đến 5, tùy thuộc vào số mệnh đề mà mẫu đó thỏa mãn. Do đó mẫu:
1 1 0 0 1 0 có độ thích nghi là 1
0 1 0 0 1 0 có độ thích nghi là 2
0 1 0 0 1 1 có độ thích nghi là 3
1 0 1 0 1 1 có độ thích nghi là 5, và nó chính là một lời giải.
Ví dụ 2: Bài toán người đi bán hàng TSP
Bài toán người bán hàng (traveling salesperson problem – TSP) là một bài toán cổ điển đối với AI và khoa học máy tính
Phát biểu của bài toán TSP: Một người bán hàng có nhiệm vụ ghé thăm N thành phố như là một phần của lộ trình bán hàng. Đường đi giữa mỗi cặp thành phố có một chi phí (ví dụ như độ dài đoạn đường, giá vé máy bay). Hãy tìm ra đường đi có chi phí thấp nhất cho người bán hàng để bắt đầu lên đường tại một thành phố, thăm tất cả các thành phố khác chỉ đúng một lần rồi quay lại thành phố xuất phát.
. Như chúng đã giới thiệu ở chương III, toàn bộ không gian trạng thái của nó đòi hỏi phải xem xét N! trạng thái để có thể tìm ra lời giải tối ưu, trong đó N là số thành phố cần đi qua. Khi N khá lớn thì bài toán sẽ bị bùng nổ tổ hợp, vì vậy người ta đặt vấn đề là có cần thiết hay không cho việc chạy một máy trạm làm việc đắt tiền trong nhiều giờ để cho một lời giải tối ưu hay chỉ nên chạy một PC rẻ tiền trong vài phút để có được những kết quả “đủ tốt”. Giải thuật di truyền chính là một giải pháp cho lựa chọn thứ hai.
Ở bài toán này, dùng mẫu bit để biểu diễn cho lời giải của bài toán không phải là một cách hay. Chẳng hạn, ta có chín thành phố cần ghé thăm 1, 2, …9, ta xem mỗi thành phố như một mẫu 4 bit 0001, 0010,… 1001. Khi đó một lời giải khả dĩ sẽ có hình thức như sau:
0001 0010 0011 0100 0101 0110 0111 1000 1001
Với cách biểu diễn như vậy, việc thiết kế các toán tử di truyền sẽ trở nên rất khó khăn. Toán tử lai ghép nhất định là không được, vì chuỗi mới được tạo từ hai cha mẹ khác nhau hầu như sẽ không biểu diễn một đường đi trong đó ghé thăm mỗi thành phố đúng một lần. Trong thực tế, với lai ghép, một số thành phố có thể bị xóa bỏ trong khi các thành phố khác được ghé thăm nhiều hơn một lần, và vì vậy đó không phải là một lời giải hợp lệ. Còn toán tử đột biến thì thế nào? Giả sử bit trái nhất của thành phố thứ sáu, 0110, được đột biến thành 1? 1110, hay là 14, thì nó không còn là một thành phố hợp lệ.
Một cách tiếp cận khác là sẽ bỏ qua biểu diễn dạng mẫu bit và đặt cho mỗi thành phố một tên theo bảng chữ cái hoặc số, ví dụ 1, 2, …9; xem đường đi qua các thành phố là một sự sắp thứ tự của chín ký số này, và sau đó chọn toán tử di truyền thích hợp để tạo ra các đường đi mới. Ở đây ta thấy phép trao đổi (exchange) ngẫu nhiên hai thành phố trong đường đi có thể sử dụng được, còn phép toán lai ghép (crossover) thì không. Việc trao đổi các đoạn của một đường đi với những đoạn khác của cùng đường đi đó, hoặc bất cứ toán tử nào sắp xếp lại các chữ cái của đường đi ấy (mà không xóa bỏ, thêm, hay nhân đôi bất cứ thành phố nào) đều có thể sử dụng được. Tuy nhiên, những phương pháp này gây khó khăn cho việc đưa vào thế hệ con cháu những thành phần “tốt hơn” của các mẫu trong các đường đi qua của các thành phố của hai cha mẹ khác nhau.
Nhiều nhà nghiên cứu đã đưa ra các toán tử lai ghép có khả năng khắc phục những vấn đề này, trong đó có toán tử lai ghép có thứ tự (order crossover) do Davis đưa ra vào năm 1985. Lai ghép có thứ tự xây dựng con cháu bằng cách chọn một dãy con các thành phố trong đường đi của một mẫu cha mẹ. Nó cũng bảo toàn thứ tự tương đối các thành phố từ cha mẹ kia. Đầu tiên, chọn hai điểm cắt, biểu thị bởi dấu “|”, điểm cắt này được chen vào một cách ngẫu nhiên vào cùng một vị trí của mỗi mẫu cha mẹ. Những điểm cắt này là ngẫu nhiên, nhưng một khi được chọn, thì những vị trí như nhau sẽ được sử dụng cho cả hai cha mẹ. Ví dụ, có hai mẫu cho mẹ p1 và p2, với các điểm cắt sau thành phố thứ ba và thứ bảy:
p1 = (1 9 2 | 4 6 5 7 | 8 3)
p2 = (4 5 9 | 1 8 7 6 | 2 3)
Hai mẫu con c1 và c2 sẽ được sinh ra theo cách sau. Đầu tiên, các đoạn giữa hai điểm cắt sẽ được chép vào các mẫu con:
c1 = (x x x | 4 6 5 7 | x x)
c2 = (x x x | 1 8 7 6 | x x)
Bước kế tiếp là bắt đầu từ điểm cắt thứ hai của một trong hai mẫu cha mẹ, nếu ta đang muốn hoàn tất mẫu c1, thì ta sẽ bắt đầu từ điểm cắt thứ hai của mẫu p2, ta chép các thành phố từ điểm cắt này theo thứ tự vào các chỗ còn trống của c1, bỏ qua những thành phố mà c1 đã có (các ký số được in đậm và nghiêng trong sơ đồ bên dưới). Khi đến cuối mẫu p2, thì quay lại đầu mẫu p2 tiếp tục chép sang c1 cho đến khi c1 đủ.
Với giải thuật lai ghép này, các đường đi của thế hệ con sẽ được đảm bảo là các đường đi hợp lệ, đi qua mỗi thành phố một lần duy nhất.
Tóm lại, trong lai ghép thứ tự, các mảnh của một đường đi được truyền từ một cha mẹ, p1, sang một con, c1, trong khi sắp xếp của các thành phố còn lại của con c1 được thừa kế từ cha mẹ kia, p2. Điều này ủng hộ cho trực giác hiển nhiên là thứ tự của các thành phố đóng vai trò quan trọng trong việc tạo ra đường đi với chi phí thấp nhất, và vì vậy việc truyền lại các đoạn thông tin có thứ tự này từ các cha mẹ có độ thích nghi cao sang con cái là một điều rất quan trọng.
Ngoài toán tử lai ghép thứ tự trên, còn có rất nhiều toán tử lai ghép và đột biến khác được đưa ra để giải quyết bài toán này. Bảng 9.5 liệt kê các toán tử lai ghép, bảng 9.6 liệt kê các toán tử đột biến.
Năm Tác giả
Alternating Position Crossover (AP) (1999) Larranaga, Kuijpers, Poza, Murga
Cycle Crossover (CX) (1987) Oliver, Smith and Holland
Distance Preserving Crossover (DPX) (1996) Freisbein and Merz
Edge Assembly Crossover (EAX) (1997) Nagata and Kobayashi
Edge Recombination Crossover (ER) (1989) Whitley, Timothy, Fuquay
Heuristic Crossover (HEU) (1987) Grefenstette
Inver-over Operator (IOO) (1998) Tao and Michalewicz
Maximal Preservative Crossover (MPX) (1988) Mühlenbein, Schleuter and Krämer
Position Based Crossover (POS) (1991) Syswerda
Order Crossover (OX1) (1985) Davis
Order Based Crossover (OX2) (1991) Syswerda
Partially mapped Crossover (PMX) (1985) Goldberg and Lingle
Voting Recombination Crossover (VR) (1989) Mühlenbein
Bảng 9.5 - Danh sách các toán tử lai ghép cho bài toán TSP.
Bảng 9.6 - Danh sách các toán tử đột biến cho bài toán TSP.
Đánh giá giải thuật
Các ví dụ vừa nêu trên làm nổi bật những vấn đề mang tính duy nhất của thuật toán di truyền về biểu diễn tri thức, chọn toán tử di truyền, và thiết kế hàm thích nghi. Biểu diễn được chọn phải hỗ trợ cho các toán tử di truyền. Một điểm dáng lưu ý nữa là các toán tử di truyền phải được thiết kế sao cho bảo lưu được những mảnh thông tin có ý nghĩa trong lời giải tiềm năng từ thế hệ này sang các thế hệ tiếp theo.
Một sức mạnh quan trọng của thuật toán di truyền là bản chất song song trong tìm kiếm của nó. Các thuật toán này thực hiện một dạng mạnh của leo núi (hill climbing) trong đó duy trì nhiều lời giải (trong quần thể các lời giải), loại bỏ những lời giải không có triển vọng, và nâng cao chất lượng của những lời giải tốt. Hình 9.19 phỏng theo Holland (1986), cho thấy nhiều lời giải hội tụ về các điểm tối ưu trong không gian tìm kiếm. Trong hình này, trục hoành biểu diễn các điểm có thể có trong không gian lời giải, trong khi trục tung phản ánh chất lượng của những lời giải đó. Các điểm chấm nằm trên cung là các thành viên của quần thể hiện tại. Khởi đầu, những lời giải được rải trong không gian những lời giải có thể có. Sau một vài thế hệ, chúng có khuynh hướng cụm lại xung quanh những vùng có chất lượng lời giải cao hơn.
Hình 9.19- Các thuật toán di truyền được xem là leo núi song song (theo Holland 1986)Tuy nhiên, với sức mạnh như vậy, giải thuật genetic cũng không thể áp dụng cho tất cả các bài toán có thể có. Vì như ta thấy qua hai ví dụ trên, lời giải của bài toán phải được biểu diễn dưới một dạng mẫu thích hợp cho các toán tử di truyền hoạt động. Trong thực tế có nhiều bài toán không thể làm được điều này. Vì vậy, khi nghiên cứu về giải thuật này, có rất nhiều câu hỏi đã được đưa ra nhằm hiểu rõ hơn nữa về bản chất hoạt động của nó:
- Liệu chúng ta có thể đưa ra những đặc điểm về các loại bài toán mà giải thuật di truyền (GA) có thể thực hiện tốt
- Các loại bài toán nào thì không thích hợp với GA.
- Dựa vào đâu để ta có thể nói là GA thực hiện tốt hay không tốt đối với một loại bài toán nào đó?
- Liệu có những qui luật nào mô tả hành vi của GA ở mức vĩ mô? Hay cụ thể hơn, là liệu có bất kỳ sự phán đoán nào về sự thay đổi của độ thích nghi c 911;a các nhóm con trong quần thể theo thời gian?
- Có cách nào để mô tả các hiệu ứng khác nhau của các toán tử di truyền như lai ghép, đột biến, đảo ngược, v.v…
- Trong những trường hợp nào (bài toán nào, toán tử di truyền nào) thì GA sẽ thực hiện tốt hơn các phương pháp nghiên cứu của TTNT truyền thống.
Những câu hỏi này (và còn nhiều hơn nữa) vẫn đã và đang được các nhà khoa học như Holland, Mitchell, Golderg,… nghiên cứu.
Bài tập chương IX
Cho một tập hợp các ví dụ rèn luyện như sau:
An muốn áp dụng giải thuật ID3 để xây dựng cây quyết định với tập dữ liệu rèn luyện trên. Áp dụng các công thức tính entropy và gain, hãy giúp An xác định thuộc tính nào (A1, A2, hay A3) là thuộc tính tốt nhất để hỏi đầu tiên nhằm tạo ra một cây quyết định đơn giản nhất. (Lưu ý: phải trình bày các tính toán entropy và gain để đi đến kết luận).
Ứng dụng giải thuật di truyền để tìm giá trị của các biến x, y, z sao cho hàm f(x,y,z) = ysin(zcos(x)) – xcos(zsin(y)) đạt giá trị lớn nhất. Biết rằng 0 < x < 10, 0< y < 10, 0 .
Cho một tập hợp gồm 10 ví dụ rèn luyện như sau:
Tập dữ liệu trên thể hiện quyết định sẽ chờ bàn hay không của một người khi bước vào một nhà hàng đông khách không còn bàn trống. Quyết định của anh ta sẽ phụ thuộc vào một số yếu tố như hôm đó có phải là ngày cuối tuần không (cuối-tuần) – A1, anh ta có đang đói không (đang-đói 21b0 ) – A2, thời gian chờ bàn (TG-chờ) – A3: dưới 10 phút (0-10), từ 10 đến 30 phút (10-30) hay trên 30 phút (>30).
Áp dụng các công thức tính entropy và gain, để xác định thuộc tính tốt nhất để hỏi kế tiếp nhằm tạo ra một cây quyết định đơn giản nhất theo giải thuật ID3. Trình bày các tính toán entropy và gain ở mỗi bước.