Thuật toán Di truyền (Genetic Algorithms)

by tudienkhoahoc

Thuật toán Di truyền (Genetic Algorithms – GA) là một lớp các thuật toán tối ưu hóa và tìm kiếm metaheuristic, lấy cảm hứng từ thuyết tiến hóa về chọn lọc tự nhiên của Charles Darwin. Nó thuộc nhóm lớn hơn của các thuật toán tiến hóa (Evolutionary Algorithms – EA) và được sử dụng rộng rãi để tìm kiếm lời giải tốt cho các bài toán mà không gian tìm kiếm quá lớn, phức tạp hoặc không có cấu trúc rõ ràng để áp dụng các phương pháp tối ưu hóa truyền thống.

Cốt lõi của Thuật toán Di truyền là mô phỏng quá trình tiến hóa của một quần thể. Thay vì xử lý một lời giải duy nhất tại một thời điểm, GA làm việc với một quần thể (population) gồm nhiều lời giải ứng viên. Mỗi lời giải, hay còn gọi là một cá thể (individual), được mã hóa dưới dạng một chuỗi dữ liệu tương tự như nhiễm sắc thể (chromosome) trong sinh học. Chất lượng của mỗi lời giải được đánh giá bằng một hàm thích nghi (fitness function).

Quá trình tiến hóa này được dẫn dắt bởi các toán tử di truyền, hoạt động lặp đi lặp lại qua nhiều thế hệ (generations). Các toán tử chính bao gồm: Chọn lọc (Selection), ưu tiên những cá thể có độ thích nghi cao hơn để tồn tại và sinh sản; Lai ghép (Crossover), kết hợp thông tin di truyền từ hai cá thể cha mẹ để tạo ra thế hệ con cái mới; và Đột biến (Mutation), đưa vào những thay đổi nhỏ, ngẫu nhiên để duy trì sự đa dạng trong quần thể và giúp thuật toán thoát khỏi các điểm tối ưu cục bộ. Qua mỗi thế hệ, quần thể sẽ dần hội tụ về các lời giải ngày càng tốt hơn cho bài toán.


Cơ chế hoạt động của Thuật toán Di truyền

Quy trình cốt lõi của một Thuật toán Di truyền mô phỏng một vòng lặp tiến hóa. Nó bắt đầu bằng việc tạo ra một quần thể các lời giải ngẫu nhiên, sau đó đánh giá chất lượng của từng lời giải. Dựa trên chất lượng này, thuật toán sẽ lựa chọn các cá thể tốt nhất để “sinh sản”, tạo ra thế hệ tiếp theo thông qua các toán tử lai ghép và đột biến. Vòng lặp này tiếp tục cho đến khi một điều kiện dừng được thỏa mãn.

Các bước cụ thể trong quy trình này bao gồm:

1. Khởi tạo (Initialization):
Bước đầu tiên là tạo ra một quần thể (population) ban đầu. Một quần thể là một tập hợp gồm $N$ cá thể (individuals), trong đó mỗi cá thể là một lời giải tiềm năng cho bài toán. Mỗi cá thể được mã hóa dưới dạng một nhiễm sắc thể (chromosome), thường là một chuỗi bit, chuỗi số nguyên, hoặc một cấu trúc dữ liệu phức tạp hơn tùy thuộc vào bản chất của bài toán. Việc khởi tạo thường được thực hiện một cách ngẫu nhiên để đảm bảo sự đa dạng ban đầu trong không gian tìm kiếm.

2. Đánh giá (Evaluation):
Sau khi có quần thể, mỗi cá thể sẽ được đánh giá để xác định mức độ “tốt” của nó. Việc này được thực hiện thông qua hàm thích nghi (fitness function). Hàm này nhận đầu vào là một cá thể và trả về một giá trị số, đại diện cho chất lượng của lời giải mà cá thể đó mã hóa. Đây là thành phần quan trọng nhất kết nối thuật toán với bài toán thực tế. Mục tiêu của GA là tối đa hóa (hoặc tối thiểu hóa) giá trị của hàm thích nghi này.

