2 CHƯƠNG: ỨNG DỤNG GIẢI THUẬT DI TRUYỀN GIẢI BÀI TOÁN RA ĐỀ THI TỐ
2.3.3 Xây dựng cá thể, hàm thích nghi và các phép toán di truyền
Bài toán đặt ra là tìm một phương án (một đề thi) tối ưu nhất thỏa mãn các điều kiện ràng buộc của người dùng. Chúng ta có thể coi các đề thi được tạo ra từ CauHoi là các cá thể với các phép toán di truyền trên các cá thể đó như sau:
• Nếu cá thể trong quần thể được gọi là q thì ta có q⊆ CauHoi
• Xác định phép lai:
Phép lai p với q sẽ tạo ra một cặp cá thể (p’, q’) (p’, q’) := Lai(p, q) được xác định theo quy tắc:
với q” ⊂ q và p” ⊂p
• Thiết kế phép đột biến
Phép đột biến cá thể q tạo ra một cá thể q’mới
q’ := Dbien(q) được xác định theo quy tắc:
q’ = q + {qi} với qi ∈ CauHoi
• Thiết kế hàm thích nghi
Hàm thích nghi của quan hệ q (Fitness(q)) cần phải phụ thuộc vào: tỉ lệ % phân bố kiến thức, độ khó, số lượng chủ đề và thời gian.
Gọi E1, E2, E3, E4 lần lượt là độ đo của: tỉ lệ % phân bố kiến thức, độ khó, số lượng chủ đề, thời gian. E1, E2, E3, E4 được xác định như sau:
(i) E1 = (|kTi - KTi |)
với kTi ∈k, KTi ∈ K - tập tỉ lệ % phân bổ kiến thức yêu cầu; m = |t|
i
T
k : phân bổ kiến thức của chủ đề Ti có trong q:
Phương thức tính E1:
//tính phần trăm của chủ đề cd trong đề thi d
public static int tinhPT(dethi d,String cd){ int dem=0; for(int i=0;i<d.getsl();i++) if(d.getdscauhoi(i).getCD().equalsIgnoreCase(cd)) dem++; return dem/d.getsl(); }
// y là yêu cầu của đề thi cần tạo ra
public static double tinhE1(dethi d,ndyc y){ double t=0; for(int i = 0; i < y.getsl();i++) t=t+Math.abs(tinhPT(d,y.getyeucau(i).getCD())- y.getyeucau(i).getPT()); return t; } (ii) E2 = ( ∑ = m Ti 1 |∑ = i T e j 1 ) ( Ti j q DoKho - LTi|) với LTi ∈L: tập độ khó yêu cầu
i
T
e : số lượng câu hỏi trong q theo chủ đề Ti
) ( Ti
j
q
DoKho : Độ khó của câu hỏi qi có chủ đề Ti
Phương thức tính E2:
double t=0;
for(int i = 0;i < y.getsl();i++){ double t1=0; for(int j = 0; j <d.getsl();j++) if(d.getdscauhoi(j).getCD().equalsIgnoreCase (y.getyeucau(j).getCD())) t1=t1+d.getdscauhoi(j).getDokho(); t=t+Math.abs(t1-y.getyeucau(i).getDK()); } return t; } (iii) E3 = (|m - n|) với m = |t| và n = |T| Phương thức tính E3:
public static double tinhE3(dethi d,ndyc y){ double t; int dem = 1;
for(int i= 1;i<d.getsl();i++){ boolean kt=true; for(int j=0;j<i;j++){ if(d.getdscauhoi(i).getCD().equalsIgnoreCase (d.getdscauhoi(j).getCD())) kt=false; } if(kt) dem++; } t = Math.abs(dem-y.getsl())); return t; } (iv) E4 = (|∑ = p i i q ThoiGianTL 1 ) ( – I|)
ThoiGianTL(qi): thời gian trả lời của câu hỏi qi
I: thời gian yêu cầu
Phương thức tính E4:
public static double tinhE4(dethi d,ndyc y){ double t=0; for(int i=0;i<d.getsl();i++) t=t+d.getdscauhoi(i).getTg() t=Math.abs(t-y.gettg()); return t; }
Hàm Fitness được tính như sau:
Fitness = - E1 * E2 * E3 * E4 max
Công thức trên sẽ cho hàm Fitness có đặc điểm phụ thuộc đều vào bốn yếu tố
Vì hàm mục tiêu là số âm mà hàm thích nghi là không âm nên ta chuyên hàm mục tiêu thành hàm thích nghi không âm (theo công thức trong mục 1.4).
Phương thức tính hàm thích nghi:
public static void hamthichnghi(quanthe q, ndyc y, int n, double tn[]){
// tinh ham muc tieu
double tam[] = new double[n]; for(int i=0;i<n;i++){
tam[i]=-tinhE1(q.getdethi(i),y)*
tinhE2(q.getdethi(i),y)*tinhE3(q.getdethi(i),y)* tinhE4(q.getdethi(i),y);
}
// chuyen ham muc tieu thanh ham thich nghi
double min=tam[0]; for(int i=1;i<n;i++) if(tam[i]<min) min=tam[i]; for(int i=0;i<n;i++) tn[i]=Math.abs(min)+tam[i]; }
KẾT LUẬN
Ưu điểm:
Tiểu luận đã trình bày và giới thiệu những khái niệm cơ bản, cơ sở lý thuyết về giải thuật di truyền. Trên cơ sở lý thuyết, tác giả đã cài đặt các phép toán cơ bản của giải thuật di truyền, sử dụng các phép toán của giải thuật di truyền để trình bày và cài đặt cho bài toán ứng dụng ra đề thi tối ưu.
Hạn chế:
Do thời gian có hạn, tác giả chỉ giới thiệu những kiến thức chung nhất về giải thuật di truyền, chưa đi sâu vào các vấn đề nghiên cứu tối ưu khác.
Phần cài bài toán ứng dụng còn đơn giản, chỉ mang tính chất minh họa chưa thật sự bao quát.
Hướng phát triển:
Tiếp tục nghiên cứu cơ sở lý thuyết về giải thuật di truyền.
Tiếp tục nghiên cứu các bài toán ứng dụng khác của giải thuật di truyền để hiểu sâu sắc hơn ý nghĩa của nó.
1. Tài liệu tham khảo:
[1] Nguyễn Đình Thúc, Trí tuệ nhân tạo: Lập trình tiến hóa, NXB Giáo Dục, 2001.
[2] Nguyễn Thanh Thủy, Công nghệ tri thức và tính toán mềm: Giải thuật di truyền, ĐH Bách Khoa Hà Nội, 2003.
[3] Hoàng Kiếm, Lê Hoàng Thái, Giải thuật di truyền, cách giải tự nhiên các bài toán trên máy tính, NXB Giáo Dục, 2000.
[4] Nguyễn Đức Nghĩa, Phân tích thiết kế thuật toán: Nhập môn NP-đầy đủ, ĐH Bách Khoa Hà Nội, 2003.
[5] Brian M. Kelley. Genetic Programming and a Genetic Algorithm for Approximate Optimal Timetable Design. Theory of Computing, June 11, 2001.