Tiến hóa là một khái niệm khoa học được nghiên cứu rộng rãi, giải thích cách các sinh vật sống thay đổi theo thời gian và tồn tại qua hàng ngàn hoặc thậm chí hàng triệu năm. Một trong những lý thuyết nổi tiếng nhất liên quan đến tiến hóa là Chọn lọc Tự nhiên, được đề xuất bởi Charles Darwin.

Darwin định nghĩa chọn lọc tự nhiên là “quá trình qua đó các quần thể sinh vật sống thích nghi và thay đổi theo thời gian.” Một ví dụ thực tế mạnh mẽ là trường hợp "voi không ngà". Khoảng 100 năm trước, hầu hết voi được sinh ra với ngà, giúp chúng tự vệ trước các loài săn mồi như sư tử hay hổ. Tuy nhiên, trong những năm 1970, việc săn voi tăng vọt do nhu cầu ngà voi quá lớn. Kết quả là, voi bị đẩy đến bờ vực tuyệt chủng. Theo thời gian, một sự thay đổi đáng chú ý đã xảy ra: ngày càng nhiều voi được sinh ra không có ngà. Vì những con voi không có ngà ít có khả năng bị săn bắn hơn, chúng có cơ hội sống sót và sinh sản cao hơn — đây là một ví dụ trực tiếp về chọn lọc tự nhiên đang diễn ra.

Trong lý thuyết của Darwin, tiến hóa xảy ra khi một số cá thể nhất định trong quần thể sở hữu những đặc điểm có lợi khiến chúng thích nghi tốt hơn với môi trường của mình. Những cá thể này sống sót lâu hơn và sinh sản nhiều hơn, truyền những đặc điểm đó cho thế hệ tiếp theo.

Thuật toán Di truyền (Genetic Algorithms - GA) là một phương pháp học máy lấy cảm hứng từ các nguyên tắc của tiến hóa và chọn lọc tự nhiên. Chúng được sử dụng để giải quyết cả các bài toán tối ưu hóa có ràng buộc và không ràng buộc, đặc biệt khi không gian tìm kiếm phức tạp hoặc chứa nhiều cực trị địa phương (local optima).

Không giống như các phương pháp xác định (deterministic) như Tối ưu hóa Gradient (Gradient Descent) hoặc Mạng nơ-ron (Neural Networks) — có thể bị mắc kẹt ở tại điểm cực tiểu cục bộ (local minima) — GA khám phá không gian lời giải một cách đa dạng hơn.

Ưu điểm của Thuật toán Di truyền:

  • Xử lý các vấn đề phức tạp: Hiệu quả ngay cả khi các phương pháp toán học truyền thống thất bại.

  • Tránh các cực trị địa phương: Có thể thoát khỏi cực tiểu địa phương để tìm kiếm các lời giải toàn cục (global solutions) tốt hơn.

  • Dễ dàng song song hóa một cách tự nhiên: Có thể đánh giá nhiều lời giải cùng lúc.

  • Tính linh hoạt cao: Có thể được áp dụng cho hầu hết mọi vấn đề tối ưu hóa.

  • Trực quan: Đơn giản về mặt khái niệm và tương đối dễ thực hiện.

Các Thành Phần & Thuật Ngữ Cốt Lõi — Hiểu Cách Thuật toán Di truyền (Genetic Algorithms — GA) Hoạt Động

Trước khi đi vào cách các Thuật toán Di truyền (Genetic Algorithms — GA) thực sự học và tiến hóa, hãy cùng làm rõ các khái niệm nền tảng. Hãy coi đây như việc học “ngôn ngữ” của GA — hiểu được phần này rồi thì những phần sau sẽ dễ dàng hơn rất nhiều.

Encoding: Chuyển Đổi Từ Biến Thế Giới Thực Thành “DNA Số”

Mỗi thuật toán GA đều bắt đầu bằng việc chuyển bài toán thực tế sang dạng số hóa để máy tính có thể xử lý.

Hãy tưởng tượng bạn đang cố tối ưu vị trí của một hộp giới hạn (bounding box) trong ảnh (dùng trong bài toán phát hiện đối tượng). Trong thực tế, bounding box này được mô tả bằng 4 giá trị: vị trí và kích thước — x, y, w (width), h (height).

Trong ngôn ngữ của GA:

  • Chromosome (Nhiễm sắc thể) = Một lời giải tiềm năng (ví dụ: toàn bộ bounding box).

  • Gene (Gen) = Một phần của lời giải (ví dụ: x, y, w hoặc h).

Nói cách khác, mỗi chromosome là một chuỗi các gene — giống như “DNA số” đại diện cho một lời giải khả thi. Quá trình chuyển đổi các biến từ thế giới thực sang cấu trúc dữ liệu này được gọi là encoding.

Một số cách encoding phổ biến:

  • Mã hóa nhị phân (Binary encoding): Dùng 0 và 1 (truyền thống, đơn giản).

  • Mã hóa số thực hoặc số nguyên (Floating-point or integer encoding): Dùng số thực hoặc số nguyên để tăng độ chính xác.

chromosome example.jpg

Quần thể và Độ Thích nghi: Xây dựng một Thế giới của các Đối thủ Cạnh tranh

Khi bạn biết cách thể hiện một lời giải, bước tiếp theo là tạo ra nhiều lời giải. Đó chính là quần thể (population) — một tập hợp các nhiễm sắc thể (chromosome), mỗi nhiễm sắc thể (chromosome) là một lời giải tiềm năng độc nhất cho bài toán của bạn.

Ban đầu, quần thể (population) thường được tạo ngẫu nhiên, để đảm bảo đa dạng các khả năng ngay từ đầu.

=> Nhưng làm sao để biết lời giải nào tốt hơn?

Đó là lúc hàm thích nghi (fitness function) phát huy tác dụng. Hàm thích nghi (Fitness function) hoạt động như một bảng điểm, dùng để đo lường mức độ tốt của từng lời giải so với các lời giải khác. Nó được thiết kế để liên kết trực tiếp với mục tiêu tối ưu hóa của bài toán.
- Tối đa hóa (Maximizing): Nếu bạn đang tối đa hóa một cái gì đó (vị dụ tăng lợi nhuận hoặc độ chính xác), giá trị mục tiêu cao hơn $=$ độ thích nghi cao hơn.
- Tối thiểu hóa (Minimizing): Nếu bạn đang tối thiểu hóa một cái gì đó (ví dụ như giảm chi phí hoặc lỗi), chúng ta đảo ngược thang đo để các giá trị nhỏ hơn vẫn có nghĩa là độ thích nghi cao hơn.