3. Vòng lặp Tiến hóa:
Đây là trái tim của thuật toán, nơi quần thể được cải thiện qua từng thế hệ (generation). Mỗi thế hệ bao gồm các bước sau:

  • Chọn lọc (Selection): Quá trình này lựa chọn các cá thể “cha mẹ” từ quần thể hiện tại để tạo ra thế hệ tiếp theo, dựa trên nguyên tắc “kẻ mạnh nhất sẽ tồn tại”. Những cá thể có độ thích nghi cao hơn sẽ có xác suất được chọn cao hơn. Các phương pháp chọn lọc phổ biến bao gồm:
    • Chọn lọc Bánh xe Roulette (Roulette Wheel Selection): Gán cho mỗi cá thể một “miếng bánh” có diện tích tỉ lệ thuận với độ thích nghi của nó. Việc quay bánh xe tượng trưng cho việc chọn ngẫu nhiên một cá thể, với cơ hội lớn hơn cho những cá thể tốt hơn.
    • Chọn lọc theo Giải đấu (Tournament Selection): Chọn ngẫu nhiên một nhóm nhỏ (một “giải đấu”) gồm $k$ cá thể từ quần thể, và cá thể có độ thích nghi cao nhất trong nhóm này sẽ được chọn làm cha mẹ.
    • Chọn lọc Xếp hạng (Rank Selection): Sắp xếp các cá thể theo độ thích nghi và chọn chúng dựa trên thứ hạng thay vì giá trị thích nghi tuyệt đối, giúp giảm thiểu sự thống trị của các cá thể vượt trội.
  • Lai ghép (Crossover): Sau khi chọn được các cặp cha mẹ, toán tử lai ghép được áp dụng để tạo ra “con cái” (offspring). Lai ghép kết hợp vật liệu di truyền từ hai cá thể cha mẹ, với hy vọng tạo ra những cá thể con tốt hơn cả cha mẹ. Tần suất của quá trình này được kiểm soát bởi xác suất lai ghép (crossover rate). Các kỹ thuật phổ biến là:
    • Lai ghép một điểm (One-point Crossover): Một điểm cắt ngẫu nhiên được chọn trên nhiễm sắc thể của cha mẹ, và các đoạn gen sau điểm cắt đó được hoán đổi cho nhau.
    • Lai ghép đa điểm (Multi-point Crossover): Tương tự như trên nhưng sử dụng hai hoặc nhiều điểm cắt.
    • Lai ghép đồng nhất (Uniform Crossover): Mỗi gen của cá thể con được quyết định bằng cách chọn ngẫu nhiên từ gen tương ứng của cha hoặc mẹ.
  • Đột biến (Mutation): Toán tử này thực hiện một sự thay đổi nhỏ và ngẫu nhiên trên một vài gen của cá thể con, được kiểm soát bởi một xác suất đột biến (mutation rate) thường rất thấp. Mục đích chính của đột biến là để duy trì sự đa dạng di truyền trong quần thể, giúp thuật toán tránh bị mắc kẹt tại các điểm tối ưu cục bộ và khám phá những vùng mới trong không gian tìm kiếm. Ví dụ, với mã hóa chuỗi bit, đột biến có thể là lật một bit (0 thành 1 hoặc 1 thành 0).

4. Tạo thế hệ mới và Điều kiện dừng (Termination):
Các cá thể con mới được tạo ra sẽ thay thế một phần hoặc toàn bộ quần thể cũ để hình thành thế hệ tiếp theo. Quá trình lặp lại từ bước Đánh giá (2) cho đến khi một trong các điều kiện dừng được thỏa mãn, chẳng hạn như:

  • Đạt đến số lượng thế hệ tối đa đã định trước.
  • Giá trị thích nghi của cá thể tốt nhất không cải thiện đáng kể qua nhiều thế hệ.
  • Tìm thấy một lời giải có độ thích nghi đạt đến một ngưỡng chấp nhận được.

