HIỆN THỰC GIẢI THUẬT GEN
VII-ĐỘ CO THÍCH NGHI:
Điều chỉnh số lượng các bản sao là đặt biệt quan trọng đối với GAs dân số nhỏ .Trong lúc bắt đầu chạy GAs ,chúng ta thường có một số ít cá thể đặc biệt trong dân số .Nếu các cá thể đặc biệt lại cho luật chọn lọc bình thường (pselect = fi / Σf) ,chúng có thể chiếm tỉ lệ đáng kể của dân số trong một thế hệ , và điều này sẽ gây ra sự hội tụ sớm .Sau đó chỉ sau một lần chạy ta có bài toán rất khác với bài toán đầu .Cuối lần chạy có thể có sự biến đổi đáng kể bên trong dân số ,tuy nhiên độ thích nghi trung bình dân số cá thể đạt gần đến độ thích nghi dân số tốt nhất .Nếu điều này xảy ra ,các thành viên trung bình và các thành viên tốt nhất gần như lấy cùng số lượng bản sao trong những thế hệ tương lai ,và sự sống sót của cá thể thích nghi nhất cần thiết cho sự cải thiện sẽ trở thành ngẫu nhiên trong dân số những cá thể bình thường .Trong cả hai trường hợp ,khi bắt đầu chạy cũng như khi bắt đầu chạy ổn định ,phép co độ thích nghi là một lối thoát.
Một thủ tục có ích là phép co tuyến tính .Gọ f là độ thích nghi thô và f’ là độ thích nghi được co .Co tuyến tính yêu cầu một quan hệ tuyến tính giữa f và f’ như sau :
f’ = af + b
Các hệ số a và b có thể được chọn theo nhiều cách ,tuy nhiên trong tất cả mọi trường hợp chúng ta muốn có độ co thích nghi trung bình f’avg bằng với độ thích nghi thô favg ,bởi vì việc dùng thủ tục chọn lọc sau đó sẽ bảo đảm rằng mọi thành viên dân số trung bình sẽ đóng góp vào thế hệ con cháu kỳ vọng trong thế hệ kế tiếp .Để điều khiển số lượng dân số đã cho đối với thành viên dân số có độ thích nghi thô tố đa ,chúng ta chọn quan hệ co kiểu khác để đạt được độ thích nghi co tối đa f’max = Cmult * favg trong đó Cmult là số lượng các bản sao mong muốn cho thành viên dân số tốt nhất .Đối với các dân số nhỏ (n = 50 .. 100) , = 1.2 đến 2 được sử dụng thành công.
Thủ tục co đơn giản thông qua 3 chương trình con prescale ,scale , scalepop. procedure prescale(umax,uavg,umin :real; var a,b :real);
{tính các hệ số co cho phép co tuyến tính} const fmultiple = {bội số của phép co là 2} var delta :real; {ước số}
Begin
if umin > (fmultiple * uavg – umax) / (fmultiple –1.0) {kiểm tra không âm} then begin {phép co thông thường} delta := umax –uavg;
a := (fmutiple – 1.0) * uavg / delta ;
b := uavg * (uavg – fmultiple * uavg) / delta ; end else begin {co thật nhiều nếu có thể được} a:= uavg / delta ;
b:= -umin * uavg / delta ; end;
end;
function scale(u,a,b :real) :real; {co một giá trị của hàm mục tiêu} Begin
end;
procedure scalepop (popsize :integer ;var max ,avg ,min ,sumfitness :real ; var pop :poulation) ; {co toàn bộ dân số}
var j :integer ;
a ,b :real ; {độ dốc và phần bị chắn cho phương trình tuyến tính} Begin
prescale(max ,avg ,min ,a ,b) ;
{nhận độ dốc và phần bị chắn cho hàm} sumfitness := 0.0 ;
for j:= 1to popsize do begin
fitness :=scale(objective ,a ,b) ; sumfitness := sumfitness + fitness ; end;
end;
Thủ tục prescale nhận các giá trị thích nghi thô trung bình ,tối đa và tối thiểu ,là uavg ,umax ,umin và tính toán các hệ số co tuyến tính a và b dựa trên logic .Nếu có thể thì co đến bội sô 1mong muốn Cmult (trong chương trình là fmultiple) ,sau đó thực hiện tính toán .Mặt khác việc thực hiện co bằng cách chốt quanh giá trị trung bình và kéo giãn độ thích nghi cho đến khi giá trị cực tiểu dần đến 0 .Thủ tục scale sẽ được gọi sau thủ tục prescale để co tất cả các giá trị thô của các cá thể bằng cách dùng hàm scale đơn giản .Ở đây chúng ta giả thiết rằng các giá trị thích nghi thô được lưu trữ trong record indivadual trong một giá trị thực được gọi là
objective(pop[j].objective) .Các độ thích nghi đã co được đặt vào thông số thực fitness ,và tổng thích nghi sumfitness sẽ được tính lại .
Bằng cách này ,phép co đơn giản sẽ giúp ta ngăn chặn những chi phối sớm của những cá thể đặc biệt ,để khuyến khích sự cạnh tranh lành mạnh giữa những cá thể gần bằng nhau .Tuy nhiên ,điều này không phải là toàn bộ những nghiên cứu của chúng ta về các biến đổi hàm mục tiêu có thể có .