Một cách đơn giản để làm điều đó là dùng công thức để tìm hàm thích nghi:
$$ \text{Fitness} = \frac{1}{1 + C} $$

trong đó $C$ là giá trị chi phí hoặc lỗi. Nhờ công thức này, ngay cả khi bài toán là tối thiểu hóa (minimize), lời giải tốt nhất vẫn sẽ “ghi điểm cao hơn”.

population.jpg

Các phép toàn di truyền: Những "Lực Tiến Hóa" Cốt Lõi

Vậy làm cách nào mà quần thể (poplation) có thể tiến hóa qua các thế hệ.
Cũng như trong tự nhiên, GA sử dụng ba "lực lượng" tiến hóa chính để làm cho mỗi thế hệ mới tốt hơn thế hệ trước:

  • Tuyển chọn (Selection) — Sự sống sót của Cá thể Thích nghi nhất: Đây chính là chọn lọc tự nhiên đang diễn ra. Thuật toán chọn ra những cá thể mạnh hơn (có độ thích nghi cao hơn) để "sinh sản" và mang những đặc điểm thành công của chúng sang thế hệ tiếp theo.

  • Lai ghép (Crossover) / Tái tổ hợp (Recombination) — Trộn DNA: Tại đây, hai nhiễm sắc thể cha mẹ được chọn, và các phần gen của chúng được kết hợp để tạo thành "con cái" mới. Việc này giống như việc trộn hai giải pháp tốt để tạo ra một giải pháp tiềm năng thậm chí còn tốt hơn.

  • Đột biến (Mutation) — Thêm một Sự thay đổi ngẫu nhiên: Thỉnh thoảng, một sự thay đổi ngẫu nhiên được áp dụng cho một số gen. Điều này rất quan trọng vì nó giữ cho quần thể đa dạng và ngăn thuật toán bị "mắc kẹt" trong một cực trị địa phương (local optimum)—một ngọn đồi nhỏ khi có một ngọn đồi lớn hơn, tốt hơn ở gần đó.

Theo thời gian, ba cơ chế này— Tuyển chọn (Selection), Lai ghép (Crossover) và Đột biến (Mutation) — giúp quần thể cải thiện qua từng thế hệ. Các đặc điểm tốt nhất lan truyền, các biến thể mới xuất hiện và các giải pháp yếu hơn bị loại bỏ.

Ví dụ: Một Hệ sinh thái bên trong Cơ thể Con người

Nếu bạn suy nghĩ về điều đó, GA về cơ bản giống như một quá trình sinh học thích nghi đang diễn ra bên trong cơ thể con người, đấu tranh để sinh tồn và đạt được chức năng tối ưu.

Thuật toán di truyền / Genetic Algorithm Sinh học trong cơ thể người Chức năng
Quần thể / Population (Các lời giải) Tế bào miễn dịch / Kháng thể Tập hợp ban đầu của các giải pháp ứng viên giống như sự đa dạng của các tế bào miễn dịch hoặc kháng thể (các giải pháp) sẵn có để chống lại bất kỳ mối đe dọa nào.
Thế hệ / Generation (vòng tiến hóa) Chu kỳ phản ứng miễn dịch Mỗi thế hệ của GA giống như một vòng phản ứng miễn dịch—một giai đoạn cạnh tranh và tinh chỉnh gay gắt.
Tuyển chọn / Selection (sống sót) Tuyển chọn Dòng vô tính (Clonal Selection) — chỉ giữ lại kháng thể phù hợp nhất Khi một mối đe dọa (mầm bệnh) được phát hiện, chỉ những tế bào/kháng thể phù hợp nhất với mối đe dọa đó mới được nhanh chóng chọn lọc và nhân lên (sự sống sót của cá thể thích nghi nhất)
Lai ghép / Crossover (tổ hợp gen) Tái tổ hợp tế bào B (B-Cell Recombination) — kết hợp gene để tạo kháng thể mới Các tế bào như tế bào B sử dụng tái tổ hợp di truyền để nhanh chóng tạo ra sự đa dạng lớn về kháng thể, trộn lẫn các thành phần di truyền thành công để tìm ra cơ chế phòng thủ tối ưu
Đột biến/ Mutation (các biến thể mới) Somatic Hypermutation — tạo biến thể đột phá mới Trong quá trình phản ứng miễn dịch, các gen mã hóa kháng thể trải qua quá trình tăng đột biến (các thay đổi ngẫu nhiên). Điều này khám phá các biến thể mới cho đến khi kháng thể hoàn hảo, có ái lực cao (giải pháp tối ưu) được tạo ra.

Chìa khóa cho sức mạnh của cơ thể (và của GA) là sự cân bằng:

  • Khai thác (Exploitation) / Tinh chỉnh (Tuyển chọn Dòng vô tính): Nhanh chóng sao chép các tế bào đã được biết là thành công.
  • Khám phá (Exploration) / Đột biến (Tăng đột biến Somatic): Thử các sự kết hợp di truyền mới để tìm ra cơ chế phòng thủ vượt trội chống lại một mối đe dọa mới lạ.

Phân Tích Chi Tiết Các Thao Tác Di Truyền (Genetic Operations)

Các bài toàn di truyền là cơ chế cốt lõi điều khiển quá trình tiến hóa của GA:

A. Tuyển chọn (Selection)

Mục đích: Thực hiện nguyên tắc "sự sống sót của cá thể thích nghi nhất" bằng cách chọn lọc theo xác suất những cá thể tốt nhất để làm cha mẹ.
Cơ chế (Tuyển chọn Vòng đấu/Tournament): Chọn ngẫu nhiên một vài cá thể và chọn ra cá thể có độ thích nghi tốt nhất trong số đó. Điều này ưu tiên các cá thể thích nghi hơn mà không đảm bảo chúng được chọn, giúp duy trì một mức độ đa dạng nhất định.
Ví dụ khi áp dụng Python: (Giả định quần thể đã được sắp xếp theo độ thích nghi)

def selection(sorted_vectors, population_size):
    """Chọn cá thể tốt hơn từ vòng đấu"""
    index1 = random.randint(0, population_size - 1)
    index2 = random.randint(0, population_size - 1)

    while index2 == index1:
        index2 = random.randint(0, population_size - 1)

# Trả về cá thể có chỉ số tốt hơn (nhỏ hơn), ngụ ý độ thích nghi tốt hơn
    if index2 < index1:
        return sorted_vectors[index2]
    return sorted_vectors[index1]

B. Lai ghép (Crossover) / Tái tổ hợp (Recombination)

Mục đích: Thực hiện sự thừa kế di truyền bằng cách kết hợp vật chất di truyền của hai cha mẹ.
Cơ chế: Đối với mỗi vị trí gen, con cái ngẫu nhiên lấy gen từ Cha mẹ 1 hoặc Cha mẹ 2, tạo ra một con cái là sự pha trộn của cả hai.

