---*****---
I-YÊU CẦU VẤN ĐỀ:
Trong chương này ta ứng dụng GAs vào môi trường C++ để giải bài toán Giải mã hộp đen
(hay Tố ưu hoá hộp đen) . Hộp đen (Blackbox) có một ngõ vào (input) và một ngõ ra ,mỗi giá trị đầu vào cho một giá trị đầu ra ,yêu cầu tìm các giá trị đầu vào tương ứng với các giá trị đầu ra. Bài toán cho thấy sức mạnh của GAs trong C++ ,đồng thời kết hợp những cải tiến nhằm nâng cao hiệu quả của GAs.
Nguyên tắc của hộp đen là chúng ta hoàn toàn không biết gì về hoạt động bên trong hộp đen ,chỉ cho biết các điều kiện bên ngoài như sau:
- Đầu vào của hộp là số nguyên không dấu có chiều dài 32 bit.
- Đầu ra của hộp là số nguyên không dấu 32 bit có giá trị từ 0 đến 32. - Chỉ có một giá trị đầu vào chưa biết sẽ cho ra giá trị đầu ra là 32. -Những giá trị đầu ra nhỏ hơn 32 được tao ra từ nhiều giá trị đầu vào.
- Không có thông tin liên quan rõ ràng gữa giá trị đầu vào và giá trị đầu ra.Ví dụ :Đầu vào là 10 cho giá trị đầu ra là 4 ,trong khi đầu vào là 32 thì cho giá trị đầu ra là 0.
Nhiệm vụ của bài toán là tìm các giá trị đầu ra tương ứng với các giá trị đầu vào, cụ thể tìm giá trị đầu vào mà nó cho ra giá trị đầu ra là 32. Với điều kiện của hộp đen như thế ta khai báo hàm Blackbox với chức năng tương ứng như sau:
long Blackbox(long x);
Tham số đưa vào kiểu long ,hàm trả về là giá trị kiểu long. long Blackbox(long x);
{
static const long n = 0x11DE784AL;//299.792.458 long fit = 0L;
long mask = 1L; for(int i=0;i < 32;++i) {
if((x & mask)==(n & mask)) ++fit;
mask <<= 1; }
//tra ve gia tri giua 0 va 32 return fit;
}
II-CÁC THÔNG SỐ :
1-DÂN SỐ(Populations):
Tham số được sử dụng ở hàm Blackbox kiểu long ,nên ta định nghĩa dân số là một mãng kiểu long ,mỗi phần tử là một nhiễm sắc thể (Chromosome) là một chuỗi có chiều dài 32 bit .Giá trị đầu ra của Blackbox là độ thích nghi (fitness) tương ứng của một dân số ,nhiệm vụ của bài toán là tìmgiá trị lớn nhất được trả lại từ Blackbox cho một thành viên dân số cho trước .Do đó, ta cần định nghiã mãng thứ hai cũng kiểu long có cùng kích thước với mãng đầu tiên để giữ giá trị đầu ra từ Blackbox .
size_t m_PopSize ; // kích thước dân số
long * pop = new long[m_PopSize]; //mãng chứa dân số cũ
Giả sử ta không tìm thấy đầu vào tạo ra đầu ra là 32 ,ta cần tạo ra dân số mới (children) từ dân số cũ (parents) ,dùng giá trị thích nghi quyết định cho sự sinh sản thành công ,việc chọn lựa được dựa vào thực hiện bởi cơ chế quay bánh xe roulette .
long * newpop = new long[m_PopSize]; // mãng chứa dân số mới (children) long * fit = new long[m_PopSize]; // mãng chứa độ thích nghi.
2-CHỌN LỰA BÁNH XE ROULETTE :
Việc chọn lựa nhiễm sắc thể cho quá trình sinh sản đựơc điều khiển bằng cách quay bánh xe roulette như đã nói ở phần 1 .Bánh xe có các khe hở (phần) khác nhau tương ứng với độ thích nghi của các cá thể , việc chọn lựa ngẫu nhiên rơi vào phần nào thì nhiễm sắc thể được chọn là parents cho quá trình sinh sản ,sau đó quá trình chọn lựa được tiếp tục .Như vậy, nhiễm sắc thể nào có độ thích nghi cao sẽ có cơ hội sinh sản nhiều hơn .Nhiễm sắc thể được chọn cho quá trình sinh sản sẽ được đưa vào ghép chéo (nếu có) để tạo ra nhiểm sắc thể mới.Ở đây việ quay bánh xe roulette được thực hiện thông qua sử dụng hàm tạo số ngẫu nhiên của ngôn ngữ C :
sel = (long)((float(rand())
/ float(RAND_MAX))* float(totf));//quay bánh xe i = 0;
{
sel -= fit[i];
++i; //tìm phần kế tiếp }
3-GHÉP CHÉO(crossover):
Ghép chéo là sự trộn lẫn các thuộc tính khác nhau từ các nhiểm sắc thể khác nhau .Ở bài toán này ta thực hiện việc ghép chéo giống như phần 1 đã nói , nhiểm sắc thể có độ thích nghi cao được chọn lựa ngẫu nhiên từ bánh xe roulette sẽ được đưa vào ghép chéo ,tiếp theo là xác định vị trí ghép chéo để sinh ra nhiểm sắc thể con .Như vậy sẽ làm tăng thêm sức mạnh cho việc tìm kiếm trực tiếp thông tin dựavào thông tin đã biết .Quá trình ghép chéo liên quan tới 2 biến được khai báo như sau:
bool m_Crossover ; // dùng để chọn ghép chéo. float m_CrossProb; // xác suất ghép chéo.
//chọn cha mẹ thứ 1 sel = (long)((float(rand()) /float(RAND_MAX)) * float(totf)); p2 = 0; while(sel > fit[p2]) { sel -= fit[p2]; ++p2; }
//sinh sản bằng ghép chéo (sinh sản hữu tính) if(cross && ((float(rand())/float(RAND_MAX))< crate)) { //chọn parent thứ 2 sel = (long)((float(rand()) /float(RAND_MAX)) * float(totf)); p2 = 0; while(sel > fit[p2]) { sel -= fit[p2]; ++p2; }
//mat na bit xac dinh diem ghep cheo
mask = 0xFFFFFFFFL << (int)((float(rand()) / float(RAND_MAX))* 32.0F); // new string two parents
newpop[i] = (pop[p1] & mask) |(pop[p2] & (~mask)); }
3-ĐỘT BIẾN (mutation):
Bước cuối cùng của quá trình sinh sản là đột biến .Với một nhiễm sắc thể ta thực hiện đột biến bằng cách thay đổi ngẩu nhiên một bit từ 0 thành 1 hoặc ngược lại.Thường đột biến xảy
ra với xác suất rất thấp .Trong bài toán này quá trình đột biến được thực hiện liên quan tơí 2 biến được khai báo như sau:
bool m_Mutate ; // dùng để chọn đột biến. float m_MuteProb; // xác suất đột biến.
if(mutate &&((float(rand()) / float(RAND_MAX)) < mrate)) {
//xac dinh vi tri dot bien
mask = 1L << (int)((float(rand()) / float(RAND_MAX))* 32.0F); //lat bit tai vi tri dot bien
if(newpop[i] & mask)
newpop[i] &= ~mask; else
newpop[i] |= mask; }
}
Quá trình sinh sản ,ghép chéo ,đột biến được lặp đi lặp lại để tạo ra nhiễm sắc thể mới cho đến khi vượt quá kích thước dân số ,quá trình này được đặt trong vòng lặp số thế hệ đã chọn. 4-KỸ THUẬT CẢI TIẾN:
Kích thước dân số và số các thế hệ sinh ra liên quan đến tốc độ và chất lượng thông tin tìm kiếm .Dân số lớn thì quá trình xử lý sẽ dài ,dân số nhỏ thông tin tìm kiếm sẽ kém .Do đó trong việc thiết kế giải thuật ta cần cân bằng giữa kích thước dân số và số các thế hệ sinh ra.Kích thước dân số cũng tác động đến sự ảnh hưởng của nhiễm sắc thể có độ thích nghi cao trong quá trình sinh sản ,nếu kích thước dân nhỏ sẽ làm giảm ảnh hưởng của nhiễm sắc thể có độ thích nghi cao cho sự thành công của quá trình sinh sản.
Để nâng cao hiệu quả GAs ,bài toán được đưa vào hai kỹ thuật: Elitist selection và Fitness scaling.
Elitist selection: là chọn lọc thành phần tốt nhất,khi thực hiện Elitist selection sẽ luôn luôn copy nhiễm sắc thể có độ thích nghi cao nhất dùng để tạo ra thế hệ kế tiếp .Chọn Elitist selection bảo đảm cho việc tồn tại giải pháp tốt nhất,được khai báo như sau:
bool m_Elitist; // chọn Elitist selection.
//chọn thành phần ưu tú if(elite)
newpop[0] = bestl;
Fitness scaling:Khi dân số gần đạt đến độ hội tụ , thì sự khác nhau giữa các giá trị thích nghi là thường rấ nhỏ .Do đó các phần của bánh xe roulette gần bằng nhau ,ngăn cản việc chọn lựa giải pháp tốt nhất cho quá trình sinh sản . Fitness scaling đóng vai trò giải quyết vấn đề này bằng cách điều chỉnh độ thích nghi tạo thuận lợi cho nhiễm sắc thể trội hơn.
Ở bài toán này ta chọn một phương pháp đơn giản của Fitness scaling đơn giản gọi là
Windowing .Thực hiện Windowing điều chỉnh lại giá trị thích nghi bằng cách trừ tất cả giá trị thích nghi của các thực thể cho giá trị thích nghi nhỏ nhất ,việc điều chỉnh này sẽ làm giàm cơ hội sinh sản của nhiễm sắc thể ít thích nghi đồng thời làm tăng cơ hôi sinh sản cho nhiễm sắc thể có độ thích nghi cao.
//neu co chon Fitness scaling. if(scale)
++minf;// dam bao do thich nghi thap nhat la 1 // tinh lai tong do thich nghi
totf = 0L;
for(i = 0; i < POP_SZ; ++i) {
fit[i] -= minf; // tru tat ca do thich nghi cho do thich nghi nho nhat fit[i] *= fit[i];// binh phuong do thich nghi va gan vao chinh no
totf += fit[i]; // tinh tong do thich nghi }
III-XÂY DỰNG DIALOG:
Từ sự phân tích ở trên ta xây dựng Dialog box cho bài toán như sau:
Population: dùng để nhập kích thước dân số ,được gán giá trị mặc nhiên ban đầu là 25. Generation: dùng để nhập số các thế hệ sinh ra ,được gán giá trị mặc nhiên ban đầu là 20. Crossover: dùng cho việc chọn lựa có thực hiện ghép chéo trong quá trình sinh sản hay không , trị mặc nhiên được chọn là TRUE và xác suất được chọn là 100%.
Mutation: dùng cho việc chọn lựa có đột biến xảy ra trong quá trình sinh sản hay không ,trị mặc nhiên được chọn là TRUE và xác suất được chọn là 100% .
Elitist selection: dùng cho việc chọn lựa có thực hiện giải pháp Elitist selection trong quá trình sinh sản hay không .
Fitness scaling: dùng cho việc chọn lựa có thực hiện giải pháp Fitness scaling trong quá trình sinh sản hay không.
TestBlackbox: khi nhấn phím này thông tin các giải pháp tốt nhất của từng thế hệ sẽ được lưu trữ vào file BlackBoxFile.
Analysis : Khi nhấn phím này sẽ lưu trữ các thông tin vào file AnalysisFile dùng để so sánh hiệu quả của các giải pháp tìm kiếm.
IV-XÂY DỰNG GIẢI THUẬT: