IV/ HIỆN THỰC CHƯƠNG TRÌNH DƯỚI DẠNG MÁY HỮU HẠN TRẠNG THÁ
4.1.1. BÁNH XE ROULETTE
Giải thuật Gene chọn các yếu tố theo xác suất, thí dụ chọn cá thể, phép toán sản sinh ... - thông qua khái niệm bánh xe roulette (bánh xe roulette dùng quay số trong môn cờ bạc). Con xúc sắc dùng để gieo được hiện thực bởi class RandDev, bánh xe tương ứng với class RouletteWheel ở dạng template.
// --- // class tạo số ngẫu nhiên // --- class RandDev
{
protected:
// đối số seed ngầm định được chọn bởi đồng hồ hệ thống. static long TimeSeed()
{
return (long)time(NULL); }
public:
// constructor
RandDev (long initSeed = TimeSeed()); // xác lập giá trị seed
void SetSeed(long initSeed=TimeSeed());
// toán tử tạo giá trị ngẫu nhiên nằm giữa 0.0 và 1.0 float operator()();
private:
long Seed; // Giá trị khởi tạo ban đầu của dãy số ngẫu nhiên };
Mỗi đối tượng thuộc lớp RandDev sẽ tương ứng với một chương trình tạo số ngẫu nhiên nằm giữa 0.0 và 1.0 (thực hiện thông qua toán tử ( )) . Thí dụ:
RandDev G;
Để tạo số ngẫu nhiên chỉ việc gọi toán tử (): G();
// --- // class hiện thực bánh xe roulette ở dạng template // --- template <class FType>
class RouletteWheel {
public:
// constructor
RouletteWheel(size_t sz, FType *weights=NULL); // copy constructor
// toán tử gán
void operator =(const RouletteWheel &rw); // destructor
~RouletteWheel();
// thay đổi trọng số của bánh xe roulette FType Change(size_t i, FType weight); // các hàm truy xuất thành phần
size_t GetSize() {return N;} float GetWeight(size_t i);
// nhận một chỉ số mang tính ngẫu nhiên size_t GetIndex();
protected:
// mảng các trọng số (tương ứng với số phần chia và kích thước // mỗi phần trên bề mặt bánh xe roulette
size_t N; FType * W; // tổng các trọng số của bánh xe roulette FType T; // "xúc sắc" RandDev G; private:
// các hàm sử dụng bên trong các hàm thành phần public float AbsVal(FType f) { if (f<0.0F) return -f; else return f; }
void Copy(const RouletteWheel &rw); };
Mỗi đối tượng RouletteWheel đều có một biến thành phần thuộc class RandDev dùng để chọn một phân vùng trên bánh xe roulette. Khai báo đối tượng của class này bởi constructor thường kèm theo các đối số xác định mảng tương ứng:
Thí dụ, tạo bánh xe roulette chọn một trong năm phép toán sinh sản:
Double operarr[5];
RouletteWheel<double> operwhl(5, operarr);