Chương 2. Giải thuật di truyền và ứng dụng đối với bài toán vận tải
2.6. Thuật toán di truyền kinh điển
2.6.1. Mã hóa
GA kinh điển sử dụng mã hóa nhị phân, mỗi cá thể được mã hóa là một chuỗi nhị phân có chiều dài cố định.
Sử dụng véc tơ nhị phân có độ dài L như một NST để biểu diễn giá trị của biến x ∈ [lx, ux] (độ dài L của NST phụ thuộc vào yêu cầu cụ thể của bài toán). Một bit mã hóa x ứng với một giá trị trong khoảng [0,2L] sẽ được ánh xạ lên giá trị thực thuộc miền [lx, ux].
Tỷ lệ co giãn của ánh xạ: g = ux−lx
2L .
Giá trị x tương ứng với chuỗi NST nhị phân là:
x = lx+decimal(N ST)∗g
decimal(N ST) là giá trị thập phân của chuỗi NST nhị phân.
Để khởi tạo quần thể chỉ cần tạo pop_size (kích cỡ quần thể) NST ngẫu nhiên theo từng bit. Tiếp theo, lượng giá từng NST (tính giá trị hàm f trên các chuỗi biến nhị phân đã được giải mã), chọn quần thể mới thỏa mãn phân bố xác suất dựa trên độ thích nghi và thực hiện các phép đột biến và lai tạo để tạo các cá thể thế hệ mới. Sau một số thế hệ, nếu không được cải thiện thêm gì nữa, NST tốt nhất sẽ được xem như lời giải tối ưu (thường là toàn cục). Thông thường sẽ cho dừng thuật giải di truyền sau một số bước lặp cố định tùy thuộc vào điều kiện về tốc độ hay tài nguyên máy tính.
2.6.2. Toán tử chọn lọc
a. Sử dụng bánh xe Roulette
Có nhiều cách để thực hiện toán tử chọn lọc, chủ yếu theo cách nếu các cá thể có độ thích nghi cao hơn thì khả năng được chọn nhiều hơn.
Tuy nhiên, để đơn giản và hiệu quả nhất là sử dụng bánh xe Roulette.
Mỗi cá thể trong quần thể chiếm một khe có độ rộng tỷ lệ thuận với giá trị phù hợp. Độ rộng của khe được tính bằng tỷ lệ % giá trị phù hợp của một cá thể trên tổng giá trị phù hợp toàn quẩn thể.
Giả sử fi là độ phù hợp của cá thể thứ i trong quần thể gồm N cá thể. Khi đó, cá thể i sẽ được chọn với xác suất: pi = fi
N
X
i=1
fi .
b. Thủ tục xếp hạng các cá thể
Trong thủ tục này các cá thể được sắp xếp theo giá trị của hàm mục tiêu. Cá thể đầu tiên là cá thể tốt nhất, cá thể cuối cùng là cá thể tồi nhất.
Cá thể thứ (N −j) trong dãy có xác suất chọn lựa: pN−j = j
N
X
k=1
k .
Các bước tiến hành thủ tục là:
- Sắp xếp các chuỗi theo thứ tự giảm dần của hàm mục tiêu (bài toán cực đại) hoặc theo thứ tự tăng dần của hàm mục tiêu (bài toán cực tiểu).
- Tính độ phù hợp của chuỗi.
c. Thủ tục chọn lọc cạnh tranh
Trong thủ tục này cách tiến hành như sau:
- Chọn t cá thể từ quần thể hiện tại một cách ngẫu nhiên và chọn cá thể tốt nhất trong t cá thể đó để sao chép sang quần thể tạm thời.
- Lặp lại bước trên N lần sẽ được quần thể tạm thời.
Giá trị t khi đó gọi là kích cỡ của chọn lọc cạnh tranh. Khi t = 2 ta có chọn lọc cạnh tranh nhị phân.
2.6.3. Toán tử lai ghép
a. Lai ghép một điểm
Giả sử với hai cá thể cha và mẹ đã được chọn P1, P2:
P1 = (1011011111), P2 = (0111001001),độ dài L = 10
Toán tử này cần sinh ngẫu nhiên một vị trí k với (1 < k < L), sau đó hai cá thể con được tạo thành bằng cách tráo đổi các gen của cặp cha mẹ tính từ điểm cắt.
Giả sử điểm cắt đã chọn k = 7, hai con được sinh ra như sau:
C1 = (1011011001), C2 = (0111001111)
Thủ tục lai ghép một điểm:
Procedure lai1diem(k, P1, P2;var C1, C2);
Begin
For i := 1 to k do Begin
C1[i] := P1[i];
C2[i] := P2[i];
End;
For i := k+ 1 to L do Begin
C1[i] := P2[i];
C2[i] := P1[i];
End;
End;
b. Lai ghép nhiều điểm
Lai ghép nhiều điểm thực hiện tương tự lai ghép một điểm. Với hai cá thể cha mẹ đã chọn P1, P2, toán tử này cần sinh ngẫu nhiên k vị trí i1, i2, ..., ik (giả thiết i1 < i2 < ... <ik). Các điểm cắt chia các cá thể đã chọn thành các đoạn được đánh số chẵn và lẻ. Hai cá thể con được tạo thành bằng cách tráo đổi các gen cha mẹ tùy theo đoạn chẵn hay đoạn lẻ.
Giả sử:
P1 = (1001110101), P2 = (0100111110)
là hai chuỗi nhị phân độ dài 10, giả sử các điểm cắt đã chọn là 2, 4, 6, 9 khi đó hai con được sinh ra là :
C1 = (1000111111), C2 = (0101110100) Thủ tục lai ghép được viết tương tự như trên.
c. Lai ghép mặt nạ
Từ hai cá thể cha mẹ đã chọn P1, P2 và phát sinh một chuỗi nhị phân ngẫu nhiên cũng có độ dài L gọi là chuỗi mặt nạ. P1 = (1010111001), P2 = (1111010010), U = (0101110011), độ dài L = 10.
Các con được tạo ra dựa trên chuỗi mặt nạ này để quyết định lấy thành phần của cá thể cha hay cá thể mẹ dựa trên nguyên tắc:
Gen thứ i của cá thể con C1 được lấy gen thứ i của P1 nếu bit mặt nạ tương ứng là 1 và lấy gen thứ i của P2 nếu bit mặt nạ là 0. C2 thì ngược lại.
C1 = (1010110001), C2 = (1111011010) Thủ tục lai ghép mặt nạ:
Procedure laimatna(U, P1, P2;var C1, C2);
Begin
For i := 1 to L do Begin
If U[i] := 1 then Begin
C1[i] := P1[i];C2[i] := P2[i];
End Else
Begin
C1[i] := P2[i];C2[i] := P1[i];
End;
End;
End;
2.6.4. Toán tử đột biến
Toán tử đột biến làm thay đổi các thông tin của quần thể ở mức bit (gen). Đột biến làm thay đổi giá trị của một bit bất kỳ theo xác suất pm. Mỗi bit đều có cơ hội đột biến như nhau.
Toán tử đột biến bao gồm: toán tử đột biến chuẩn, đột biến đều và không đều.
Thuật toán đột biến:
For i := 1 to m do
If random[0,1] < pm then invert(parent[i]);
Với invert(u) là hàm đảo ngược bít u
Thuật toán GA cổ điển được mô tả một cách tường minh như sau:
Algorithm GA_codien;
Begin
{Khởi tạo quần thể gồm m quần thể}
t := 0;
Creat initial population B0 = (b10, b20, ..., bm0);
While (stopping condition not fulfilled) do Begin
{Chọn lọc tỷ lệ}
For i := 1 to m do Begin
r := random [0,1];
k := 1;
While (k < m and r <
i
X
j:=1
f(bj, t)
m
X
j:=1
f(bj, t)
) do k := k + 1;
bi,t+1 := bk; End;
{Lai ghép 1 điểm}
For i := 1 to m−1 step 2 do Begin
If random [0,1] < pc then Begin
pos:=random {1, ..., n−1};
for k :=pos+1 to n do Begin
aux := bit+1[k];
bit+1[k] := bi+1t+1[k];
bi+1t+1[k] := aux;
End;
End;
End;
{Đột biến}
For i := 1 to m do For k := 1 to n do
If random [0,1] < pm then Invert(bit+1[k]);
t:= t+ 1;
End;