Parent 1:    [0,  1,  1,  0,  1,  0]
Parent 2:    [1,  0,  0,  1,  0,  0]
             ↓  ↓     ↑  ↓     ↓
Random:     [0.3, 0.7, 0.2, 0.8, 0.1, 0.9]  (nếu random[i] < Tỷ lệ lai ghép (CR) → lấy từ Parent 2)
CR = 0.5

Child 1:     [1,  0,  1,  1,  0,  0]
Child 2:     [0,  1,  0,  0,  1,  0]

Ví dụ khi áp dụng Python:

def crossover(parent1, parent2, problem_size, rate=0.5):
    """Trao đổi vật chất di truyền giữa các cha mẹ"""
    child1 = parent1.copy()
    child2 = parent2.copy()

    for i in range(problem_size):
        if random.random() < rate:
            # Hoán đổi vị trí
            child1[i], child2[i] = parent2[i], parent1[i]

    return child1, child2

C. Đột biến (Mutation)

Mục đích: Thực hiện sự biến đổi di truyền bằng cách thay đổi ngẫu nhiên một phần nhỏ các gen của con cái.
Cơ chế: Một xác suất thấp (Tỷ lệ Đột biến/Mutation Rate) quyết định liệu giá trị của một gen có bị thay đổi ngẫu nhiên hay không. Điều này rất quan trọng để ngăn quần thể bị mắc kẹt trong cực trị địa phương và đảm bảo khám phá rộng rãi không gian giải pháp.

Nguyên bản (Original):    [0,  1,  1,  0,  1,  0]
Đột biến (Mutation):      [?,  1,  1,  0,  ?,  0]  ← chỉ vài vị trí bị thay đổi
Tỷ lệ Đột biến = 0.05 (5% cơ hội trên mỗi gen)
Kết quả:                  [5,  1,  1,  0, -3,  0]  ← các giá trị ngẫu nhiên mới

Ví dụ khi áp dụng Python:

def mutation(individual, problem_size, min_val, max_val, rate=0.05):
    """Ngẫu nhiên sửa đổi một số gen"""
    mutated = individual.copy()

    for i in range(problem_size):
        if random.random() < rate:
            mutated[i] = random.randint(min_val, max_val)

    return mutated

D. Chủ nghĩa tinh hoa (Elitism)

Mục đích: Một chiến lược quan trọng để đảm bảo rằng các giải pháp tốt nhất đã tìm thấy sẽ không bao giờ bị mất đi trong quá trình tiến hóa.
Cơ chế: Sao chép trực tiếp "top" $N$ cá thể tốt nhất vào thế hệ mới trước khi làm bất kỳ phép lai tạo nào.

Generation N (đã sắp xếp theo fitness):
1st: [0, 0, 1, -1, 2] ← BEST
2nd: [1, 1, 0, 0, 1]  ← SECOND BEST

→ Thế hệ mới bắt đầu bằng 2 cá thể này
→ Sau đó mới tạo offspring để lấp chỗ trống

Ví dụ khi áp dụng Python:

# Sau khi đánh giá và sắp xếp
sorted_population = sorted(population, key=fitness_function)

# Giữ lại các cá thể tốt nhất
new_population = sorted_population[:elitism_count]

# Tạo con cái để điền vào các vị trí còn lại
while len(new_population) < population_size:
    # ... chọn, lai ghép và đột biến con cái ...
    new_population.append(child1)
    new_population.append(child2)

population = new_population

E. Đánh giá (Evaluation) / Hàm Thích nghi (Fitness Function)

Vai trò: Hàm thích nghi là thước đo cốt lõi được sử dụng để tính toán mức độ tốt của mỗi giải pháp, từ đó xác định rõ ràng "tốt hơn" có nghĩa là gì đối với bài toán tối ưu hóa. Nó chuyển đổi giá trị mục tiêu (ví dụ: chi phí, lỗi, lợi nhuận) thành một điểm số hiệu suất so sánh.
Các Hàm Thích Nghi phổ biến:
- Tối thiểu hóa (Minimization): $f(x) = x^2 + y^2 + z^2$ (tìm các giá trị gần bằng 0 nhất).
- Tối đa hóa (Maximization): $f(x) = \sin(x) \times \cos(y)$ (tìm các giá trị đỉnh).
- Tùy chỉnh (Custom): Bất kỳ số liệu cụ thể nào theo lĩnh vực.

def sphere_fitness(individual):
    """Tính toán độ thích nghi cho hàm Hình cầu (tối thiểu hóa)"""
    return sum(x**2 for x in individual)

def one_max_fitness(individual):
    """Đếm số lượng số 1 (tối đa hóa)"""
    # Trả về giá trị âm vì thuật toán thường được viết để tối thiểu hóa,
    # nên tối thiểu hóa số âm tương đương với tối đa hóa số dương
    return -sum(individual)

Thuật Toán GA Trong 3 Bước Đơn Giản

Cùng tìm hiểu bài toán bằng một ví dụ cụ thể — bài toán tối ưu hàm Sphere,
$f(x) = x² + y² + ...$ (càng nhỏ càng tốt — vì đây là bài toán tối thiểu hóa (minimize)).

Bước 1: Tạo Population Ngẫu Nhiên

Bắt đầu bằng cách tạo ra một tập các lời giải tiềm năng (chromosomes) hoàn toàn ngẫu nhiên. Mục tiêu là đảm bảo tính đa dạng vào lúc ban đầu.

Generation 0:
[5, -3, 12, 8, -1] ← Cá thể 1 (Chromosome)
[-2, 15, 6, -4, 9] ← Cá thể 2
[8, -7, 3, 11, -5] ← Cá thể 3
... (các cá thể khác)

Bước 2: Đánh Giá Độ Thích Nghi (Fitness)

Tính toán độ thích nghi của từng cá thể bằng hàm mục tiêu. Vì đây là bài toán tối thiểu hóa (minimization). Nếu giá trị càng nhỏ, thì cá thể càng mạnh (fitness càng cao theo hệ quy đổi).

Độ Thích Nghi (Fitness) của
[5, -3, 12, 8, -1] = 5² + (-3)² + 12² + 8² + (-1)² = 263
[−2, 15, 6, −4, 9] = 4 + 225 + 36 + 16 + 81 = 362 (kém hơn)
[8, −7, 3, 11, −5] = 64 + 49 + 9 + 121 + 25 = 268 (kém hơn)

Bước 3: Tiến Hóa Quần Thể (Evolution)

