- Bảng phân rã công việc Cpr thể hiện quan hệ công việc trước, công việc sau. Các công việc được đánh số từ 0 tới n-1. n là tổng số lượng công việc.
- chromosome1và chromosome2 là hai nhiễm sắc thể đầu vào cho quá trình lai tạo. Với 0<=i<=n-1thì chromosome1[i] là phần tử thứ i của mảng
chromosome1, và chromosome2[i] là phần tử thứ i của mảng chromosome2
-
Đầu ra:
- Hai nhiễm sắc thể mới kết quả của quá trình lai tạo.
Các bƣớc thực hiện:
- Khởi tạo mảng nguyên dương child1 có nphần tử, với 0<=i<=n-1child1[i] là phần tử thứ i của mảng child1
- Khởi tạo phần tử đầu của mảng child1:prev =child1[0] = chromosome2[0]
- Fori = 1 ; i < n; i++ Then
Khởi tạo mảng preTask, thêm các phần tử từ 0 tới i-1của mảng child1
vào mảng preTask. Khởi tạo mảng compatibleTasksgồm các task có toàn bộ các task trực tiếp phía trước nằm trong mảng preTask, hoặc các task không có task trực tiếp phía trước nó.
Khởi tạo hai giá trị next1và next2
Tìm vị trí phần tử có giá trị làprevtrong mảng chromosome1, giả sử vị trí đólà phần tử thứ j trong mảng chromosome1, nếu j = độ dài mảng chromosome1 thì next1 = chromosome1[0], ngược lại next1 = chromosome1[j+1]
Tương tự ta tính được next2trong mảng chromosome2
Tính toán lại giá trị prev.
Nếu next1và next2chưa được thêm vào mảng child1,
prev = chọn ngẫu nhiên một trong hai giá trị next1 và next2
Nếu next1chưa được thêm vào mảng child1, next2 đã được thêm thì
prev = next1, ngược lại nếu next2 chưa dùng mà next1 dã dùng thì
prev = next2.
Nếu next1 và next2 đều đã được chọnthì gán giá trị
r = j = random từ 0 tới dộ dài mảng ( độ dài mảng là n)
duyệt các giá trị từ r tới n-1tìm được giá trị r chưa được thêm vào mảng child1nếu rđã được thêm vào mảng child thì duyệt các phần tử theo thứ tự ngược lại từ rtới 0. Sau bước này sẽ tìm được rchưa được thêm vào mảng child1, gán prev= r
Nếu prevkhôngthuộc mảng compatibleTasksgán lại giá trị prevnhư sau:
prev = chọn ngẫu nhiên một phần tử trong mảng compatibleTasks
Gán child1[i] = prev End For
- Khởi tạo mảng nguyên dương child2có nphần tử.
- Khởi tạo phần tử đầu của mảng child2: prev = child2[0] = chromosome1[0]. Phần tử đầu tiên của mảng child2 được lấy từ mảng cha chromosome1. Lặp lại vòng lặp For như ở trên sẽ được mảng child2
Ví dụ áp dụng giải thuật thực hiện trao đổi chéo hai cá thể cha mẹ để sinh ra hai cá thể con: Áp dụng giải thật đột biến cá thể với tập hợp các công việc có thứ tự công việc trước, công việc sau thể hiện trong hình Hình 3.1 trang 36, có tất cả 8 công việc tập hợp thực hiện công việc theo thứ tự được thể hiện bằng mảng không âm một chiều có 8 phần tử, các giá trị của mảng nằm trong khoảng từ 0 tới 7 và là duy nhất trong mảng. Giả sử hai nhiễm sắc thể cha mẹ dùng trao đổi chéo là mảng thể hiện như sau:
Nhiễm sắc thể cha mẹ chromosome1
Giá trị thể hiện chỉ số công việc 0 2 1 5 4 3 6 7
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Nhiễm sắc thể cha mẹ chromosome2
Giá trị thể hiện chỉ số công việc 0 2 1 3 4 6 5 7
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 1: Khởi tạo phần tử tại vị trí i = 0 cho nhiễm sắc thể con child1
Prev= 0
Nhiễm sắc thể conchild1, tại vị trí 0 gán giá trị bằng giá trị Prev tức là 0 Giá trị thể hiện chỉ số công việc 0
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 2: Khởi tạo phần tử tại vị trí i = 1 cho nhiễm sắc thể con child1
Tính Prev1= 2, Prev2= 2, hai giá trị này chưa được chọn, chọn ngẫu nhiên từ hai giá trị này được Prev= 2
Tính preTask1 = {0} và compatibleTask1 = {1,2,3}
Giá trị Prev= 2 là thuộc tập compatibleTask1 vậy 2 được chọn Nhiễm sắc thể con child1tại vị tríi = 1
Giá trị thể hiện chỉ số công việc 0 2
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 3: Khởi tạo phần tử tại vị trí i = 2 cho nhiễm sắc thể con child1
Tính Prev1= 1, Prev2= 1, hai giá trị này chưa được chọn, chọn ngẫu nhiên từ hai giá trị này được Prev= 1
Tính preTask2 = {0,2} và compatibleTask2= {1,3}
Giá trị Prev= 1 là thuộc tập compatibleTask1 vậy 1 được chọn Nhiễm sắc thể con child1tại vị tríi = 2
Giá trị thể hiện chỉ số công việc 0 2 1
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 4: Khởi tạo phần tử tại vị trí i = 3 cho nhiễm sắc thể con child1
Tính Prev1= 5, Prev2= 3, hai giá trị này chưa được chọn, chọn ngẫu nhiên từ hai giá trị này được Prev= 3
Tính preTask3 = {0,2,1} và compatibleTask3 = {3,5,4} Giá trị Prev= 3 là thuộc tập compatibleTask3vậy 3 được chọn Nhiễm sắc thể con child1tại vị tríi = 3
Giá trị thể hiện chỉ số công việc 0 2 1 3
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 5: Khởi tạo phần tử tại vị trí i = 4 cho nhiễm sắc thể con child1
Tính Prev1= 6, Prev2= 4, hai giá trị này chưa được chọn, chọn ngẫu nhiên từ hai giá trị này được Prev= 6
Tính preTask4 = {0,2,1,3} và compatibleTask4 = {5,4,6} Giá trị Prev= 6 là thuộc tập compatibleTask4 vậy 6 được chọn Nhiễm sắc thể con child1tại vị tríi = 4
Giá trị thể hiện chỉ số công việc 0 2 1 3 6
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 6: Khởi tạo phần tử tại vị trí i = 5 cho nhiễm sắc thể con child1
Tính Prev1= 7, Prev2= 5, hai giá trị này chưa được chọn, chọn ngẫu nhiên từ hai giá trị này được Prev= 7
Tính preTask5 = {0,2,1,3,6} và compatibleTask5 = {5,4}
Giá trị Prev= 7không thuộc tập compatibleTask5 vậy chọn ngẫu nhiên trong tập compatibleTask5 , giả sử 4 được chọn, giá trị Prev= 4
Nhiễm sắc thể con child1tại vị tríi = 5
Giá trị thể hiện chỉ số công việc 0 2 1 3 6 4
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 7: Khởi tạo phần tử tại vị trí i = 6 cho nhiễm sắc thể con child1
Tính Prev1= 3, Prev2= 6, hai giá trị này đã được chọn, chọn ngẫu nhiênr nằm trong khoảng 0 tới 7, giả sử r = 5, duyệt các phần tử từ 5 tới 7 của nhiễm sắc thể cha mẹ chromosome1, có tất cả 3 giá trị là 3, 6 và 7, giá trị 3 và 6 đã được chọn nên giá trị 7 được chọn ở bước này ta được Prev= 7
Tính preTask6 = {0,2,1,3,6,4} và compatibleTask6 = {5}
Giá trị Prev= 7không thuộc tập compatibleTask6 vậy chọn ngẫu nhiên phần tử trong compatibleTask6 , do có một phần tử là 5 nên hiển nhiên 5 được chọn Prev = 5
Nhiễm sắc thể con child1tại vị tríi = 6
Giá trị thể hiện chỉ số công việc 0 2 1 3 6 4 5
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7 Bước 8: Khởi tạo phần tử tại vị trí i = 7 cho nhiễm sắc thể con child1
Tính Prev1= 4, Prev2= 7, giá trị 7 chưa được chọn nênPrev= 7 Tính preTask7 = {0,2,1,3,6,4,5} và compatibleTask7 = {7} Giá trị Prev= 7 là thuộc tập compatibleTask7 vậy 7 được chọn Nhiễm sắc thể con child1tại vị tríi = 7
Giá trị thể hiện chỉ số công việc 0 2 1 3 6 4 5 7
Vị trí công việc trong mảng 0 1 2 3 4 5 6 7
Như vậy bằng thuật toán trên ta đã chọn được một nhiễm sắc thể con thỏa mãn thứ tự thực hiện công việc trước, công việc sau trong bảng phân rã công việc.