Ưu điểm và Nhược điểm

  • Ưu điểm:
    • Khả năng áp dụng rộng: GA không yêu cầu bài toán phải liên tục, khả vi hay có cấu trúc rõ ràng. Nó đặc biệt hiệu quả với các bài toán tối ưu hóa tổ hợp và các không gian tìm kiếm phức tạp, gồ ghề.
    • Tránh tối ưu cục bộ: Bằng cách làm việc với một quần thể các lời giải và sử dụng toán tử đột biến, GA có khả năng thoát khỏi các điểm tối ưu cục bộ tốt hơn so với các thuật toán tìm kiếm dựa trên một điểm duy nhất (ví dụ: leo đồi).
    • Dễ dàng song song hóa: Việc đánh giá độ thích nghi của các cá thể trong một quần thể là các tác vụ độc lập, do đó có thể dễ dàng thực hiện song song để tăng tốc độ tính toán một cách đáng kể.
    • Tính linh hoạt: Cấu trúc của GA cho phép dễ dàng tích hợp và kết hợp với các thuật toán và heuristic khác để cải thiện hiệu suất.
  • Nhược điểm:
      • Hội tụ có thể chậm: Đối với một số bài toán, GA có thể mất rất nhiều thế hệ (và do đó là thời gian tính toán) để hội tụ về một lời giải tốt.

    Không đảm bảo tìm thấy tối ưu toàn cục: Vì là một thuật toán metaheuristic, GA không có sự đảm bảo về mặt lý thuyết rằng nó sẽ tìm thấy lời giải tối ưu toàn cục. Nó chỉ tìm kiếm một lời giải “đủ tốt” trong một khoảng thời gian hợp lý.

    • Sự nhạy cảm với tham số: Hiệu suất của GA phụ thuộc nhiều vào việc lựa chọn các tham số như kích thước quần thể, xác suất lai ghép và xác suất đột biến. Việc tinh chỉnh các tham số này thường đòi hỏi kinh nghiệm và thử nghiệm.
    • Nguy cơ hội tụ sớm: Nếu không có sự cân bằng hợp lý giữa khai thác (selection, crossover) và khám phá (mutation), quần thể có thể mất đi sự đa dạng và hội tụ quá nhanh về một điểm tối ưu cục bộ, làm giảm hiệu quả tìm kiếm.

Ứng dụng

Nhờ tính linh hoạt và mạnh mẽ, Thuật toán Di truyền đã được áp dụng thành công trong vô số lĩnh vực để giải quyết các bài toán tối ưu hóa phức tạp. Một số ứng dụng tiêu biểu bao gồm:

    • Tối ưu hóa và Kỹ thuật: Tìm kiếm các cấu hình, hình dạng, hoặc vật liệu tối ưu cho các công trình như cầu, cánh máy bay, hoặc mạch điện tử để tối đa hóa hiệu suất và giảm thiểu chi phí. Một ví dụ nổi tiếng là việc NASA sử dụng GA để thiết kế ăng-ten cho tàu vũ trụ với hiệu năng vượt trội.
    • Học máy và Trí tuệ Nhân tạo: Tối ưu hóa các siêu tham số (hyperparameters) của mô hình học máy, lựa chọn đặc trưng (feature selection) để cải thiện độ chính xác, và huấn luyện các trọng số của mạng nơ-ron nhân tạo.
    • Lập lịch và Logistics: Giải quyết các bài toán lập lịch phức tạp như bài toán người bán hàng (Traveling Salesman Problem), lập lịch sản xuất trong nhà máy, phân bổ nguồn lực, hay tối ưu hóa tuyến đường vận tải để tiết kiệm thời gian và chi phí.
    • Tin sinh học (Bioinformatics): Phân tích chuỗi DNA, dự đoán cấu trúc protein, và nghiên cứu các hệ thống sinh học phức tạp, nơi các tương tác gen có thể được mô hình hóa như một bài toán tối ưu hóa.

Kinh tế và Tài chính: Xây dựng các chiến lược giao dịch, tối ưu hóa danh mục đầu tư, và mô hình hóa các hệ thống kinh tế.

  • Robot học: Tối ưu hóa quỹ đạo chuyển động của robot, thiết kế cấu trúc robot, và phát triển các bộ điều khiển tự động thích ứng.

 

Ví dụ minh họa: Tối đa hóa hàm số

Để hiểu rõ hơn về cách GA hoạt động, hãy xem xét một bài toán đơn giản: tìm giá trị lớn nhất của hàm $f(x) = x^2$ với $x$ là một số nguyên trong đoạn [0, 31]. Lời giải tối ưu rõ ràng là $x=31$, $f(31) = 961$.

Ta có thể mã hóa mỗi giá trị $x$ bằng một chuỗi nhị phân 5 bit (vì $2^5 = 32$, biểu diễn được các số từ 0 đến 31). Quá trình tiến hóa diễn ra như sau:

1. Khởi tạo: Tạo một quần thể ban đầu gồm 4 cá thể ngẫu nhiên.

  • Cá thể A: `01101` (tương ứng với $x=13$)
  • Cá thể B: `11000` (tương ứng với $x=24$)
  • Cá thể C: `01000` (tương ứng với $x=8$)
  • Cá thể D: `10011` (tương ứng với $x=19$)

2. Đánh giá: Tính toán độ thích nghi (giá trị $f(x)=x^2$) cho mỗi cá thể.

  • Fitness(A): $13^2 = 169$
  • Fitness(B): $24^2 = 576$
  • Fitness(C): $8^2 = 64$
  • Fitness(D): $19^2 = 361$