Các cá thể tốt nhất được chọn làm cha mẹ để tạo ra một thế hệ mới thông qua các toán tử di truyền (genetic operators).

Cha mẹ được chọn: [5, -3, 12, 8, -1] (tốt nhất) và [8, -7, 3, 11, -5] (thứ nhì)
Sau Crossover: [5, -3, 12, 11, -5] (con lấy gene từ cả hai cha mẹ)
Sau Mutation: [5, -3, 12, 11, 2] (một gene bị thay đổi ngẫu nhiên để khám phá)
=> Quy trình này lặp lại qua nhiều thế hệ — cho đến khi tìm được lời giải đủ tốt hoặc tối ưu.


Thuật Toán Di Truyền trong giải quyết các vấn đề

Bài toán Tối đa hóa Số Một (One-Max)

Bài toán One-Max là một ví dụ kinh điển trong tối ưu hoá, thường được dùng để làm bài tập mở đầu cho thuật toán di truyền (Genetic Algorithm). Mục tiêu rất đơn giản nhưng cực kỳ hiệu quả: tìm ra một chuỗi nhị phân (gồm các số $0$ và $1$) sao cho số lượng số $1$ trong chuỗi là nhiều nhất.

Trong bài toán này, ta làm việc với vector nhị phân, mỗi vector đại diện cho một lời giải tiềm năng. Ví dụ, với vector độ dài $6$, lời giải tối ưu là: [1,1,1,1,1,1]

Vector này cho ra điểm số fitness cao nhất có thể.
Hàm Thích nghi (Fitness Function)
Hàm fitness của bài toán này cực kỳ đơn giản — đó chính là tổng của tất cả các giá trị trong vector:

$$\text{Độ Thích Nghi}(v) = \sum_{i=1}^{n} v_i$$

trong đó:

  • $v$ là một vector nhị phân → ví dụ như [1, 0, 1, 1, 0]
  • $v_i$ là giá trị tại vị trí thứ i trong vector (chỉ có thể là 0 hoặc 1)
  • $\Sigma$ (sigma) có nghĩa là “cộng tất cả các giá trị này lại”

=> Tức là ta đơn giản chỉ cần đếm xem có bao nhiêu số 1 trong vector
Quy tắc: Vector có càng nhiều số 1 → điểm fitness càng cao

Cách Tiếp Cận của Thuật Toán Di Truyền (Genetic Algorithm)

Thuật toán di truyền giải bài toán One-Max bằng cách mô phỏng quá trình tiến hoá sinh học. Quy trình hoạt động theo chu trình lặp liên tục gồm 5 bước chính sau:

One max problem.jpg

1. Khởi tạo quần thể (Population Initialization)

Đầu tiên, ta tạo một quần thể ngẫu nhiên gồm nhiều lời giải tiềm năng. Trong ví dụ này, ta khởi tạo 10 cá thể (m = 10), mỗi cá thể là một vector nhị phân có độ dài 6 (n = 6). Mỗi bit trong vector được gán ngẫu nhiên là 0 hoặc 1.
Ví dụ
$$\text{Cá thể 1: } [0, 0, 1, 1, 1, 0]$$$$\text{Cá thể 2: } [1, 0, 1, 0, 1, 0]$$$$\text{Cá thể 3: } [0, 0, 1, 0, 0, 1]$$$$\dots \text{(và tiếp tục)}$$
=> Việc khởi tạo ngẫu nhiên này giúp đảm bảo sự đa dạng di truyền ban đầu, giúp thuật toán có nhiều hướng để khám phá.
2. Đánh giá (Evaluation)
Sau khi có quần thể, ta tính điểm fitness cho từng cá thể bằng cách đếm số lượng số 1 trong vector.
Ví dụ:
$$\text{Véc-tơ } [0, 0, 1, 1, 1, 0] \text{ có độ thích nghi} = 3$$$$\text{Véc-tơ } [1, 0, 1, 0, 1, 0] \text{ có độ thích nghi} = 3$$$$\text{Véc-tơ } [0, 0, 1, 0, 0, 1] \text{ có độ thích nghi} = 2$$$$\text{Véc-tơ } [0, 1, 1, 0, 0, 1] \text{ có độ thích nghi} = 3$$$$\text{Véc-tơ } [0, 1, 1, 1, 1, 0] \text{ có độ thích nghi} = 4$$$$\text{Véc-tơ } [1, 0, 0, 0, 1, 1] \text{ có độ thích nghi} = 3$$
=> Các điểm số thích nghi cho chúng ta biết cá thể nào gần với mục tiêu là có tất cả các số $1$ hơn.

3. Tuyển Chọn (Selection)
Đây là lúc tiến hoá bắt đầu định hướng quá trình tìm kiếm. Ta sắp xếp quần thể theo fitness, sau đó chọn các cá thể tốt hơn để làm cha mẹ (parents) cho thế hệ tiếp theo.
Cơ chế lựa chọn thường là:
- Sắp xếp theo điểm fitness
- Chọn ngẫu nhiên 2 cá thể, nhưng ưu tiên những cá thể có fitness cao hơn
- Các cá thể này sẽ truyền đặc điểm tốt (nhiều số 1) sang thế hệ sau.
4. Lai ghép (Crossover)
Lai ghép kết hợp các đặc điểm từ hai cha mẹ được chọn để tạo ra con cái (quá trình khai thác/exploitation). Chúng ta lấy hai nhiễm sắc thể cha mẹ và trao đổi các phân đoạn giữa chúng tại một điểm lai ghép được chọn ngẫu nhiên. Điều này cho phép sự kết hợp có lợi của các gen xuất hiện.
Ví dụ:
$$\text{Cha mẹ 1: } [1, 1, 1, 1, 1, 0]$$$$\text{Cha mẹ 2: } [0, 1, 1, 0, 0, 1]$$
Chúng ta có thể tạo ra con cái bằng cách hoán đổi các phần của các véc-tơ này tại một điểm lai ghép được chọn ngẫu nhiên.
$$\text{Con cái 1: } [1, 1, 1, 0, 0, 1]$$$$\text{Con cái 2: } [0, 1, 1, 1, 1, 0]$$
5. Đột biến (Mutation)
- Đột biến đưa vào các thay đổi nhỏ, ngẫu nhiên để duy trì sự đa dạng di truyền và tạo điều kiện cho khám phá (exploration) , điều này có thể hiểu là tìm kiếm các giải pháp mới.
- Cơ chế: Trong mã hóa nhị phân, đột biến chỉ đơn giản là đảo bit (thay đổi $0$ thành $1$ hoặc ngược lại) với một xác suất nhỏ, được xác định trước (tỷ lệ đột biến).
- Tầm quan trọng: Mặc dù đột biến có thể tạm thời làm giảm độ thích nghi, nhưng nó rất quan trọng để ngăn thuật toán bị mắc kẹt trong các cực trị địa phương và đảm bảo sự khám phá rộng rãi.

