1
ĐẠI HỌC THÁI NGUYÊN
TRƢỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
ĐẶNG THỊ MINH PHƢƠNG
BIỂU DIỄN NHIỄM SẮC THỂ TRONG GIẢI THUẬT
DI TRUYỀN VÀ CÁC TOÁN TỬ DI TRUYỀN
CHUYÊN BIỆT
Chuyên ngành: Khoa học máy tính
Mã số: 60.48.01
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
LỜI NÓI ĐẦU
Đặt vấn đề 3
Cho đến nay đã có nhiều thuật toán tìm lời giải tối ưu cho nhiều lĩnh vực
bài toán, ví dụ như trong bài toán tìm kiếm trên danh sách, cây, đồ thị các nhà
khoa học đã đưa ra thuật toán tìm kiếm quay lui, vét cạn. Các thuật toán này
tuy tìm được nghiệm tối ưu nhưng chỉ áp dụng được cho các bài toán có
không gian tìm kiếm nhỏ.
Để khắc phục các hạn chế như trên các nhà khoa học cũng đã đưa ra các
thuật toán tìm kiếm heurictics, đây là thuật toán có sử dụng các tri thức về
lĩnh vực bài toán để nhằm giảm thời gian tìm kiếm. Tuy nhiên các thuật toán
này lại vấp phải một vấn đề là các tri thức thường là kinh nghiệm của con
người, do đó nó có thể chưa chính xác, đầy đủ và điều này có thể dẫn tới sự
chệch hướng trong quá trình tìm kiếm.
Giải thuật di truyền là một trong những kỹ thuật tìm kiếm tối ưu giúp ta
giải quyết được những vấn đề đã đặt ra ở trên, nó cho phép ta tìm kiếm lời
giải tối ưu trên các không gian lớn, nguyên tắc cơ bản của giải thuật di truyền
là mô phỏng quá trình chọn lọc của tự nhiên. Cho đến nay lĩnh vực nghiên
cứu về giải thuật di truyền đã thu được nhiều thành tựu, giải thuật di truyền
được ứng dụng trong nhiều lĩnh vực phức tạp, các vấn đề khó có thể giải
quyết được bằng phương pháp thông thường.
Với những khả năng tiềm tàng của giải thuật di truyền đã là động lực và
lý do chính để tác giả chọn đề tài “Biểu diễn nhiễm sắc thể trong giải thuật
di truyền và các toán tử di truyền chuyên biệt”.
Mục tiêu của đề tài
- Nghiên cứu các khái niệm cơ bản của giải thuật di truyền.
- Nghiên cứu một số phương pháp biểu diễn nhiễm sắc thể trong giải
thích nghi với môi trường hơn thì sẽ tồn tại và sinh sản với số lượng ngày
càng nhiều hơn, trái lại những loài không thích nghi với môi trường sẽ dần
dần bị diệt chủng.
Môi trường tự nhiên luôn biến đổi, nên cấu trúc nhiễm sắc thể cũng thay
đổi để thích nghi với môi trường và ở thế hệ sau luôn có độ thích nghi cao
hơn ở thế hệ trước. Cấu trúc này có được nhờ vào sự trao đổi thông tin ngẫu
nhiên với môi trường bên ngoài hay giữa chúng với nhau.
Dựa vào đó các nhà khoa học máy tính xây dựng nên một giải thuật tìm
kiếm tinh tế dựa trên cơ sở chọn lọc tự nhiên và quy luật tiến hóa gọi là giải
thuật di truyền.
Các nguyên lý cơ bản của giải thuật được tác giả Holland đề xuất lần đầu
vào năm 1962. Nền tảng toán học của giải thuật GA được tác giả công bố
trong cuốn sách “Sự thích nghi trong các hệ thống tự nhiên và nhân tạo” xuất
bản năm 1975.
Giải thuật GA được xem như một phương pháp tìm kiếm có bước
chuyển ngẫu nhiên mang tính tổng quát để giải các bài toán tối ưu hoá. [1, 2]
6
1.2. Các khái niệm cơ bản của giải thuật di truyền
1.2.1. Giới thiệu chung
Giải thuật GA thuộc lớp các giải thuật tìm kiếm tiến hoá. Khác với phần
lớn các giải thuật khác tìm kiếm theo điểm, giải thuật GA thực hiện tìm kiếm
song song trên một tập được gọi là quần thể các lời giải có thể.
Thông qua việc áp dụng các toán tử di truyền, giải thuật GA tráo đổi
thông tin giữa các cực trị và do đó làm giảm thiểu khả năng kết thúc giải thuật
tại một cực trị địa phương. Trong thực tế, giải thuật GA đã được áp dụng
thành công trong nhiều lĩnh vực.
Giải thuật GA lần đầu được tác giả Holland giới thiệu vào năm 1962.
1.2.2. Giải thuật di truyền đơn giản [1, 2, 3]
Trong giải thuật di truyền của mình J. H. Holland sử dụng mã hoá nhị
phân để biểu diễn các cá thể, lý do là phần lớn các bài toán tối ưu hoá đều có
thể được mã hoá thành chuỗi nhị phân khá đơn giản.
Hàm mục tiêu, hàm cần tối ưu, được chọn làm cơ sở để tính độ phù hợp
của từng chuỗi cá thể. Giá trị độ phù hợp của từng cá thể sau đó được dùng để
tính toán xác suất chọn lọc.
Sơ đồ chọn lọc trong giải thuật SGA là sơ đồ chọn lọc tỷ lệ. Trong sơ đồ
chọn lọc này, cá thể có độ phù hợp
i
f
có xác suất chọn lựa
N
j
jii
ffp
1
/
, ở đây N là số cá thể có trong quần thể.
Toán tử lai ghép trong giải thuật SGA là toán tử lai ghép một điểm cắt.
Giả sử chuỗi cá thể có độ dài L (có L bít), toán tử lai ghép được tiến hành qua
hai giai đoạn là:
8
1 0 0 1 1 1 0 1 0 1
0 1 0 0 1 1 1 1 1 0
1 0 0 1 1 1 0 1 1 0
0 1 0 0 1 1 1 1 0 1
Hai cá thể bố mẹ
Hai cá thể con 9
Sơ đồ tổng thể của giải thuật SGA được thể hiện qua thủ tục GSA() trình
bày dưới đây.
Thủ tục SGA () /* Giải bài toán tối ưu */
{ k = 0;
// Khởi tạo quần thể P
0
một cách ngẫu nhiên.
khởi_tạo (P
k
);
// Tính giá trị hàm mục tiêu cho từng cá thể.
tính_hàm_mục_tiêu (P
k
);
// Đặt lời giải của giải thuật bằng cá thể có giá trị hàm mục tiêu tốt nhất.
X
best
= tốt_nhất (P
k
);
do { // Chuyển đổi giá trị hàm mục tiêu thành giá trị độ phù hợp và
thì thay thế lời giải
X = tốt_nhất (P
k
);
if ( obj (X) > obj (X
best
) ) X
best
= X;
} while ( k < G); /* Tiến hành G thế hệ */ 10
return (X
best
); /* Trả về lời giải của giải thuật GA*/
}
Giải thuật di truyền phụ thuộc vào bộ 4 (N, p
c
, p
m
, G), trong đó:
N - số cá thể trong quần thể; p
c
- xác suất lai ghép;
p
m
- xác suất đột biến; G - số thế hệ cần tiến hoá.
Đó chính là các tham số điều khiển của giải thuật SGA. Cá thể có giá
trị hàm mục tiêu tốt nhất của mọi thế hệ là lời giải cuối cùng của giải thuật
2
1 1 0 0 0
24
576
2
3
0 1 0 0 0
8
64
0
4
1 0 0 1 1
19
361
1 11
Thực hiện quá trình lai ghép với xác suất lai ghép p
c
=1, cả 4 cá thể sau
chọn lọc đều được lai ghép.
Kết quả lai ghép được cho trong bảng sau, trong bảng này, chuỗi thứ
nhất được lai ghép với chuỗi thứ hai với điểm lai ghép là 4, hai chuỗi còn lại
được lai ghép với nhau với điểm ghép là 2.
Quần thể sau
chọn lọc
Điểm
ghép
Quần thể sau
nào được đột biến.
Như vậy thế hệ quần thể mới là quần thể sau lai ghép.
Trong thế hệ ban đầu độ thích nghi cao nhất là 576, độ thích nghi trung
bình là 292. Trong thế hệ mới, độ thích nghi cao nhất là 729, độ thích nghi
trung bình là 438. Như vậy chỉ qua một thế hệ, các cá thể đã “tốt lên” rất
nhiều.
Kết luận chƣơng 1:
Chương 1 đã đưa ra các khái niệm cơ bản của giải thuật di truyền, thông
qua một ví dụ minh hoạ ta có thể thấy khả năng ứng dụng của giải thuật di
truyền trong các bài toán tối ưu. Ngoài ra đây là cách thức quan trọng giúp ta
có thể tiếp tục nghiên cứu sâu hơn nữa về giải thuật di truyền mà luận văn đề
cập ở chương 2. 12
Chƣơng 2
CÁC PHƢƠNG PHÁP BIỂU DIỄN NHIỄM SẮC THỂ
TRONG GIẢI THUẬT DI TRUYỀN VÀ CÁC TOÁN TỬ DI TRUYỀN
CHUYÊN BIỆT
2.1. Phƣơng pháp biểu diễn nhiễm sắc thể bằng mã hóa nhị phân [1]
Giải thuật di truyền với biểu diễn nhiễm sắc thể bằng mã hóa nhị phân đã
được đề cập sơ bộ trong chương 1. Trong phần này chúng ta sẽ tìm hiểu sâu
hơn về giải thuật di truyền này thông qua một bài toán tối ưu số.
Không làm mất tính tổng quát, ta giả định bài toán tối ưu là bài toán tìm
cực đại của hàm nhiều biến f. Bài toán tìm cực tiểu hàm g chính là bài toán
tìm cực đại hàm f = -g, hơn nữa ta có thể giả định hàm mục tiêu f có giá trị
dương trên miền xác định của nó, nếu không ta có thể cộng thêm một hằng số
C dương.
Cụ thể bài toán được đặt ra như sau: Tìm cực đại một hàm k biến f(x
1
i
) 10
n
miền con bằng nhau, gọi m là số nguyên nhỏ nhất sao cho:
1210)(
i
m
n
ii
ab
Như vậy mỗi biến x
i
được biểu diễn bằng một chuỗi nhị phân có chiều
dài m
i
. Biểu diễn như trên rõ ràng thoả mãn điều kiện về độ chính xác theo
yêu cầu. Công thức sau tính giá trị thập phân của mỗi chuỗi nhị phân biểu
diễn biến x
i
12
)(
2
i
m
ii
ii
ab
stringdecimalax
nhiên theo từng bit.
Phần còn lại của giải thuật di truyền rất đơn giản, trong mỗi thế hệ ta
lượng giá từng nhiễm sắc thể (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 thoả 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 ra các cá thể thế hệ
mới.
Sau một số thế hệ, khi không còn cải thiện thêm được gì nữa, nhiễm sắc
thể tốt nhất sẽ được xem như lời giải của bài toán tối ưu (thường là toàn cục).
Thông thường ta cho dừng giải thuật sau một số bước lặp cố định tuỳ ý, tuỳ
thuộc vào điều kiện tốc độ và tài nguyên máy tính.
Đối với tiến trình chọn lọc (chọn quần thể mới thoả mãn phân bố xác
suất dựa trên các độ thích nghi), ta dùng bánh xe quay Rulet với các rãnh
được định kích thước theo độ thích nghi. Ta xây dựng bánh xe Rulet như sau
(giả định rằng các độ thích nghi đều dương).
+ Tính độ thích nghi eval(v
i
) của mỗi nhiễm sắc thể v
i
(i = 1,…,
pop_size)
+ Tìm tổng giá trị thích nghi toàn quần thể:
sizepop
i
i
vevalF
1
)(
+ Tính xác suất chọn p
i
, ngược lại thì chọn nhiễm
sắc thể thứ i, v
i
(2 i pop_size) sao cho q
i-1
r q
i
Như vậy có thể có một số nhiễm sắc thể được chọn nhiều lần, điều này là
phù hợp vì các nhiễm sắc thể tốt nhất cần có nhiều bản sao hơn, các nhiễm sắc
thể trung bình không thay đổi các nhiễm sắc thể kém nhất thì chết đi. Hình 2.1. Minh họa bánh xe rulet
Bây giờ ta có thể áp dụng phép toán di truyền: Kết hợp và lại vào các cá
thể trong quần thể mới vừa được chọn từ quần thể cũ như trên.
Một trong những tham số của giải thuật là xác suất lai p
c
. Xác suất này
cho ta số nhiễm sắc thể pop_size p
c
mong đợi, các nhiễm sắc thể này được
dùng trong tác vụ lai tạo. Ta tiến hành theo cách sau đây:
Đối với mỗi nhiễm sắc thể trong quần thể mới:
m
) và (c
1
c
2.
…c
pos
c
pos+1
…c
m
)
được thay bằng một cặp con của chúng:
(b
1
b
2
…b
pos
c
pos+1
…c
m
) và (c
1
c
2.
…c
pos
b
ứng là P
c
= 0.25 và P
m
= 0.01 16
Giả sử cần tính chính xác đến 4 số lẻ đối với mỗi biến. Miền của biến x
1
có chiều dài 15.1, điều kiện chính xác đòi hỏi đoạn [-3.0, 12.1] cần được chia
thành các khoảng có kích thước bằng nhau, ít nhất là 15.1 10000 khoảng,
điều này cần 18 bit làm phần đầu tiên của nhiễm sắc thể: 2
17
151000 2
18
Miền của biến x
2
có chiều dài là 1.7, điều kiện chính xác đòi hỏi đoạn
[4.1,5.8] cần được chia thành các khoảng có kích thước bằng nhau là
1.7 10000 khoảng, điều này nghĩa là cần 15 bit làm thành phần cuối của
nhiễm sắc thể: 2
14
17000 2
15
Chiều dài toàn bộ nhiễm sắc thể (vectơ lời giải) là m =18+15 = 33
Để cực đại hoá hàm f bằng giải thuật di truyền ta tạo ra một quần thể có
v
10
= (000001111000110000011010000111011)
v
11
= (011001111110110101100001101111000)
v
12
= (110100010111101101000101010000000) 17
v
13
= (111011111010001000110000001000110)
v
14
= (010010011000001010100111100101001)
v
15
= (111011101101110000100011111011110)
v
16
= (110011110000011111100001101001011)
v
17
= (011010111111001111010001101111101)
v
18
= (011101000000001110100111110101101)
eval(v
7
) = f(-0.991471,5.680258) = 16.020812
eval(v
8
) = f(4.910618,4.703018) = 17.959701
eval(v
9
) = f(0.795406,5.381472) = 16.127799
eval(v
10
) = f(-2.554851,4.793707) = 21.278435
eval(v
11
) = f(3.130078,4.996097) = 23.410669
eval(v
12
) = f(9.356179,4.239457) = 15.011619
eval(v
13
) = f(11.134646,5.378671) = 27.316702
eval(v
14
) = f(1.335944,5.151378) = 19.876294 18
eval(v
15
) = f(11.089025,5.054515) = 30.060205
của mỗi nhiễm sắc thể v
i
(i = 1,…,20) là:
p
1
= eval(v
1
)/F = 0.067099
p
2
= eval(v
2
)/F = 0.019547
p
3
= eval(v
3
)/F = 0.050355
p
4
= eval(v
4
)/F = 0.044889
p
5
= eval(v
5
)/F = 0.065350
p
6
= eval(v
12
)/F =0.038712 19
p
13
= eval(v
13
)/F = 0.070444
p
14
= eval(v
14
)/F = 0.051257
p
15
= eval(v
15
)/F = 0.077519
p
16
= eval(v
16
)/F = 0.061549
p
17
= eval(v
17
= 0.181890
q
5
= 0.247240 q
6
= 0.293917
q
7
= 0.335232 q
8
= 0.381546
q
9
= 0.423137 q
10
= 0.478009
q
11
= 0.538381 q
12
= 0.577093
q
13
= 0.647537 q
14
= 0.698794
q
15
= 0.776314 q
16
11
được chọn vào quần thể mới, số thứ 2 r = 0.175741 lớn hơn q
3
nhỏ
hơn q
4
, nghĩa là v
4
được chọn cho quần thể mới,….
Như vậy quần thể mới gồm các nhiễm sắc thể sau:
v’
1
= v
11
= (011001111110110101100001101111000)
v’
2
= v
4
= (100011000101101001111000001110010)
v’
3
= v
7
= (001000100000110101111011011111011)
v’
4
= v
11
= (011001111110110101100001101111000)
v’
11
= v
15
= (111011101101110000100011111011110)
v’
12
= v
9
= (011000000101100010110000001111100)
v’
13
= v
6
= (000101000010010101001010111111011)
v’
14
= v
8
= (100001100001110100010110101100111)
v’
15
= v
20
= (101110010110011110011000101111110) 21
v’
16
+ Nếu r 0.25 ta chọn một nhiễm sắc thể cho trước để lai tạo
Giả sử thứ tự các số ngẫu nhiên là:
0.822951 0.151932 0.625477
0.314685 0.346901 0.917204
0.519760 0.401154 0.606758
0.785402 0.031523 0.869921
0.166525 0.574520 0.758400
0.581893 0.389248 0.200232
0.355635 0.826927
Điều này có nghĩa là các nhiễm sắc thể v’
2
, v’
11
, v’
13
và v’
18
đã được chọn
để lai tạo.
Tiếp theo ta cho lai tạo một cách ngẫu nhiên, ví dụ (v’
2
, v’
11
) và (v’
13
,
v’
18
) được kết cặp. Đối với mỗi cặp trong 2 cặp này, ta phát sinh một số
nguyên ngẫu nhiên pos thuộc khoảng {1, ,32}. Số pos cho biết vị trí của điểm
18
= (11101111101000100011|1010111111011)
Cuối cùng quần thể hiện hành là:
v’
1
= (011001111110110101100001101111000)
v’
2
= (100011000|101110000100011111011110)
v’
3
= (001000100000110101111011011111011)
v’
4
= (011001111110110101100001101111000)
v’
5
= (000101010011111111110000110001100)
v’
6
= (100011000101101001111000001110010)
v’
7
= (111011101101110000100011111011110)
v’
8
= (000111011001010011010111111000101)
v’
9
= (011001111110110101100001101111000)
v’
19
= (111011101101110000100011111011110)
v’
20
= (110011110000011111100001101001011)
Phép toán kế tiếp, đột biến thực hiện trên cơ sở từng bit một. Xác suất
đột biến p
m
= 0.01, vì thế ta hy vọng 1/100 số bit sẽ qua đột biến. Có 660 bit
(m pop_size = 33 20) trong toàn quần thể, ta hy vọng có 6.6 đột biến ở mỗi
thế hệ.
Mỗi bit có cơ hội đột biến ngang nhau, nên với mỗi bit trong quần thể ta
phát sinh một số ngẫu nhiên r trong khoảng [0,1], nếu r 0.01 thì ta đột biến
bit này.
Điều này có nghĩa ta phát sinh 660 số ngẫu nhiên. Giả sử có 5 trong 660
số này nhỏ hơn 0.01 (bảng dưới).
Vị trí bit
Số ngẫu nhiên
112
0.000213
349
0.009945
418
0.009909
429
0.005425
602
0.002835
= (100011000101110000100011111011110)
v’
3
= (001000100000110101111011011111011)
v’
4
= (011001111110010101100001101111000)
v’
5
= (000101010011111111110000110001100)
v’
6
= (100011000101101001111000001110010)
v’
7
= (111011101101110000100011111011110)
v’
8
= (000111011001010011010111111000101)
v’
9
= (011001111110110101100001101111000)
v’
10
= (000010000011001000001010111011101)
v’
11
= (111011101101101001011000001110010)
v’
12
1
) = f(3.130078, 4.996097) = 23.410669
eval(v
2
) = f(5.279082, 5.054515) = 18.201083
eval(v
3
) = f(-2.516603, 4.390381) = 19.626329
eval(v
4
) = f(5.278638, 5.593460) = 17.406725
eval(v
5
) = f(-1.255173, 4.734458) = 25.341160
eval(v
6
) = f(-1.811725, 4.391937) = 18.100417
eval(v
7
) = f(-0.991471, 5.680258) = 16.020812
eval(v
8
) = f(4.910618, 4.703018) = 17.959701
eval(v
9
) = f(0.795406, 5.381472) = 16.127799
eval(v
10
) = f(-2.554851, 4.793707) = 21.278435
eval(v