I-MỤC ĐÍCH YÊU CẦU:
Trong chương này vận dụng việc tối ưu hoá trong chọn lọc tự nhiên để giải quyết bài toán cho vận đông viên leo núi. Có nhiều ngọn núi trong dãy núi, nhiệm vụ của bài toán là xác định ngọn núi cao nhất để leo.
Tương ứng trong khoa học máy tính thường gặp phải vấn đề là tìm giá trị đầu vào mà nó cho ra giá trị đầu ra cực đại (hay cực tiểu) của một hàm chức năng cho trước . Nó hoàn toàn đơn giản đối với hàm một biến , vấn đề trở nên khó khăn đối với hàm nhiều biến .
Bài toán tìm giá trị cực đại hàm hai biến tương ứng với bài toán leo núi. Theo phương pháp truyền thống có thể rơi vào “bẩy” leo nhằm ngọn núi thấp hơn .GAs bắt đầu tìm kiếm bằng tập các điểm (dân số) được chọn lựa một cách ngẫu nhiên , những điểm đó được chọn thông qua kiểm tra độ thích nghi (mỗi điểm được gán cho một giá trị thích nghi).Sau đó ghép chéo kết hợp những thành công nhất trong dân số để tạo ra dân số mới , và đột biến ngẫu nhiên đưa vào những đặt tính mới mà nó có thể cho ra những giải pháp tốt hơn. Phương pháp tìm kiếm giá trị đưa vào để cho giá trị cực đại của một hàm dựa trên cơ chế chọn lọc trong tự nhiên ,nên được gọi là tối ưu hoá trong chọn lọc tự nhiên.
II- CÁC CÔNG CỤ HỖ TRỢ :
1-MÁY TẠO SỐ NGẪU NHIÊN:
Trong GAs cần sử dụng rất nhiều những số ngẫu nhiên , nhưng chức năng của hàm rand() trong ngôn ngữ C được thiết lập, chưa hoàn tòan phù hợp cho GAs trong tình huống đòi hỏi hàng ngàn thậm chí hàng triệu số ngẫu nhiên cần được tạo ra . Do đó ta cần xây dựng công cụ tạo ra số ngẫu nhiên để đáp ứng yêu cầu đó.
Các nhà khoa học máy tính đã cống hiến nhiều thời gian để đâù tư và phân tích những máy phát ngẫu nhiên . Năm 1988 Paul L’Ecuyer đã đề xuất một thuật toán đa dạng cho việc tạo ra các số ngẫu nhiên . Bằng việc kết hợp hai máy
phát cơ bản dựa trên tiêu chuẩn tối thiểu , Paul L’Ecuyer tạo ra thói quen tránh những chổ khó khăn cuả thuật toán đơn giản hơn . Máy phát số ngẫu nhiên ta sử dụng ở bài toán này ,cho phép tạo ra các số ngẫu nhiên dạng double có giá trị nằm trong khoảng từ 0.0 đến 1.0 thông qua lớp RandDev() như sau:
static const long IM1 = 2147483563L; static const long IM2 = 2147483399L; static const long IMM1 = IM1 - 1L; static const long IA1 = 40014L; static const long IA2 = 40692L; static const long IQ1 = 53668L; static const long IQ2 = 52774L; static const long IR1 = 12211L; static const long IR2 = 3791L; static const long NTAB = 32L;
static const long NDIV =1L + IMM1/long(NTAB); static const double RNMX = 1.0F - FLT_EPSILON; static const float AM = 1.0F/2147483563.0F;
float RandDev::operator()() {
long j,k;
static long idum2 = 123456789L; static long iy = 0L;
static long iv[size_t(NTAB)]; float temp; if (Seed <= 0L) { if(-Seed < 1L) Seed = 1L; else Seed = -Seed; idum2 = Seed; for (j = NTAB + 7;j >= 0; -j) { k = Seed/IQ1;
Seed = IA1*(Seed - k*IQ1) - k*IR1; if(Seed < 0L)
Seed += IM1; if(j < NTAB)
iv[size_t(j)] = Seed; }
iy = iv[0]; }
k = Seed/IQ1;
Seed = IA1*(Seed - k*IQ1) - k*IR1; if(Seed < 0L)
Seed += IM1; k = idum2/IQ2;
idum2 =IA2*(idum2 - k*IQ2) - k*IR2; if(idum2 < 0L) idum2 += IM2; j =iy/NDIV; iy = iv[size_t(j)] - idum2; iv[size_t(j)] = Seed; if(iy < 1L) iy += IMM1; temp = AM*float(iy); if (temp > RNMX) return (float)RNMX ; else return temp; }
Lớp RandDev() tạo các số ngẫu nhiên dạng double có giá trị từ 0.0 đến 1.0 đáp ứng được yêu cầu của bài toán đặt ra.