6. Chu trình Tiến hóa (evalution)

Sau đột biến, chúng ta kiểm tra điều kiện dừng của mình. Nếu chúng ta chưa tìm thấy giải pháp tối ưu hoặc chưa đạt đến số lượng thế hệ tối đa, chúng ta quay lại bước đánh giá với quần thể mới của mình. Chu trình này tiếp tục, với mỗi thế hệ thường cho thấy sự cải thiện về độ thích nghi trung bình, cho đến khi chúng ta tìm thấy giải pháp tối ưu hoặc quyết định chấm dứt.

Thiết kế một Hàm Thích nghi Hiệu quả

Thành công của bất kỳ thuật toán di truyền nào đều phụ thuộc vào một hàm thích nghi (fitness) được thiết kế tốt. Để tạo ra một hàm thích nghi hiệu quả, hãy tuân theo bốn nguyên tắc sau:

  1. Hiểu rõ mục tiêu bài toán: Bắt đầu bằng cách xác định rõ ràng điều gì làm cho một giải pháp là tối ưu trong bối cảnh bài toán của bạn.
  2. Xác định các đặc điểm mong muốn: Quyết định những đặc tính nào làm cho một giải pháp trở nên đáng mong muốn.
  3. Định lượng tính khả thi: Thiết lập các số liệu có thể đo lường được để đánh giá chất lượng giải pháp.
  4. Xác định tiêu chí: Chỉ định các tiêu chí đánh giá phù hợp với mục tiêu tối ưu hóa của bạn.

Tại sao Bài toán Tối đa hóa Số Một lại Quan trọng

Mặc dù Bài toán Tối đa hóa Số Một (One-Max Problem) trông có vẻ “quá đơn giản” — vì lời giải tối ưu rõ ràng là chuỗi gồm toàn số 1 — nhưng thực tế nó lại là một công cụ giảng dạy hoàn hảo vì các lý do sau:

  1. Đơn giản: Hàm thích nghi minh bạch, giúp dễ dàng hiểu cách thuật toán đánh giá các giải pháp.
  2. Tiến trình Có thể Quan sát: Bạn có thể thấy rõ ràng quần thể đang tiến hóa theo hướng giải pháp tối ưu.
  3. Nền tảng: Các nguyên tắc học được ở đây được áp dụng cho các bài toán tối ưu hóa phức tạp hơn rất nhiều.
  4. Gỡ lỗi (Debugging): Đây là một điểm chuẩn tuyệt vời để kiểm tra việc triển khai thuật toán di truyền.

Tìm hiểu Hàm Số Hình Cầu (Sphere Function) trong Thuật toán Di truyền

Hàm Số Hình Cầu (The Sphere Function) là một trong những hàm chuẩn mực đơn giản nhưng mạnh mẽ nhất được sử dụng để minh họa cách Thuật toán Di truyền (GAs) giải quyết các bài toán tối ưu hóa. Nó lý tưởng để hiểu các cơ chế cơ bản của tuyển chọn, lai ghép và đột biến, trước khi chuyển sang các trường hợp thử nghiệm phức tạp hơn.

Định nghĩa Toán học và Đặc tính

Hàm Số Hình Cầu là một ví dụ kinh điển về bài toán tối thiểu hóa đơn phương thức (unimodal) và lồi (convex).
Định nghĩa Chung (cho $n$ biến số):
$$f(\mathbf{x}) = \sum_{i=1}^{n} x_i^2$$
Trong đó:
- $f(\mathbf{x})$ là Giá trị Hàm số: Giá trị đầu ra của hàm số.
- $\mathbf{x}$ là Véc-tơ Đầu vào: Một véc-tơ gồm $n$ biến quyết định:
- $\mathbf{x} = (x_1, x_2, \ldots, x_n)$. Đây đại diện cho một giải pháp ứng viên duy nhất trong bài toán tối ưu hóa.
- $n$ là Số Chiều: Tổng số biến (hoặc gen trong một nhiễm sắc thể của thuật toán di truyền).$x_i$ là Biến Số Cá thể: Biến thứ $i$ trong véc-tơ.
- $\sum_{i=1}^{n}$ Phép Cộng (Sigma): Ký hiệu toán học có nghĩa là "tổng hợp tất cả các số hạng sau" bắt đầu từ $i=1$ đến $i=n$.
- $x_i^2$ là Số hạng Bình phương: Bình phương của biến thứ $i$.
Ví dụ 2 Chiều:

sphere.jpg

$$f(x) = x_1^2 + x_2^2$$
-> Mục tiêu Tối ưu hóa: Tối thiểu hóa $f(\mathbf{x})$
-> Cực tiểu Toàn cục (Global Minimum): $\mathbf{x} = (0, 0, \ldots, 0) \rightarrow$ khi $f(\mathbf{x}) = 0$

Tại sao đây là chuẩn mực "thân thiện với người mới bắt đầu":
- Chỉ có một thung lũng duy nhất -> không có bẫy cực tiểu địa phương.
- Mặt hàm nhẵn, lồi hoàn toàn → giống cái bát nghiêng hoàn hảo
- Thuật toán truyền thống như Gradient Descent cũng giải được
=> Nên rất dễ dùng để kiểm tra xem GA đang hoạt động đúng chưa

Các Kịch bản Triển khai và Mã hóa

Tùy thuộc vào thử nghiệm, Hàm Số Hình Cầu có thể được kiểm tra bằng các chiến lược mã hóa khác nhau:

Kịch bản Dạng gene Số biến (n) Không gian tìm kiếm Mục đích Đặc điểm
Integer Encoding Số nguyên ($\mathbb{Z}$) n = 2 Rời rạc Ví dụ: $x_i \in [0,100]$ Dùng trong bài toán tối ưu rời rạc, dễ triển khai
Floating-Point Encoding Số thực ($\mathbb{R}$) n = 6 hoặc hơn Liên tục Ví dụ: $x_i \in [-20, 20]$ Dùng để đánh giá GA trong không gian thực (thực tế hơn)

Đánh giá Fitness trong GA

Trong GA, ta cần chuyển đổi giá trị hàm mục tiêu thành điểm fitness (ưu tiên chọn cao hơn).
- Chi phí / Tổn thất $= f(\mathbf{x})$ (giá trị càng thấp càng tốt)
- Nhưng vì GA luôn chọn cá thể có fitness cao hơn, có thể đảo ngược giá trị bằng công thức:
$$ \text{Fitness}(\mathbf{x}) = \frac{1}{1 + f(\mathbf{x})}$$

