3.1. Phát biểu bài toán
3.1.4. Các phép toán di truyền
3.1.4.4. Hàm đánh giá độ thích nghi
Do các ràng buộc đa dạng, ta nên xét từng ràng buộc và xây dựng các hàm đánh giá tương ứng, sau đó tổ hợp lại thành hàm đánh giá chung cho cá thể. Tùy theo tính chất cứng, mềm và tính cần thiết của các ràng buộc, ta sẽ gán cho chúng các tham số lớn nhỏ khác nhau trong hàm đánh giá tổng thể của cá thể.
Ta xây dựng tổ hợp các hàm đánh giá thành phần của cá thể v gồm k ràng buộc như sau:
- Ràng buộc về lớp học:
+ Phải học đủ số tiết đã quy định trong mỗi khối.
+ Không quá một giáo viên dạy trong một tiết.
+ Các tiết học phải liên tục.
- Ràng buộc môn học:
+ Các môn cố định: Chào cờ, Sinh hoạt, Nghỉ phải đảm bảo đúng vị trí.
+ Các môn kép nếu học cùng một buổi thì phải học liên tục.
+ Học đủ số lượng tiết và buổi trong một tuần.
- Ràng buộc giáo viên:
+ Không dạy quá số lượng tiết quy định.
+ Chỉ dạy 1 lớp tại một thời điểm.
- Ràng buộc mềm khác:
+ Đàm bảo thời gian di chuyển của giáo viên.
+ Tránh các tiết mà một giáo viên thường đi họp hoặc làm các công việc chuyên môn khác.
+ Hạn chế các tiết trống giữa các tiết cho giáo viên.
Tựu trung lại chúng ta có các ràng buộc sau:
'Ràng buộc Giáo viên trùng tiết For k = 0 To tongtiet - 1 vTKBOK(9, k) = 0 Next
For k = 0 To tongtiet - 2
ss = vTKBOK(3, k) & vTKBOK(7, k) & vTKBOK(8, k) For kk = k + 1 To tongtiet - 1
sss = vTKBOK(3, kk) & vTKBOK(7, kk) & vTKBOK(8, kk) If (vTKBOK(9, k) = 0) And ss = sss Then
vTKBOK(9, kk) = 1 'Đánh dấu tiết vừa so sánh Gttn = Gttn + 1
End If Next
vTKBOK(9, k) = 1 Next
'Ràng buộc Một giáo viên không dạy 5 tiết trong 1 buổi If x5tiet = True Then
k = 0 hs = 0
tiet = False
Do While k < tongtiet - 1 For thu = 2 To 7
cscot = 5 * (thu - 1) + 30 * hs - 1
If (vTKBOK(3, cscot) = vTKBOK(3, cscot - 1)) And (vTKBOK(3, cscot) = vTKBOK(3, cscot - 2)) And (vTKBOK(3, cscot) = vTKBOK(3, cscot - 3)) And (vTKBOK(3, cscot) = vTKBOK(3, cscot - 4)) Then kt = True Next
If kt = True Then Gttn = Gttn + 1 kt = False
k = k + tonglop hs = hs + 1 Loop
End If
'Ràng buộc cho Môn Thể dục dạy tiết 5 If xThe = True Then
For k = 0 To tongtiet - 2
If vTKBOK(8, k) = Str(5) Then
If vTKBOK(2, k) = Str(21) Then Gttn = Gttn + 1 End If
Next End If
'Ràng buộc cho Môn Giáo dục Quốc phòng dạy tiết 5 If xThe = True Then
For k = 0 To tongtiet - 2
If vTKBOK(8, k) = Str(5) Then
If vTKBOK(2, k) = Str(24) Then Gttn = Gttn + 1 End If
Next End If
'Ràng buộc cho Môn Toán có 2 tiết liền If xToan = True Then
k = 0 hs = 0 kt = False
Do While k < tongtiet - 1 For thu = 2 To 7
For tiet1 = 1 To 4
For tiet2 = tiet1 + 1 To 5
cscot1=tiet*(thu - 1) + (5-tiet) * (thu-2) + 30
* hs-1
cscot2=tiet2*(thu - 1) + (5-tiet2) * (thu-2) + 30 * hs-1
If(vTKBOK(2,cscot1)=Str(16))&(vTKBOK(2,cscot2)=
Str(12))
Then kt = True Next
Next Next
If kt = True Then Gttn = Gttn + 1 kt = False
k = k + tonglop hs = hs + 1 Loop
End If
'Ràng buộc cho Môn Văn có 2 tiết liền If xVan = True Then
k = 0 hs = 0 kt = False
Do While k < tongtiet - 1 For thu = 2 To 7
For tiet1 = 1 To 4
For tiet2 = tiet1 + 1 To 5
cscot1=tiet*(thu - 1) + (5-tiet) * (thu-2) + 30
* hs-1
cscot2=tiet2*(thu - 1) + (5-tiet2) * (thu-2) + 30 * hs-1
If(vTKBOK(2,cscot1)=Str(16))&(vTKBOK(2,cscot2)=
Str(16))
Then kt = True Next
Next Next
If kt = True Then Gttn = Gttn + 1 kt = False
k = k + tonglop hs = hs + 1 Loop
End If
'Ràng buộc Một Môn không quá 2 tiết trong 1 buổi If x2tiet = True Then
k = 0 hs = 0 kt2 = 0
Do While k < tongtiet - 1 For thu = 2 To 7
For tiet1 = 1 To 4
For tiet2 = tiet1 + 1 To 5
cscot1=tiet*(thu - 1) + (5-tiet) * (thu-2) + 30
* hs-1
cscot2=tiet2*(thu - 1) + (5-tiet2) * (thu-2) + 30 * hs-1
If vTKBOK(2, cscot1) = vTKBOK(5,cscot2) Then kt2
= kt2+1
Next Next Next
If kt2 > 1 Then Gttn = Gttn + 1 kt = False
k = k + tonglop hs = hs + 1 Loop
End If
'Ràng buộc Các tiết cùng môn rời rạc trong 1 buổi - có từ 2 tiết trở lên mà không xếp liền
If x2tietlien = True Then k = 0
Do While k < tongtiet - 1 For thu = 2 To 7
For tiet1 = 1 To 3
For tiet2 = tiet1 + 2 To 5
cscot1=tiet*(thu - 1) + (5-tiet) * (thu-2) + 30
* hs-1
cscot2=tiet2*(thu - 1) + (5-tiet2) * (thu-2) + 30 * hs-1
If vTKBOK(2,cscot1) = vTKBOK(2,cscot2) Then Gttn=Gttn +1
Next
Next Next
k = k + tonglop Loop
End If
'Ràng buộc Các tiết của 1 GV trống trong 1 buổi - có từ 1 tiết trống trở lên mà không xếp liền
If xTrong = True Then k = 0
Do While k < tongtiet - 1 For thu = 2 To 7
For tiet1 = 1 To 3
For tiet2 = tiet1 + 2 To 5
cscot1=tiet*(thu - 1) + (5-tiet) * (thu-2) + 30
* hs-1
cscot2=tiet2*(thu - 1) + (5-tiet2) * (thu-2) + 30 * hs-1
If vTKBOK(3,cscot1)=vTKBOK(3,cscot2) Then Gttn=Gttn + 1
Next Next Next
k = k + tonglop Loop
End If
Việc xây dựng hàm thích nghi cho cá thể từ các hàm thích nghi toàn phần giúp ta dễ dàng thay đổi các tham số để có thể điều khiển hướng hội tụ của bài toán theo định hướng của người sử dụng. Tuy nhiên, những thay đổi này cần phải bảo đảm tiêu chuẩn cơ bản của hàm thích nghi trong mỗi pha tiến hóa, nghĩa là hàm thích nghi phải phân biệt được độ thích nghi của từng cá thể, để cá thể tương ứng với lời giải tốt hơn sẽ có giá trị hàm thích nghi lớn hơn.