3. Chọn lọc: Các cá thể có độ thích nghi cao hơn (B và D) có xác suất được chọn làm cha mẹ cao hơn. Giả sử sau khi chọn lọc (ví dụ bằng phương pháp Bánh xe Roulette), ta chọn được hai cặp cha mẹ để lai ghép: (B, D) và (B, A).

4. Lai ghép: Áp dụng lai ghép một điểm.

  • Cặp 1: `110 | 00` (B) và `100 | 11` (D). Chọn điểm cắt sau bit thứ 3. Ta hoán đổi đuôi và tạo ra hai con mới:
    • Con 1: `11011` (tương ứng với $x=27$, fitness = 729)
    • Con 2: `10000` (tương ứng với $x=16$, fitness = 256)
  • Cặp 2: `1100 | 0` (B) và `0110 | 1` (A). Chọn điểm cắt sau bit thứ 4. Ta tạo ra hai con mới:
    • Con 3: `11001` (tương ứng với $x=25$, fitness = 625)
    • Con 4: `01100` (tương ứng với $x=12$, fitness = 144)

5. Đột biến: Áp dụng một xác suất đột biến rất nhỏ (ví dụ 1%) lên từng bit của quần thể con mới. Giả sử bit thứ hai của “Con 1” bị đột biến: 11011 -> 10011.

6. Tạo thế hệ mới: Quần thể mới giờ đây bao gồm các cá thể con vừa được tạo ra. So với quần thể ban đầu, quần thể mới đã có những cá thể tốt hơn (ví dụ 11011 có fitness 729 > 576).

Quá trình này lặp lại, qua nhiều thế hệ, các chuỗi bit có giá trị số lớn hơn (gần với 11111 hay 31) sẽ có xu hướng tồn tại, sinh sản và tạo ra các thế hệ con ngày càng tốt hơn, cuối cùng hội tụ về lời giải tối ưu.

Các biến thể và cải tiến

Để tăng cường hiệu suất và khả năng giải quyết các bài toán chuyên biệt, nhiều biến thể của GA đã được đề xuất:

  • Elitism (Giữ lại cá thể ưu tú): Một chiến lược đơn giản nhưng rất hiệu quả, đảm bảo rằng cá thể tốt nhất (hoặc một vài cá thể tốt nhất) của một thế hệ sẽ được chuyển thẳng sang thế hệ tiếp theo mà không bị thay đổi bởi lai ghép hay đột biến. Điều này ngăn chặn việc mất đi lời giải tốt nhất đã tìm được.
  • Thuật toán Di truyền Đa mục tiêu (MOGA): Dành cho các bài toán có nhiều hơn một hàm mục tiêu cần được tối ưu hóa đồng thời (ví dụ: tối đa hóa hiệu suất và tối thiểu hóa chi phí). Thay vì một giá trị thích nghi duy nhất, MOGA sử dụng khái niệm thống trị Pareto (Pareto dominance) để so sánh các lời giải. Mục tiêu là tìm ra một tập hợp các lời giải cân bằng (gọi là mặt trận Pareto), đại diện cho các sự đánh đổi khác nhau giữa các mục tiêu. Các thuật toán phổ biến trong nhóm này là NSGA-II và SPEA2.
  • Thuật toán Di truyền với mã hóa số thực (Real-coded GA): Khi các biến của bài toán là số thực, việc sử dụng mã hóa nhị phân có thể không hiệu quả. Thay vào đó, Real-coded GA làm việc trực tiếp với các vector số thực. Các toán tử lai ghép và đột biến cũng được điều chỉnh cho phù hợp, ví dụ như lai ghép số học (Arithmetic Crossover)đột biến Gaussian (Gaussian Mutation).
  • Các biến thể khác: Nhiều cải tiến khác cũng tồn tại như Đồng tiến hóa (Co-evolution), nơi nhiều quần thể tiến hóa song song và tương tác với nhau; hay Micro-GA, sử dụng quần thể rất nhỏ và khởi động lại thường xuyên để tăng khả năng khám phá.

Mã giả của Thuật toán Di truyền cơ bản

Procedure GeneticAlgorithm
// Khởi tạo
t = 0; // Khởi tạo bộ đếm thế hệ
P(t) = InitializePopulation(); // Khởi tạo quần thể ban đầu một cách ngẫu nhiên
Evaluate(P(t)); // Đánh giá độ thích nghi của từng cá thể trong P(t)
// Vòng lặp tiến hóa chính
While (điều kiện dừng chưa thỏa mãn) do
t = t + 1;