=> Giá trị Hàm Số Hình Cầu (Sphere) càng nhỏ -> độ thích nghi càng cao -> cơ hội được chọn càng lớn.

Kết luận

Hàm Số Hình Cầu (Sphere) là một bài kiểm tra khởi đầu tuyệt vời để đánh giá Thuật toán Di truyền do cấu trúc trơn tru và dễ quan sát của nó. Sự đơn giản này cho phép các nhà nghiên cứu và thực hành cô lập và xác thực các cơ chế tiến hóa cốt lõi—tuyển chọn, lai ghép và đột biến—mà không bị can thiệp bởi cực tiểu địa phương hay nhiễu.

Mặc dù đơn giản, Hàm Số Hình Cầu đóng một vai trò nền tảng quan trọng. Nó đảm bảo rằng GA được triển khai chính xác trước khi chuyển sang các bài toán tối ưu hóa đa phương thức, phức tạp hơn hoặc trong thế giới thực, nơi cực tiểu toàn cục không rõ ràng và không gian tìm kiếm trở nên phức tạp hoặc gây hiểu lầm. Bằng cách thành công trước tiên với Hàm Số Hình Cầu, chúng ta thiết lập được sự tin tưởng vào tính đúng đắn và hành vi hội tụ của thuật toán, làm cho nó trở thành một điểm khởi đầu tự nhiên và thiết yếu trong bất kỳ quy trình thử nghiệm GA nào.

Dưới đây là bản dịch tiếng Việt của đoạn văn bạn cung cấp về việc giải quyết Hồi quy Tuyến tính bằng Thuật toán Di truyền (GA):

Bài toán Hồi quy Tuyến tính (Linear Regression) trong Thuật toán Di truyền (GA)

Thuật toán Di truyền (GAs) là các kỹ thuật tối ưu hóa mạnh mẽ lấy cảm hứng từ sự tiến hóa tự nhiên. Khác với Hồi quy Tuyến tính truyền thống, vốn dựa vào phép tính vi tích phân và tối ưu hóa Gradient (Gradient Descent), GA có thể khám phá các hệ số tối ưu mà không cần sử dụng đạo hàm — điều này làm cho nó trở nên lý tưởng cho các bài toán không khả vi (non-differentiable) hoặc nhiễu (noisy).

Các Bước Triển khai GA

A. Thiết kế Nhiễm sắc thể (Chromosome) : Nhiễm sắc thể phải mã hóa các biến quyết định ($a$ và $b$).
- Gen (Genes): Nhiễm sắc thể yêu cầu hai gen để đại diện cho các giá trị của $a$ và $b$.
- Quần thể (Population): Một tập hợp các nhiễm sắc thể (các cặp ứng viên của $(a,b)$) được tạo ra (Khởi tạo Quần thể).

B. Thiết kế Hàm Thích nghi (Fitness) : Hàm thích nghi đánh giá mức độ tốt của một nhiễm sắc thể — được đại diện bởi các hệ số $(a, b)$ — trong việc dự đoán giá nhà. Nó đóng vai trò là bảng điểm của Thuật toán Di truyền (GA), quyết định cá thể nào có nhiều khả năng sống sót và sinh sản hơn.

  1. Tính toán Sai số Dự đoán (Loss Calculation): Sử dụng các hệ số $(a,b)$ được mã hóa trong nhiễm sắc thể:
    Dựa trên chromosome $(a,b)$:
    - Dự đoán: Mô hình đầu tiên dự đoán giá $\hat{y}_i = a \cdot x_i + b$ cho mọi diện tích đầu vào $x_i$ trong tập dữ liệu.
    - Tính sai số: So sánh mỗi giá dự đoán $\hat{y}$ với giá thực tế tương ứng $y_{\text{true}}$. Sự khác biệt giữa chúng đại diện cho sai số dự đoán, được tích lũy bởi hàm tổn thất.
    - Mục tiêu Tối ưu hóa: Tổng tổn thất này đóng vai trò là chỉ số trực tiếp về hiệu suất mô hình — và tối thiểu hóa nó trở thành mục tiêu cốt lõi của Thuật toán Di truyền.
    - Hàm Loss: Hàm tổn thất có thể là Tổng Độ Lệch Tuyệt đối (Sum of Absolute Difference - SAD) (hoặc Tổng Sai số Tuyệt đối, SAE):
    $$ \text{Tổn thất} = \sum_{i=1}^{M} \left| y_{\text{true},i} - \left(a \cdot x_i + b\right) \right| $$

2.Tính toán Độ Thích nghi:
Vì GA hoạt động dựa trên nguyên tắc độ thích nghi cao hơn có nghĩa là một giải pháp tốt hơn, nên tổn thất phải được đảo ngược:
$$ \text{Độ thích nghi} = \frac{1}{(1 + \text{Tổn thất})} $$
$\Rightarrow$ Tổn thất càng thấp $\rightarrow$ độ thích nghi càng cao $\rightarrow$ cơ hội được chọn càng cao.

Số hạng "$1 +$" nhằm ngăn chặn phép chia cho số không khi tổn thất đạt đến giá trị tối ưu là $0$.

C. Tối ưu hóa :GA phát triển quần thể bằng cách sử dụng:
- Tuyển chọn (Selection): Ưu tiên các nhiễm sắc thể có tổn thất thấp hơn (độ thích nghi cao hơn).
- Lai ghép (Crossover): Trộn các gen của hai cha mẹ để tạo ra con cái mới.
- Đột biến (Mutation): Thay đổi nhẹ $a$ hoặc $b$ để khám phá không gian giải pháp.

Qua nhiều thế hệ, GA hội tụ về cặp hệ số ($a,b$) phù hợp nhất — giải quyết bài toán hồi quy mà không cần gradient hay phép tính vi tích phân.

So sánh giữa Thuật toán Di truyền (GA) và Tối ưu hóa Gradient (GD)

Thuật toán Di truyền (GAs)Tối ưu hóa Gradient (GD) là hai chiến lược tối ưu hóa khác biệt về cơ bản được sử dụng trong học máy và AI. Lựa chọn tốt nhất phụ thuộc vào đặc điểm của bài toán — cụ thể là liệu hàm mục tiêu có mịn và khả vi hay rời rạc, phức tạp, hoặc không rõ ràng.

1. Thuật toán Di truyền (GA): Phương pháp Tiến hóa

  • GA là một kỹ thuật tìm kiếm toàn cục (global search) dựa trên quần thể, lấy cảm hứng từ chọn lọc tự nhiên.
  • Nó là một phương pháp không cần đạo hàm (derivative-free) — nó không yêu cầu bất kỳ kiến thức nào về dạng toán học của hàm mục tiêu.

