Làm thế nào để tránh bị mắc kẹt trên tối ưu cục bộ, đối với các thuật toán di truyền


7

Tôi đang lập trình một thuật toán di truyền bằng cách sử dụng tiến hóa ngữ pháp. Vấn đề của tôi là tôi đạt được các giá trị tối ưu cục bộ (hội tụ sớm) và khi điều đó xảy ra, tôi không biết phải làm gì. Tôi đang suy nghĩ về việc tăng tỷ lệ đột biến (5% là giá trị mặc định), nhưng tôi không biết cách quyết định khi nào cần thiết.

Dữ liệu tôi có trên mỗi thế hệ là một mảng hai chiều có cột đầu tiên là sự phù hợp của nó

adn[i][0] ← fitness 
row → is the values of the Grammar
column ↓ Each indiviual result

Nếu bạn cần làm rõ, xin vui lòng hỏi và tôi sẽ hài lòng về việc sửa đổi. Lưu ý rằng đây không phải là ngôn ngữ mẹ tôi và xin lỗi vì những sai lầm và sự bất tiện.

Trả lời một yêu cầu, các hoạt động của tôi là như sau và chính xác theo thứ tự này:

  • Tôi tạo một Dân số ngẫu nhiên (Một ma trận có số ngẫu nhiên)
  • Tôi tạo ra một ma trận chứa kết quả mong muốn. Để thực hiện điều này, tôi đã triển khai một vài hàm có tỷ lệ biến thể + -5%, ví dụ: fun (x) = (2 * cos (x) + sen (x) - 2X) * (0,95+ (một số dao động trong khoảng từ 0 đến 0,1) , x chứa mọi f (x) với tuần tự từ 0 đến N (Là N kích thước của hàng), y chứa chính xác (nhiều kết quả hơn)
  • Bắt đầu thuật toán (các thế hệ bắt đầu thay đổi

Những hành động tạo nên mọi thế hệ là:

  • Đột biến: Một số ngẫu nhiên của mỗi cromosome có thể đột biến trên bất kỳ gen nào → adn [i] [ngẫu nhiên] = số ngẫu nhiên (với 5% khả năng xảy ra điều này)
  • Crossover: Tôi lai mọi adn với adn khác (80% là cơ hội đột biến cho mỗi cặp), để ghép đôi tôi chọn một số ngẫu nhiên và đối mặt với adn [i] và adn [(i + j) mod NumADNs]
  • Phiên dịch. Tôi nhận được một ma trận chứa các giá trị f (0 đến N) tạo ra trong một bước phiên mã và dịch lời xin lỗi ngữ pháp trên hình ảnh

    ngữ pháp

-fitness: Tôi so sánh các giá trị thu được với những giá trị dự kiến ​​và cập nhật thể lực.

-Elitism: Sau đó, tôi chọn 4 quảng cáo tốt nhất và đưa nó lên đầu, họ sẽ được chọn

-Selection: Bất kỳ adn không tinh hoa nào cũng sẽ phải đối mặt với một adn hoàn toàn ngẫu nhiên, và nếu thể lực của nó thấp hơn (Thấp hơn là tốt hơn) sẽ thắng thế, là một khả năng của một kẻ xấu còn sống sót


1
Tiêu đề của bạn hỏi về cách nhận biết bạn có ở trạng thái tối ưu cục bộ hay không - không còn thay đổi nào sau một số lần lặp, nhưng cơ thể sẽ hỏi phải làm gì - thêm một số kỹ thuật tối ưu toàn cầu. Tôi đã hiểu đúng chưa?
Ác

@EvilJS Vâng, đó là chính xác, thuật toán của tôi tiếp tục chạy nhưng không có thay đổi liên quan.
Kaostias

Vì vậy, bạn theo dõi số lần lặp mà không thay đổi và khi điều này lớn hơn ngưỡng đã cho, bạn dừng tính toán, trong trường hợp của bạn thay vì dừng, bạn có thể tăng tỷ lệ đột biến và thử lại. Nếu bạn chỉ thử giải pháp để tăng tỷ lệ đột biến - hãy cho nó một số lần lặp và đặt nó thành giá trị mặc định.
Ác

Tôi có ấn tượng rằng bạn đang trộn lẫn thứ tự của các hoạt động.
Auberon

Một bộ gen ngẫu nhiên trong mỗi đợt
t123

Câu trả lời:


9

Có vẻ như bạn đang đối phó với sự hội tụ sớm .

Nói cách khác, dân số của bạn tự lấp đầy với các cá nhân đại diện cho giải pháp tối ưu và / hoặc các cá nhân (quá) gần với giải pháp đã nói.

Khung cơ bản của thuật toán di truyền như sau:

P <- Population of size N with N random individuals.
evaluate fitness of all individuals in P
while (stopping criteria not met) {
    C <- empty Child set of size M
    while (size of C is not M) {
        parent1 <- select an individual from P
        parent2 <- select an individual from P

        child1, child2 <- combine parent1 and parent2 somehow.
        child1, child2 <- mutate children by chance
        evaluate fitness of child1, child2
        C <- C + child1 + child2
    }
    P <- combine P and C. (P remains size N)
}
return individual with best fitness

Lưu ý rằng (ví dụ) kích thước dân số / trẻ em không nhất thiết phải là không đổi cho mỗi gia nhập . Hoặc bạn có thể kết hợp một số lượng cha mẹ khác nhau thành một số lượng con khác nhau (ví dụ: sự giao thoa giữa 5 cha mẹ dẫn đến 7 con). Nhưng tôi sẽ giữ nó đơn giản, lúc đầu.

Như bạn có thể thấy, các toán tử chính trong một thuật toán di truyền, theo thứ tự

  • Lựa chọn : Chọn các cá nhân trong quần thể sẽ được kết hợp. Ví dụ: lựa chọn giải đấu , lựa chọn tỷ lệ , lựa chọn cắt ngắn , ...
  • Crossover : Kết hợp các cá nhân được lựa chọn (cha mẹ) với những người mới (trẻ em). Ví dụ: chéo một điểm , chéo n điểm , chéo chéo đồng nhất , cắt và nối , ...
  • Đột biến : Tình cờ, (không) đột biến một cá thể bằng cách thay đổi cá thể một chút.
  • Tái hợp : Bằng cách nào đó chèn con cái vào tập hợp của cha mẹ. Ví dụ: Thêm tất cả trẻ em vào dân số, sắp xếp mọi thứ theo thể lực và loại bỏ những cá thể xấu nhất để dân số của bạn có kích thước N một lần nữa; Sắp xếp dân số của bạn và thả những cá nhân M tồi tệ nhất và thêm tất cả trẻ em; thường các kỹ thuật tương tự được trình bày trong giai đoạn lựa chọn được sử dụng.

Trong mô tả của bạn, bạn nhầm lẫn nhiều bước như thể đó là một bước (ví dụ: bạn bỏ qua bước lựa chọn nhưng bạn đưa nó vào bước chéo ). Bạn cũng mô tả các kỹ thuật như thể đó là một bước của thuật toán (ví dụ Elitism là một kỹ thuật được sử dụng trong bước tái hợp để đảm bảo rằng ít nhất những cá nhân tốt nhất không chết).

Một ví dụ trong đó sự hội tụ sớm có thể / sẽ xảy ra là khi bạn chỉ chọn những cá thể tốt nhất làm cha mẹ và chỉ cho phép những cá thể tốt nhất sống sót (trong bước tái hợp ).

Một số phương pháp có thể để giải quyết điều này:

  • Tăng tỷ lệ đột biến . Tuy nhiên, một đột biến thường là một quá trình rất ngẫu nhiên. Bạn sẽ cần may mắn 'thuần túy' để thoát khỏi giải pháp tối ưu.
  • Thiết kế lại hoạt động di truyền của bạn . ví dụ: cho phép các cá nhân / con cái thể dục xấu sống sót qua thế hệ thường xuyên hơn. Có thể là bạn hiện đang chọn quá nhiều cá nhân tốt để tồn tại. Đừng để quá nhiều cá nhân xấu tồn tại, hoặc thuật toán của bạn sẽ không bao giờ hội tụ thành một cái gì đó tốt.
  • (...)

Mục tiêu là tăng gấp đôi các hoạt động di truyền của bạn theo cách mà ở mỗi thế hệ tiếp theo, thể lực trung bình của dân số của bạn (tốt nhất là) tăng lên trong khi duy trì một biến thể thể dục đủ lớn. Điều này không dễ dàng.

Có một số phương pháp khác để tránh hội tụ sớm nếu cách trên không giúp bạn thoát ra. Tuy nhiên, tôi thực sự khuyên bạn nên thử nghiệm thay đổi hoạt động di truyền của bạn trước khi thực hiện việc này. Thuật ngữ tìm kiếm: chọn lọc trước , đông đúc , chia sẻ thể dục , phòng chống loạn luân , ...


Chà, thuật ngữ " tối ưu cục bộ đã được sử dụng trong các bài báo và sách, ví dụ ở đây từ lâu. Thuật ngữ này hơi quá tải nhưng nó được sử dụng và có ý nghĩa.
Evil

Tôi sẽ thử các giải pháp giả còn sống sót thêm một chút nữa (tôi đã phá hủy nó ngay lập tức khi đối đầu với một giải đấu tốt hơn trong giải đấu ngẫu nhiên) Đó sẽ là một tỷ lệ vượt qua tốt cho giải pháp xấu?
Kaostias

@Kaostias Bạn có thể chỉnh sửa câu trả lời của bạn và mô tả ngắn gọn về hoạt động di truyền của bạn (chọn lọc, tái tổ hợp, đột biến, thay thế, ...) không? Bằng cách này, chúng tôi có thể phát hiện một nguyên nhân có thể của sự hội tụ sớm.
Auberon

@Auberon xong, xin lỗi vì tiếng Anh không tốt, tôi thiếu rất nhiều từ đồng nghĩa.
Kaostias

@Kaostias Tôi đã thay đổi câu trả lời của tôi thành điều tôi nghĩ sẽ thú vị nhất đối với bạn.
Auberon

1

Nếu bạn tăng tỷ lệ đột biến, bạn có thể thoát khỏi tối ưu cục bộ, tìm kiếm nhiều khả năng hơn nhưng có sự đánh đổi - với tốc độ hội tụ đột biến cao hơn sẽ thay đổi và với tốc độ quá cao, nó sẽ ngừng hội tụ.
Khi kết quả dừng thay đổi đối với một số lần lặp lại - đây là khi bạn dừng lại, vì vậy đó cũng là thời điểm để bắt đầu tìm kiếm mới.
Tôi sẽ đề xuất kết hợp GA với SA để tìm tối ưu toàn cầu.
Giải pháp hacky hoạt động là ghi nhớ tối ưu cục bộ và khởi động lại (biến đổi hoặc tái khởi động lại), nhưng sau khi nó loại bỏ công cụ thu hút - giảm tỷ lệ đột biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.