// Tạo thế hệ mới
P_parents(t) = Select(P(t-1)); // Chọn lọc các cá thể cha mẹ từ thế hệ trước
P_offspring(t) = Crossover(P_parents(t)); // Lai ghép để tạo ra các cá thể con
P_mutated(t) = Mutate(P_offspring(t)); // Áp dụng đột biến lên các cá thể con

Evaluate(P_mutated(t)); // Đánh giá các cá thể mới

P(t) = Replace(P(t-1), P_mutated(t)); // Tạo quần thể thế hệ mới P(t)
End While

// Trả về kết quả
Return BestIndividual(P(t)); // Trả về cá thể tốt nhất trong quần thể cuối cùng

End Procedure

Một số điều thú vị về Thuật toán Di truyền
  • Nguồn gốc từ John Holland: Thuật toán Di truyền được phát triển bởi John Holland và các đồng nghiệp, sinh viên của ông tại Đại học Michigan vào những năm 1960 và 1970. Công trình của Holland đã đặt nền móng cho lĩnh vực này, với cuốn sách “Adaptation in Natural and Artificial Systems” (1975) được xem là tác phẩm kinh điển.
  • Mô phỏng quá trình tiến hóa: GA không chỉ mô phỏng các cơ chế di truyền cơ bản mà còn có thể được mở rộng để mô phỏng các hiện tượng tiến hóa phức tạp hơn, như co-evolution (đồng tiến hóa) và speciation (hình thành loài).
  • Ứng dụng trong thiết kế ăng-ten của NASA: NASA đã sử dụng Thuật toán Di truyền để thiết kế ăng-ten cho tàu vũ trụ ST5 (Space Technology 5). Các ăng-ten được tạo ra bởi GA có hình dạng kỳ lạ, nhưng lại có hiệu suất vượt trội so với các thiết kế truyền thống.
  • Sử dụng trong nghệ thuật và âm nhạc: GA đã được sử dụng để tạo ra các tác phẩm nghệ thuật và âm nhạc độc đáo. Các nghệ sĩ và nhạc sĩ có thể sử dụng GA để khám phá không gian sáng tạo và tạo ra những tác phẩm không thể tưởng tượng trước được.
  • Giải quyết các bài toán NP-khó: Nhiều bài toán tối ưu hóa trong thực tế là NP-khó (non-deterministic polynomial-time hard), nghĩa là không có thuật toán nào biết trước có thể giải quyết chúng trong thời gian đa thức. GA thường được sử dụng để tìm kiếm lời giải gần đúng cho các bài toán này, mặc dù không đảm bảo tìm được lời giải tối ưu toàn cục.
  • Phần cứng di truyền (Evolvable Hardware): Ý tưởng về việc sử dụng GA để tự động thiết kế mạch điện tử đã dẫn đến sự phát triển của lĩnh vực phần cứng di truyền. Các mạch được “tiến hóa” bằng GA có thể thích ứng với các điều kiện môi trường thay đổi hoặc tự sửa chữa khi có lỗi.
  • Tối ưu hóa trong trò chơi điện tử: Các nhà phát triển trò chơi điện tử có thể dùng GA để tối ưu các thông số, tinh chỉnh độ khó, hoặc thậm chí “huấn luyện” các nhân vật AI (trí tuệ nhân tạo) để chúng có hành vi thông minh và tự nhiên hơn.

Nội dung được thẩm định bởi Công ty Cổ phần KH&CN Trí Tuệ Việt

P.5-8, Tầng 12, Tòa nhà Copac Square, 12 Tôn Đản, Quận 4, TP HCM.

[email protected]

Ban biên tập: 
GS.TS. Nguyễn Lương Vũ
GS.TS. Nguyễn Minh Phước
GS.TS. Hà Anh Thông
GS.TS. Nguyễn Trung Vĩnh

PGS.TS. Lê Đình An

PGS.TS. Hồ Bảo Quốc
PGS.TS. Lê Hoàng Trúc Duy
PGS.TS. Nguyễn Chu Gia
PGS.TS. Lương Minh Cang
TS. Nguyễn Văn Hồ
TS. Phạm Kiều Trinh

TS. Ngô Văn Bản
TS. Kiều Hà Minh Nhật
TS. Chu Phước An
ThS. Nguyễn Đình Kiên

CN. Lê Hoàng Việt
CN. Phạm Hạnh Nhi

Bản quyền thuộc về Công ty cổ phần Trí Tuệ Việt