Tối ưu hóa Hộp đen (Black-Box Optimization)
- GA chỉ cần đầu vào (giải pháp ứng viên) và đầu ra (điểm độ thích nghi)
— Lý tưởng khi hàm số không rõ ràng hoặc không thể biểu diễn bằng toán học.

Cách làm của GA Vai trò
Đánh giá Độ thích nghi (Fitness evalution) Chấm điểm mức độ tốt của mỗi giải pháp.
Tuyển chọn (Selection) Chọn các cá thể thích nghi nhất làm "cha mẹ".
Lai ghép (Crossover) Kết hợp cha mẹ để tạo ra con cái được cải thiện (khai thác/exploitation).
Đột biến (Mutation) Đưa vào các thay đổi ngẫu nhiên để khám phá các khả năng mới (khám phá/exploration).
=> Như vậy GA vượt trội trong các không gian tìm kiếm không khả vi, rời rạc hoặc cực kỳ phức tạp.

image (3).png

2. Tối ưu hóa Gradient (GD): Cỗ Máy Giải Tích
- GD là một phương pháp xác định (deterministic), chặt chẽ về mặt toán học nhằm tìm kiếm cực tiểu của một hàm số mịn và khả vi (differentiable).
- Dựa trên Đạo hàm $\rightarrow$ Yêu cầu tính toán gradient (độ dốc của hàm số).
- Chiến lược Tối ưu hóa $\rightarrow$ Lặp đi lặp lại di chuyển xuống dốc, ngược hướng gradient.
- Tốc độ Học tập (Learning Rate) 4$\rightarrow$ Kiểm soát kích thước bước đi trong quá trình cập nhật.

=> Như vậy GD cực kỳ hiệu quả — nhưng chỉ khi không gian tối ưu hóa là mịn và lồi (giống như một cái bát có hình dạng hoàn hảo).

CleanShot 2025-10-19 at 10.21.17.png

Đặc điểm Tối ưu hóa Gradient (GD) Thuật toán Di truyền (GA)
Nguyên tắc Cốt lõi Phép tính vi tích phân & Đạo hàm Chọn lọc Tự nhiên & Tiến hóa
Yêu cầu Hàm số phải khả vi (differentiable) Chỉ cần điểm độ thích nghi (hộp đen)
Loại Tìm kiếm Tìm kiếm Cục bộ (Local Search) (nguy cơ mắc kẹt ở cực tiểu địa phương) Tìm kiếm Toàn cục (Global Search) (khám phá rộng)
Điểm mạnh Cực kỳ nhanh và chính xác cho các bài toán lồi (convex) Xử lý các bài toán rời rạc, nhiễu, hộp đen
Điểm yếu Có thể bị mắc kẹt ở cực tiểu địa phương Hội tụ chậm hơn; không phải lúc nào cũng chính xác về mặt toán học

Ứng dụng vào bài toán - Dự đoán Giá nhà

Để hiểu hơn về cách sử dụng thuật toán ta sẽ áp dụng vào một bài toán học máy phổ biến: dự đoán giá nhà.

Yêu cầu Tìm ra các trọng số ($W$) tốt nhất cho một tập hợp các đặc trưng (ví dụ: $diện tích\_sàn, số\_phòng\_ngủ$) để dự đoán giá.

$$\text{Giá} = (w_1 \cdot \text{diện tích\_sàn}) + (w_2 \cdot \text{số\_phòng\_ngủ}) + \dots + b$$

Mục tiêu: Tìm các trọng số $(W)$ sao cho Sai số Bình phương Trung bình (Mean Squared Error - MSE) giữa các dự đoán của chúng ta và giá thực tế được tối thiểu hóa.

image (4).png

Cách tiếp cận bằng Thuật toán Di truyền (GA)

Hàm Tổn thất (Độ Thích nghi): Chúng ta sử dụng cùng một MSE, nhưng định hình nó thành một "hàm thích nghi". Vì GA tối đa hóa độ thích nghi, chúng ta sẽ định nghĩa: $\text{Độ thích nghi} = \frac{1}{\text{MSE}}$ (hoặc $-\text{MSE}$).

Cơ chế hoạt động:

  • Khởi tạo: Tạo ra một "quần thể" gồm $100$ tập hợp trọng số ngẫu nhiên khác nhau (ví dụ: Cá thể $1 = [w_1: 0.5, w_2: 1.2]$; Cá thể $2 = [w_1: -0.1, w_2: 0.8]$, v.v.).
  • Đánh giá: Tính MSE (và do đó là độ thích nghi) cho tất cả $100$ cá thể.
  • Tuyển chọn: Chọn các cá thể "thích nghi nhất" (những cá thể có MSE thấp nhất) để làm "cha mẹ".
  • Lai ghép: Tạo ra "con cái" mới bằng cách kết hợp trọng số từ hai cha mẹ (ví dụ: lấy $w_1$ từ Cha mẹ A và $w_2$ từ Cha mẹ B).
  • Đột biến: Thay đổi ngẫu nhiên và nhẹ một số trọng số trong con cái để khám phá các khả năng mới.
  • Lặp lại: Thế hệ mới này thay thế thế hệ cũ. Quá trình lặp lại trong nhiều thế hệ.

Kết quả: Quần thể sẽ "tiến hóa" theo hướng các tập hợp trọng số tạo ra MSE rất thấp. GA thực sự có thể tìm ra một giải pháp tốt như GD, nếu có đủ thời gian.

Python code

### GENETIC ALGORITHM ###
def calculate_mse(W, X, y):
    y_pred = np.dot(X, W)
    return mean_squared_error(y, y_pred)

# Bước 1: Khởi tạo quần thể (Population Initialization)
def initialize_population(pop_size, num_weights):
    population = []
    for _ in range(pop_size):
        # Khởi tạo ngẫu nhiên các trọng số
        individual = np.random.uniform(-10, 10, num_weights)
        population.append(individual)
    return np.array(population)

# Bước 2: Đánh giá cá thể (Evaluation)
def evaluate_population(population, X, y):
    fitness_scores = []
    for individual in population:
        mse = calculate_mse(individual, X, y)
        fitness_scores.append(mse)
    return np.array(fitness_scores)

# Bước 3: Chọn lọc (Selection)
def selection(population, fitness_scores):
    # Chọn ngẫu nhiên 2 cá thể
    idx1, idx2 = random.sample(range(len(population)), 2)

    # Cá thể nào có fitness tốt hơn sẽ được chọn
    if fitness_scores[idx1] < fitness_scores[idx2]:
        return population[idx1]
    else:
        return population[idx2]

