Năm 1954, GP bắt đầu với giải thuật tiến hóa, nó được sử dụng lần đầu tiên bởi Nils Aall Barricelli trong việc mô phỏng quá trình tiến hóa.
Vào những năm 1960 và nửa đầu những năm 1970 giải thuật tiến hóa (EA) được biết đến như là các phương pháp tối ưu hóa. I. Rechenberg và nhóm của ông ấy đã giải quyết được nhiều vấn đề phức tạp trong ngành công nghệ bằng chiến lược tiến hóa (Evolution strategies). Ôngđã giới thiệu ý tưởng về lập trình tiến hóa trong tác phẩm "Evolution strategies" (Evolutionsstrategie in original). Sau đó các nhà nghiên cứu khác tiếp tục phát triển ý tưởng này của ông. Năm 1971 ông làm luận án tiến sỹ về evolution strategies và năm 1973 ông xuất bản thành sách.
Trong những năm 1970 Jonh Holland có những ảnh hưởng rất lớn trong quá trình phát triển của giải thuật di truyền. Giải thuật di truyền (GA) được Holland phát minh và sau
đó ông cùng các sinh viên và cộng sự của mình phát triển tiếp. Các kết quả này được giới thiệu trong cuốn sách "Adaption in Natural and Artificial Systems" xuất bản vào năm 1975 của ông.
Vào năm 1992, John Koza đã sử dụng giải thuật di truyền để thực hiện một vài nhiệm vụ trong chương trình tiến hóa. Ông đã gọi phương pháp này là Lập trình tiến hóa ("genetic programming" (GP))[7].
2.3. Các bƣớc áp dụng giải thuật di truyền
2.3.1. Mã hóa dữ liệu
Hay còn gọi là biểu diễn di truyền cho lời giải của bài toán: Đây là bước đầu tiên và rất quan trọng đối với việc tìm ra lời giải của bài toán. Mỗi lời giải của bài toán được biểu diễn dưới dạng một chuỗi ký tự hữu hạn hay còn được gọi là một nhiễm sắc thể. Các ký tự có thể là số nhị phân, số thập phân, … tùy vào từng bài toán cụ thể. Trong quá trình này, việc mã hóa cái gì, mã hóa như thế nào, trật tự các thành phần trong nhiễm sắc thể ra sao,… luôn là những thách thức cho những người giải bài toán.
Nhiễm sắc thể 1 1101100100110110 Nhiễm sắc thể 2 1101111000011110
Hình 2.1 Ví dụ về mã hóa nhiễm sắc thể Có các dạng mã hóa dữ liệu như sau:
- Mã hóa nhị phân (Binary encoding): Mã hóa này là dạng mã hóa thông dụng nhất. Các chương trình GA đầu tiên sử dụng kiểu mã hóa này.Các nhiễm sắc thể được biểu diễn bằng chuỗi các bit dữ liệu bao gồm 0 và 1.
Nhiễm sắc thể A 101100101100101011100101 Nhiễm sắc thể B 111111100000110000011111
Hình 2.2Ví dụ về mã hóa nhị phân
Mã hóa nhị phân được dùng trong bài toán xếp ba lô.Bài toán xếp ba lô (một số sách ghi là bài toán cái túi) là một bài toán tối ưu hóa tổ hợp. Bài toán được đặt tên từ vấn đề chọn những gì quan trọng có thể nhét vừa vào trong một cái túi (với giới hạn khối lượng) để mang theo trong một chuyến đi. Các bài toán tương tự thường xuất hiện trong kinh doanh, toán tổ hợp, lý thuyết độ phức tạp tính toán, mật mã học và toán ứng dụng.
- Mã hóa hoán vị (Permutation encoding): Mã hóa này được sử dụng trong các bài toán xắp xếp, ví dụ các bài toán người giao hàng (travelling salesman), bài toán xắp xếp các nhiệm vụ. Ở mã hóa này các nhiễm sắc thể là chuỗi các số liên tiếp nhau. Kiểu mã hóa này được học viên quan tâm và nghiên cứu kỹ lưỡng vì nó phù hợp với bài toán lập lịch. Ở bài toàn lập lịch ta sẽ hoán đổi vị trí thực
hiện các công việc để tìm ra được cách hoán đổi tối ưu nhất, tức là cách hoán đổi làm cho thời gian thực hiện công việc ít nhất.
Nhiễm sắc thể A 1 5 3 2 6 4 7 9 8 Nhiễm sắc thể B 8 5 6 7 2 3 1 4 9
Hình 2.3Ví dụ về mã hóa hoán vị
- Mã hóa giá trị (value encoding):
Nhiễm sắc thể A 1.2324 5.3243 0.4556 2.3293 2.4545 Nhiễm sắc thể B ABDJEIFJDHDIERJFDLDFLFEGT Nhiễm sắc thể C (back), (back), (right), (forward), (left)
Hình 2.4 Ví dụ về mã hóa giá trị
- Mã hóa cây
- Nhiễm sắc thể A Nhiễm sắc thể B
( + x ( / 5 y ) ) ( do_until step wall )
Hình 2.5 Ví dụ về mã hóa cây
2.3.2. Khởi tạo quần thể
Xây dựng tập hợp nghiệm ban đầu (tập hợp các cá thể) có thể ngẫu nhiên hoặc không ngẫu nhiên. Có nhiều cách để khởi tạo giá trị quần thể nghiệm ban đầu, tùy từng bài toán mà ta lựa chọn phương pháp phù hợp. Thông thường, hệ nghiệm ban đầu được chọn ngẫu nhiên trong không gian tìm kiếm. Tuy vậy, việc chọn này cũng cần phải xem xét về tương quan giữa độ thích nghi của các nhiễm sắc thể để tránh tình trạng nghiệm tìm ra là nghiệm tối ưu cục bộ hay còn gọi là cực trị địa phương. Còn vấn đề số lượng nghiệm của tập nghiệm hay qui mô của quần thể cũng cần được xem xét kỹ dựa vào độ phức tạp của bài toán, độ chính xác yêu cầu (cao hay thấp) và thời gian tính toán yêu cầu (nhanh hay chậm).
2.3.3. Xác định hàm thích nghi
Hay hàm lượng giá cho mỗi nhiễm sắc thể hay chính là cho các phương án nghiệm trong tập nghiệm. Hàm này dùng để đánh giá độ thích nghi của các nhiễm sắc thể. Hàm thích nghi cần phải đánh giá được mức độ thích nghi cho tất cả các nghiệm khả
+ x / y 5 do_util wall step
thi và luôn được giả định là không âm để hiện độ thích nghi của các cá thể. Công thức biểu diễn hàm cần phải thể hiện được tất cả các đặc tính mong muốn của nhiễm sắc thể, thông qua đó có thể chọn lọc được các quần thể nghiệm tốt nhất cho bài toán.
2.3.4. Quá trình lai ghép
Đây là quá trình nhiễm sắc thể mới được hình thành dựa trên nhiễm sắc thể cha-mẹ bằng cách lai ghép một hay nhiều đoạn nhiễm sắc thể cha mẹ với nhau.Lai ghép có xét tới các đặc tính trội và lặn trong tự nhiên. Các đặc tính này được quy định trước trong khi biểu diễn cấu trúc nhiễm sắc thể. Bằng việc xem xét tới các đặc tính trội-lặn, quá trình sản sinh ra các "quần thể chất lượng tốt" sẽ nhanh hơn và do đó thời gian tính toán cũng được rút ngắn. Phép lai ghép xảy ra với xác suất là p1 có thể được mô phỏng như sau:
- Chọn hai (hay nhiều) cá thể bất kỳ trong quần thể. Quần thể ở đây bao gồm các nhiễm sắc thể (cha-mẹ) có độ dài bằng nhau.
- Chọn điểm lai là một điểm có vị trí bất kỳ (như nhau) trên nhiễm sắc thể cha- mẹ và thực hiện hoán đổi các đoạn gen của nhiễm sắc thể cha-mẹ tại điểm lai này.
- Đưa hai cá thể này vào quần thể để thực hiện vào các quá trình tiến hóa tiếp theo
Nhiễm sắc thể cha-mẹ:
0 1 1 1 0 1 0 0 0 1 1 0 0
Điểm lai ghép
1 0 1 0 0 1 0 1 1 0 0 1 1
Hai nhiễm sắc thể con được sinh ra sau quá trình lai ghép:
0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0
Hình 2.6Lai ghép giữa hai cá thể
Chromosome 1 11011 | 00100110110 Chromosome 2 11011 | 11000011110 Offspring 1 11011 | 11000011110 Offspring 2 11011 | 00100110110
Trong quá trình tồn tại và phát triển, thuật toán di truyền đã được bổ sung rất nhiều các phương pháp lai ghép để nhằm thích ứng với nhiều kiểu bài toán và cũng là để tăng hiệu quả của thuật toán. Có thể kể một số phép lai cải tiến như sau:
- Lai ghép từng phần: Việc giữ lại những đoạn mã đã "tối ưu" trong nhiễm sắc thể cũng là một cách để quá trình lai ghép trở nên hiệu quả hơn.
- Lai ghép có trật tự - Lai ghép dựa trên vị trí - Lai ghép chu trình
- Lai ghép thứ tự tuyến tính
- Lai ghép đa điểm: Với phương pháp này, chúng ta có thể cho 2 cá thể lai ghép ở 2 hay nhiều điểm lai ghép. Phương thức này làm cho thuật toán trở nên linh hoạt hơn, nhờ đó các thế hệ cá thể con cũng sẽ có chất lượng tốt hơn.
2.3.5. Quá trình đột biến
Là quá trình cá thể con mang một hay một số tính trạng không có trong mã di truyền của cha-mẹ. Quá trình này xảy ra với xác suất p2 (nhỏ hơn nhiều so với p1) có thể được mô tả như sau:
- Chọn ngẫu nhiên một cá thể bất kỳ trong quần thể.
- Chọn một gen bất kỳ của cá thể vừa chọn.
- Thay đổi giá trị gen đó (đối với cách mã hóa gen theo số nhị phân thì quá trình thay đổi giá trị là đổi giá trị từ 0 thành 1 hoặc từ 1 thành 0) rồi trả về quần thể để thực hiện các quá trình tiếp theo.
Nhiễm sắc thể trước đột biến:
0 1 1 1 0 1 0 0 0 1 1 0 0 Điểm tạo đột biến
Nhiễm sắc thể sau đột biến:
0 1 1 0 0 1 0 0 0 1 1 0 0
Nhiễm sắc thể gốc 1 1101111000011110 Nhiễm sắc thể gốc 2 1101100100110110 Đột biến nhiễm sắc thể 1 1100111000011110 Đột biến nhiễm sắc thể 2 1101101100110110
Hình 2.9Đột biến một nhiễm sắc thể tại một điểm và hai điểm
Tương tự như quá trình lai ghép, trong quá trình phát triển của thuật toán di truyền cũng đã được bổ sung rất nhiều cách thức để thực hiện quá trình gây đột biến ngày càng hiệu quả hơn:
- Đột biến đảo ngược (Inversion Mutation)
- Đột biến chèn (Insertion Mutation)
- Đột biến thay thế (Raplacement Mutation)
- Đột biến tương hỗ (Reciprocal Exchange Mutation)
- Đột biến dịch chuyển (Shift Mutation)
2.3.6. Quá trình chọn lọc
Quá trình mà các cá thể mới sinh ra được giữ lại hay bị loại bỏ khỏi quần thể dựa vào độ thích nghi của chúng. Độ thích nghi ở đây thường là một hàm gán một giá trị thực cho các cá thể trong quần thể. Đối với quá trình này có rất nhiều cách để xác định trình tự tính toán và thực hiện tùy vào cách lựa chọn độ thích nghi của cá thể nói riêng và của cả quần thể nói chung. Có các kiểu chọn lọc sau:
- Roulette wheel selection: Thế hệ cha mẹ được chọn lựa sang thế hệ tiếp theo dựa vào giá trị fitness của chúng.Với kiểu chọn này nhiễm sắc thể nào có giá trị finess lớn sẽ được chọn nhiều lần. Thuật toán như sau:
o Bước 1: Tính tổng S các giá trị fitness của toán bộ cá thể trong quần thể.
o Bước 2: Chọn một số ngẫu nhiên từ 0 đến s, giả sử là số r.
o Bước 3: Duyệt quần thể từ cá thể số 0 đến s, tính tổng fitness từ 0 đến s, khi mà s >= r thì dừng lại và chọn cá thể s.
o Lặp lại quá trình trên cho đến khi chọn xong quần thể mới.
- Rank selection: Với kiểu lựa chọn Roulette wheel selection thì có một vấn đề xảy ra lànếu như giá trị fitness giữa các cá thể quá khác biệt nhau, số lượng cá thể yếu sẽ ít được chọn, cá thể fitness lớn có thể sẽ chiếm gần như toàn bộ quần thể ở thế hệ tiếp theo, ảnh hưởng đến tính đa dạng cá thể trong quần thể. Kiểu chọn Rank selection sẽ khắc phục được điểm yếu của kiểu lựa chọn trên. Đầu tiên sẽ đánh giá quần thể và mọi cá thể sẽ nhận được giá trị fitness từ sự đánh giá này. Cá thể tồi nhất có fitness là 1, rồi là 2,… tốt nhất là N (số lượng cá thể trong quần thể). Tất cả các cá thể sẽ được chọn ngẫu nhiên sang thế hệ tiếp
theo. Nhưng kiểu lựa chọn này gần như có độ hội tụ kém nhất bởi vì cá thể tốt nhất khá khác biệt với cá cá thể khác.
- Elitism: Khi tạo quần thể mới bằng phương pháp lai tạo và đột biến, có thể chúng ta sẽ làm mất đi cá thể tốt nhất, để giải quyết vấn đề này phương pháp chọn lọc Elitism được sinh ra, Phương pháp này đâu tiên sẽ sao chép cá thể tốt nhất ( hay một vài cá thể tốt nhất) sang thế hệ tiếp theo. Áp dụng phương pháp này sẽ nhanh chóng tìm ra nghiệm (tăng tốc độ của thuật toán)
2.4. Các tham số của giải thuật di truyền
Các tham số của giải thuật di truyền như sau:
- Kích cỡ hệ nghiệm (pop-size): Số lượng cá thể phù hợp trong mỗi thế hệ.
- Xác suất lai tạo (pc): Xác suất để mỗi cá thể trong quần thể được tham gia quá trình lai ghép.
- Xác suất đột biến (pm): Xác suất để mỗi bit trong nhiễm sắc thể bị đột biến
- Xác suất sinh ngẫu nhiên một số cá thể mới và truyền vào thế hệ kế tiếp.
Thông thường, kích cỡ của quần thể phụ thuộc vào độ phức tạp của bài toán. Bài toán càng phức tạp, nhiều ràng buộc-đơn hoặc đa mục tiêu- thì số lượng cá thể trong mỗi thế hệ càng phải lớn. Hai thông số xác suất trong quá trình di truyền có khoảng giá trị rất khác nhau. Đối với xác suất lai tạo, giá trị thường rơi trong khoảng 0,5-0,95 nhưng giá trị thông thường của xác suất đột biến thấp hơn nhiều, chỉ ở khoảng 0,001-0,05. Điều này cũng phản ánh đúng xác suất xảy ra hai quá trình trong thực tế.
Từ một ví dụ trên đây có thể tính được một số ưu điểm của thuật toán di truyền như phương pháp này tìm từ một quần thể các điểm chứ không phải một điểm. Điều này làm cho việc giải các bài toán đa mục tiêu hay việc tìm một tập hợp các phương án lân cận nghiệm trở nên dễ dàng. Thêm vào đó, việc đánh giá thông tin bằng hàm mục tiêu chứ không dùng đạo hàm hay các tri thức bổ sung cũng là một ưu điểm của thuật toán.
2.5. Thuật toán giải thuật di truyền
Giải thuật di truyền được mô hình hóa theo các bước giống như lưu đồ dưới đây
Hình 2.10Sơ đồ quá trình tính toán của thuật toán di truyền Trong lưu đồ trên các bước được thực hiện lần lượt như sau:
Bước 1: Khởi tạo/lựa chọn các thông số cho quá trình tính toán. Bước này người lập
trình tính toán phải lựa chọn các thông số như: Số lượng cá thể trong quần thể, cách thức hóa bài toán cần tính toán dưới dạng các nhiễm sắc thể (độ dài của nhiễm sắc thể, kiểu số biểu diễn dữ liệu,…), số thế hệ tính toán, xác suất lai ghép, xác suất đột biến, hàm thích nghi,…
Khởi tạo, lựa chọn các thông số giải thuật di truyền
Khởi tạo ngẫu nhiên các cá thể cho quần thể ban đầu
Đánh giá các cá thể bằng hàm thích nghi
Thực hiện các phép toán di truyền: đột biến, lai tạo chéo trên các cá thể để tạo ra các cá thể mới
Tạo quần thể kế tiếp bằng quá trình chọn lọc
Đánh giá quấn thểmới
Kết thúc lưu kết quả tính toán Thỏa mãn
Bước 2: Khởi tạo quần thể ban đầu: xác định bằng phương pháp tạo số ngẫu nhiên để
tạo giá trị cho các nhiễm sắc thể cho quần thể ban đầu. Tùy vào cách biểu diễn của các nhiễm sắc thể mà ta chọn phương pháp tạo số ngẫu nhiên phù hợp.
Bước 3: Đánh giá các nhiễm sắc thể bằng hàm thích nghi đã xác định ở bước 1. Trong
bước này, ngoài việc đánh giá các nhiễm sắc thể riêng rẽ, chúng ta còn có thể đánh giá độ thích nghi của một nhiễm sắc thể hay cả quần thể. Nếu một nhóm hay cả quần thể có độ thích nghi "trung bình" (theo tiêu chí của từng trường hợp của người lập trình) thấp thì có thể loại nhóm nhiễm sắc thể hay quần thể đó ra khỏi quá trình di truyền.
Bước 4: Thực hiện quá trình di truyền thông qua các cơ chế lai ghép và đột biến. Có
thể thực hiện lần lượt hai quá trình này hoặc thực hiện đồng thời theo các phương pháp đã đề cập bên trên. Trong quá trình thực hiện thuật toán di truyền, giai đoạn này là giai đoạn mà mỗi người có thể thực hiện theo những phương pháp rất khác nhau. Giai đoạn này cũng là giai đoạn quyết định tới sự thành công của thuật toán. Người thực hiện cũng có thể đưa ra những phương thức tiến hành lai ghép hay đột biến mới trong giai đoạn này. Trong quá trình thực hiện, để có được một bộ các thông số lai ghép hay đột biến hiệu quả, người lập trình thường phải trải qua nhiều bước tính toán thử. Khâu này phụ thuộc nhiều vào kinh nghiệm và kỹ năng tính toán của người lập trình.
Bước 5: Tạo quần thể mới bằng quá trình chọn lọc. Quá trình này cũng dựa vào đánh
giá các nhiễm sắc thể thông qua hàm thích nghi. Cá thể nào có độ thích nghi cao sẽ