# Bước 4: Lai ghép (Crossover/Mating)
def crossover(population, fitness_scores, offspring_size):
    offspring = []
    for _ in range(offspring_size):
        # Chọn trực tiếp 2 cha mẹ bằng tournament selection
        parent1 = selection(population, fitness_scores)
        parent2 = selection(population, fitness_scores)

        # Lai ghép các gene từ 2 cha mẹ
        child = np.empty(population.shape[1])
        for i in range(population.shape[1]):
            if random.random() < 0.5:
                child[i] = parent1[i]
            else:
                child[i] = parent2[i]
        offspring.append(child)
    return np.array(offspring)

# Bước 5: Đột biến (Mutation)
def mutation(offspring, mutation_rate=0.1):
    for individual in offspring:
        if random.random() < mutation_rate:
            # Chọn ngẫu nhiên một gene để đột biến
            gene_idx = random.randint(0, len(individual) - 1)
            individual[gene_idx] += np.random.uniform(-0.5, 0.5)
    return offspring

Cách tiếp cận bằng Tối ưu hóa Gradient (GD) (Phương pháp Tiêu chuẩn)

Hàm Tổn thất: MSE là một hàm mịn, liên tục và lồi ("hình cái bát"). Đây là một kịch bản hoàn hảo cho GD.

Cơ chế hoạt động:

  1. GD bắt đầu với các trọng số ngẫu nhiên.
  2. Nó tính toán đạo hàm (gradient) của MSE đối với từng trọng số. Gradient này cho nó biết "độ dốc" của sai số.
  3. Nó cập nhật các trọng số bằng cách thực hiện một bước nhỏ theo hướng ngược lại với gradient (tức là "xuống dốc" trên đường cong sai số).
  4. Nó lặp lại điều này cho đến khi nó đạt đến đáy của "cái bát", nơi gradient bằng không và MSE ở mức tối thiểu.

Kết quả: GD cực kỳ hiệu quả và được đảm bảo tìm ra cực trị tối ưu toàn cục duy nhất cho loại bài toán này.

Python code

### GRADIENT DESCENT ###
class LinearRegressionGD:
    def __init__(self, learning_rate=0.01, epochs=1000):
        self.learning_rate = learning_rate
        self.epochs = epochs
        self.W = None

    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.W = np.zeros((n_features, 1))  # Khởi tạo trọng số dưới dạng cột

        y = y.reshape(-1, 1)  # Đảm bảo y có kích thước là (n_samples, 1)

        for epoch in range(self.epochs):
            y_pred = X.dot(self.W)  # Dự đoán

            # Gradient của hàm mất mát (mean squared error)
            gradient = -(2/n_samples) * X.T.dot(y - y_pred)

            # Cập nhật trọng số theo gradient descent
            self.W -= self.learning_rate * gradient

            if epoch % 100 == 0:
                mse = np.mean((y_pred - y) ** 2)
                print(f"Epoch {epoch}: MSE = {mse}")

    def predict(self, X):
        return X.dot(self.W)

# Triển khai gradient descent
gd_model = LinearRegressionGD(learning_rate=0.01, epochs=1000)
gd_model.fit(X_train, y_train)
y_pred_gd_train = gd_model.predict(X_train)
y_pred_gd_test = gd_model.predict(X_test)

# Tính MSE của Gradient Descent
mse_gd_train = mean_squared_error(y_train, y_pred_gd_train)
mse_gd_test = mean_squared_error(y_test, y_pred_gd_test)
print(f"MSE của Gradient Descent (train): {mse_gd_train}")
print(f"MSE của Gradient Descent (test): {mse_gd_test}")

Nên chọn Phương pháp nào?

Đối với bài toán Dự đoán Giá nhà, Gradient Descent là lựa chọn thắng thế rõ ràng. Bài toán này có tính chất khả vi (differentiable), và GD nhanh hơn đáng kể, trực tiếp hơn, và chính xác hơn. Sử dụng GA cho bài toán này giống như việc dùng một chiếc xe địa hình phức tạp để lái trên một đường cao tốc bằng phẳng, trống trải.

Bạn nên sử dụng Thuật toán Di truyền (GA) khi bài toán của bạn phức tạp, không khả vi (non-differentiable), hoặc có nhiều cực trị địa phương (local optima).

Ví dụ trong AI Trò chơi:
- "Đạo hàm" của việc nhảy so với không nhảy là gì? Khái niệm này không áp dụng.
- "Bề mặt thích nghi" (fitness landscape) vô cùng phức tạp và gồ ghề.

GA là hoàn hảo ở đây vì nó có thể khám phá nhiều chiến lược cùng lúc (quần thể) và không bị lừa bởi "cực trị địa phương" (một chiến lược hoạt động trong chốc lát nhưng không phải là tốt nhất về tổng thể).

Ứng dụng và Ví dụ của Thuật toán Di truyền

GA vượt trội trong việc giải quyết các kịch bản tối ưu hóa phức tạp, đặc biệt là những kịch bản liên quan đến nhiều ràng buộc hoặc mục tiêu đa đối tượng (multi-objective goals) (bề mặt thích nghi đa phương thức/multi-modal landscapes).

Lĩnh vực Ứng dụng Ví dụ Cụ thể
Lập kế hoạch & Hậu cần Giải quyết Bài toán Người du lịch (TSP), Lập thời khóa biểu/Lịch trình phức tạp (ví dụ: thời khóa biểu đại học), thường liên quan đến tối ưu hóa đa mục tiêu để tránh xung đột và tối ưu hóa tài nguyên.
Khoa học Máy tính & Phân bổ Tài nguyên Bài toán Cái túi (Knapsack Problem - tối đa hóa lợi nhuận với ràng buộc về trọng lượng), Định tuyến Đa hướng (giảm thiểu chi phí cây), và Phân bổ Tài nguyên (tối đa hóa mức sử dụng).
Kỹ thuật & Thiết kế Tối ưu hóa các cấu trúc phức tạp (Thiết kế cầu, Cấu trúc tòa nhà), Thiết kế Hệ thống Hàng không (Thiết kế cánh, tàu vũ trụ), và Thiết kế Mạch điện.
Tin sinh học Ứng dụng trong khám phá thuốc (nhiễm sắc thể đại diện cho công thức thuốc), gấp cuộn protein, và chẩn đoán ung thư.
Trí tuệ Nhân tạo & Nghệ thuật Huấn luyện các tác nhân AI (ví dụ: Cờ đam Tiến hóa, trò chơi NERO), và tạo ra nghệ thuật thông qua tương tác người-máy (Nghệ thuật Tiến hóa, GenJam).

Nguồn tham khỏa