Hình 4.10: Cá thể con sau lai ghép
Bước 8. Lặp lại từ bước 2 đến bước 7 cho tới khi tất cả các công đoạn được lập lịch trong cá thể con .
Bước 9. Ma trận lời giải là lịch biểu tích cực thu được với tập thời gian bắt đầu và thời gian hoàn thành là và . Ở đây = .
4.3.4.3. Toán tử chọn lọc
Toán tử chọn lọc cho _ cá thể cho thế hệ thứ + 1 được tiến hành như sau:
1. Chọn một cá thể có độ thích nghi tốt nhất kể từ thế hệ đầu đến thế hệ ; 2. Xây dựng lời giải trung gian ( ) áp dụng cho phép đột biến và phép lai ghép:
1 4 8 2 6 5 9 2 1 4 8 2 6 3 5 9 1 8 4 7 2 6 9 3 5 4 8 1 7 6 2 5 9 3 7 7
- Áp dụng toán tử đột biến đối với ( ) được ( ) - Áp dụng toán tử trao đổi chéo đối với ( ) được ( ) - ( ) = ( ) ∪ ( ) ∪ ( )
3. Chọn _ − 1 trong tập ( ) theo nguyên lý bánh xe số. 4.3.5. Thuật toán di truyền
Thuật toán lai cho JSP được mô tả như sau: Procedure GA_JSP
Begin ← 0
Khởi tạo ( ) Đánh giá ( )
While(not điều kiện dừng) do Begin
Xây dựng lời giải ( ) bằng cách áp dụng phép đội biến và lai ghép: - Áp dụng toán tử đột biến đối với ( ) được ( )
- Áp dụng toán tử trao đổi chéo đối với ( ) được ( ) - ( ) = ( ) ∪ ( ) ∪ ( ) Đánh giá ( ) ← + 1 Chọn lọc ( ) từ ( − 1) End End
4.3.6. Tính đúng đắn của thuật toán
Tính đúng đắn của thuật toán được khẳng định thông qua các đặc trưng sau đây: 1. Do sử dụng thuật toán GT để sinh ra các lịch biểu, cho nên mỗi cá thể con được sinh ra đều là một lịch biểu hợp lệ và hơn nữa nó còn là một lịch biểu tích cực.
2. Trong phép đột biến, cá thể tham gia đột biến được sửa đổi bằng cách thay đổi thứ tự sắp xếp trong một máy nào đó, sau đó thời gian bắt đầu và thời gian kết thúc của toàn lịch biểu được cập nhật lại nên các thể con sau đột biến vẫn đảm bảo là một lịch biểu hợp lệ.
3. Phép trao đổi chéo sử dụng thuật toán GT để sinh ra các lịch biểu tích con, cho nên mỗi cá thể con được sinh ra đều là một lịch biểu hợp lệ và hơn nữa nó còn là một lịch biểu tích cực.
4. Vì thuật toán luôn duy trì lời giải tốt nhất trước hoặc sau khi chọn lọc vì vậy thuật toán được chứng tỏ hội tụ tới tối ưu toàn cục nhờ thuộc tính không giảm của thế hệ tiếp theo.
4.4. Kết quả thực nghiệm
Dựa vào thuật toán được trình bày trong mục 4.3, luận văn cài đặt thuật toán di truyền lai giải bài toán JSP bằng ngôn ngữ lập trình C# và kết quả chạy trên máy PC với bộ xử lý Core 2 Duo có tốc độ 2.4GHz. Kết quả chạy thử nghiệm trên một số bài toán (chạy mỗi bài toán 10 lần) được thống kê trên trong Bảng 4.3.
Bài toán (m x n) Cỡ lời giải Số thế hệ Xác suất lai ghép Xác suất đột biến Kết quả chạy (tốt nhất) Tối ưu thực sự Số lần đạt kết quả tốt nhất/ số lần chạy BT3x3 9 200 0.8 0.1 12 12 10/10 MT6x6 36 200 0.8 0.1 55 55 6/10 MT10x10 100 200 0.8 0.1 1010 930 0/10 LA01(5x10) 50 200 0.8 0.1 666 666 4/10 LA02(5x10) 50 200 0.8 0.1 671 655 1/10 LA03(5x10) 50 200 0.8 0.1 613 597 1/10
KẾT LUẬN 1. Các kết quả của luận văn
Luận văn trình bày bài toán lập lịch job shop (JSP) tổng quát, các phương pháp tiếp cận giải quyết bài toán JSP.
Luận văn trình bày thuật toán di truyền bao gồm: các khái niệm cơ bản, các tham số đầu vào, các toán tử và thuật toán di truyền.
Luận văn trình bày hai bài toán con của bài toán lập lịch job shop đó là bài toán flow shop hoán vị (PFSP) và bài toán flow shop (FSP). Thuật toán di truyền mã hóa số tự nhiên cho hai bài toán này.
Luận văn trình bày một thuật toán di truyền lai là sự kết hợp thuật toán di truyền với các kỹ thuật tìm kiếm khác cho bài toán lập lịch job shop (JSP).
2. Hạn chế
Vì thời thực hiện đề tài có hạn, đề tài đã dừng lại ở mức độ nghiên cứu lý thuyết về bài toán lập lịch job shop (JSP); thuật toán di truyền; các bài toán con của bài toán JSP, thuật toán di truyền lại mới là kết hợp giữa thuật toán di truyền với các kỹ thuật tìm kiếm khác cho JSP. Cài đặt thuật toán di truyền lai ở mức độ thực nghiệm giải, chưa phải là một ứng dụng hoàn thiện.
3. Hướng nghiên cứu tiếp theo
Nghiên cứu sâu hơn về bài toán lập lịch job shop và cách tiếp cận giữa thuật toán di truyền và các kỹ thuật tìm kiếm khác để tìm ra một thuật toán tốt cho JSP.
Ứng dụng thuật toán vào trong các bài toán quản lý: lập thời khóa biểu, lập lịch thi trong phạm vi trường đại học.
PHỤ LỤC
1. Các hàm chính của thuật toán di truyền lai luận văn trình bày được cài đặt bằng ngôn ngữ C# như dưới đây:
1.1. Hàm GT dùng để khởi tạo quần thể
publicOperation[,] GT(){
Operation[,] S = newOperation[numMachine + 1, numJob + 1];
List<Operation> G = newList<Operation>();
List<Operation> C = newList<Operation>();
List<Operation>[] PM = newList<Operation>[numMachine + 1];
//Khởi tạo PM
for (int i = 0; i < PM.Length; i++){
PM[i] = newList<Operation>(); }
//Bước 1 Khởi tạo G là các thao tác trên cột đầu tiên
for (int i = 1; i <= numJob; i++){
Operation ope = (Operation)arrope[i, 1].Clone();
ope.ES = 0; ope.EC = ope.pt; G.Add(ope); }
for (int k = 0; k < numOpe; k++){
Operation opeMinEc = findOpeMinEC(G);
int machineIndex = opeMinEc.machineId;
List<Operation> GM = newList<Operation>();
//Tính tập GM ở bước 2
for (int i = 0; i < G.Count; i++){
if (G[i].machineId == machineIndex){ GM.Add(G[i]);
} }
//Bước 3 CM tập cạnh tranh
List<Operation> CM = newList<Operation>();
for (int i = 0; i < GM.Count; i++){
if (GM[i].ES < opeMinEc.EC) CM.Add(GM[i]); }
//Bước 4
int idOpeChooser = rd.Next(CM.Count);
//Bước 5 int J = machineIndex; int I = numOpeCom(PM, J) + 1; S[J, I] = (Operation)opeChooser.Clone(); PM[J].Add(S[J, I]); opeChooser.s = opeChooser.ES; opeChooser.c = opeChooser.EC; S[J, I].s = opeChooser.s; S[J, I].c = opeChooser.c; //Bước 6
foreach (Operation ope in GM){
if (ope != opeChooser){
ope.ES = Math.Max(ope.ES, opeChooser.EC); ope.EC = ope.ES + ope.pt;
} }
//Bước 7
Operation opeNext = findOpeNext(opeChooser);
if (opeNext != null){
G.Add(opeNext);
Operation opeResult = findOpeBothMachine(PM, opeNext);
opeNext.ES = Math.Max(opeChooser.EC, opeResult.EC); opeNext.EC = opeNext.ES + opeNext.pt;
}
G.Remove(opeChooser); }
return S;
}
1.2. Hàm khởi tạo quần thể ban đầu
privatevoid InitPopulation(){
population = newList<Gene>();
for (int k = 0; k < nPopulation; k++) {
Operation[,] S = GT();
Gene gene = newGene();
for (int i = 1; i <= numMachine; i++){
for (int j = 1; j <= numJob; j++){
if (S[i, j] != null){
gene.Add((Operation)S[i, j]); }
} } gene.isGT = true; population.Add(gene); } tinhM();
foreach (Gene ge in population){
tinhMakespan(ge); } } 1.3. Hàm tính tham số M publicvoid tinhM(){ M = 0;
foreach (Gene ge in population){
M += 2* (getMS(ge)/ nPopulation); }
}
1.4.Hàm chọn cá thể tham gia đột biến
publicvoid selectMutation() {
List<Gene> listMutation = newList<Gene>();
int n = (int)pMutation* numOpe;
List<Gene> Temp = newList<Gene>(); Temp = Select();
for (int i = 0; i < nPopulation; i++){
if (rd.NextDouble() < pMutation){ listMutation.Add(Temp[i]); }
}
if (listMutation.Count > 0){
for (int i = 0; i < listMutation.Count ; i ++){ Mutation(listMutation[i]); }
} }
1.5. Hàm đột biến
publicvoid Mutation(Gene g){
Gene geneResult = newGene();
foreach (Operation ope in g){
Operation ope1 = (Operation)ope.Clone();
geneResult.Add(ope1); }
int p1, p2;
do{
p1 = rd.Next(0, geneResult.Count); p2 = rd.Next(0, geneResult.Count);
if (this.getMachine(geneResult[p1]) ==
this.getMachine(geneResult[p2]) && (p1 != p2)) { Operation temp; temp = geneResult[p2]; geneResult[p2] = geneResult[p1]; geneResult[p1] = temp; }
} while (this.getMachine(geneResult[p1]) !=
this.getMachine(geneResult[p2]) || (p1 == p2));
if (this.updateGene(geneResult) == true&&
kiemtratrunggene(geneResult)==false){ tinhMakespan(geneResult);
population.Add(geneResult); }
}
1.6. Hàm chọn cá thể tham gia trao đổi chéo
publicvoid selectCrossOver(){
List<Gene> listcross = newList<Gene>();
int n = (int)pCrossover * numOpe;
List<Gene> Temp = newList<Gene>(); Temp = Select();
for (int i = 0; i < nPopulation; i++){
if (rd.NextDouble() < pCrossover) { listcross.Add(Temp[i]); } } if (listcross.Count % 2 != 0){ listcross.RemoveAt(listcross.Count - 1); } if (listcross.Count > 0){
for (int i = 0; i < listcross.Count - 1; i += 2) {
Gene g = newGene();
g = CrossOver(listcross[i], listcross[i + 1]); } while (updateGene(g) == false);
if (kiemtratrunggene(g) == false){ tinhMakespan(g); population.Add(g); } } } }
1.7. Hàm trao đổi chéo
publicGene CrossOver(Gene g1, Gene g2){
Gene child = newGene();
Operation[,] S = newOperation[numMachine + 1, numJob + 1];
Operation[,] S1 = newOperation[numMachine + 1, numJob + 1];
Operation[,] S2 = newOperation[numMachine + 1, numJob + 1];
{
int k = 0;
for (int i = 1; i <= numMachine; i++)
for (int j = 1; j <= numJob; j++) { S1[i, j] = g1[k]; k++; } } { int k = 0;
for (int i = 1; i <= numMachine; i++)
for (int j = 1; j <= numJob; j++) {
S2[i, j] = g2[k]; k++;
} }
List<Operation> G = newList<Operation>();
List<Operation> C = newList<Operation>();
List<Operation>[] PM = newList<Operation>[numMachine + 1];
//Khởi tạo PM
for (int i = 0; i < PM.Length; i++) { PM[i] = newList<Operation>();
}
//Bước 1 khởi tạo tập G là các thao tác tren cột đầu tiên
for (int i = 1; i <= numJob; i++){
Operation ope = (Operation)arrope[i, 1].Clone();
ope.ES = 0; ope.EC = ope.pt; G.Add(ope); }
for (int k = 0; k < numOpe; k++){
Operation opeMinEc = findOpeMinEC(G);
int machineIndex = opeMinEc.machineId;
List<Operation> GM = newList<Operation>();
//Tính tập GM ở bước 2.
for (int i = 0; i < G.Count; i++){
if (G[i].machineId == machineIndex){ GM.Add(G[i]);
} }
//Bước 3
List<Operation> CM = newList<Operation>();//tap tranh chap
for (int i = 0; i < GM.Count; i++){
if (GM[i].ES < opeMinEc.EC) CM.Add(GM[i]); }
//Bước 4
Operation opeChooser = null;
int num = rd.Next(2);
int Lmin = int.MaxValue;
if (num == 0){
for (int kk = 0; kk < CM.Count; kk++){
int i = CM[kk].jobId;
int l = int.MaxValue;
for (int j = 1; j <= numJob; j++)
if (S1[machineIndex, j].jobId == i) { l = j; break; } if (l < Lmin) Lmin = l; }
for (int i = 0; i < CM.Count; i++){ Operation x = CM[i]; if (x.jobId == r) opeChooser = x; } } else{
for (int kk = 0; kk < CM.Count; kk++){
int i = CM[kk].jobId;
int l = int.MaxValue;
for (int j = 1; j <= numJob; j++)
if (S2[machineIndex, j].jobId == i){ l = j;
break;
}
if (l < Lmin) Lmin = l; }
int r = S2[machineIndex, Lmin].jobId;
for (int i = 0; i < CM.Count; i++){
Operation x = CM[i]; if (x.jobId == r) opeChooser = x; } } //Bước 5 int J = machineIndex; int I = numOpeCom(PM, J) + 1; S[J, I] = (Operation)opeChooser.Clone(); PM[J].Add(S[J, I]); opeChooser.s = opeChooser.ES; opeChooser.c = opeChooser.EC; S[J, I].s = opeChooser.s; S[J, I].c = opeChooser.c; //Bước 6
foreach (Operation ope in GM){
if (ope != opeChooser) {
ope.ES = Math.Max(ope.ES, opeChooser.EC); ope.EC = ope.ES + ope.pt;
} }
//Bước 7
Operation opeNext = findOpeNext(opeChooser);
if (opeNext != null) {
G.Add(opeNext);
Operation opeResult = findOpeBothMachine(PM, opeNext);
opeNext.ES = Math.Max(opeChooser.EC, opeResult.EC); opeNext.EC = opeNext.ES + opeNext.pt;
}
G.Remove(opeChooser); }
for (int i = 1; i <= numMachine; i++)
for (int j = 1; j <= numJob; j++) child.Add(S[i, j]);
return child;
}
1.8. Hàm chọn lọc
publicList<Gene> Select()
{
Gene max = population[0];
float GiaTri = max.getEval;
string strtest = "";
foreach (Gene g in population) {
strtest += g.getEval + " "; if (GiaTri < g.getEval) { max = g; GiaTri = max.getEval; } } tinhFtotal();
foreach (Gene ge in population){
ge.getp = 0;
ge.getp = (float)ge.getEval / (F_Total); }
tinhQ();
List<Gene> newPopulation = newList<Gene>(); newPopulation.Add(max);
for(int i=0;i<nPopulation - 1;i++){
float rd1 = (float)rd.Next(0, 10) / 10; ;
ewPopulation.Add(population[0]);
else{
for(int j=1;j<population.Count;j++){
if (population[j - 1].getq < rd1 && rd1 <= population[j].getq){ newPopulation.Add(population[j]); break; } } } }
foreach (Gene g in newPopulation){ string str = ""; foreach (Operation ope in g){ str = str + "-" + ope.id; }
}
return newPopulation;
}
2. Cấu trúc tập tin dữ liệu
Dữ liệu dùng để thực hiện trong luận văn được lấy từ địa chỉ
http://people.brunel.ac.uk/~mastjjb/jeb/orlib/files/jobshop1.txt http://people.brunel.ac.uk/~mastjjb/jeb/orlib/files/jobshop2.txt
Đây là bộ dữ liệu chuẩn dùng để làm dữ liệu đầu vào thử nghiệm thuật toán di truyền lai.
Một tập tin dữ liệu thử ví dụ bài toán MT06 (một bài toán 6x6 được đưa ra bởi Muth và Thompson)
Hình P.2: Giao diện chương trình
Tệp tin kết quả sau 10 lần chạy.
Kết quả tối ưu lần thứ 1 --- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 55 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 1 4 ) CV 4( 5 16 21 ) CV 3( 9 21 30 ) CV 6( 10 30 40 ) CV 2( 10 40 50 ) CV 5( 3 50 53 ) Máy 2 CV 2( 8 0 8 ) CV 6( 3 8 11 ) CV 4( 5 11 16 ) CV 1( 6 16 22 ) CV 5( 3 22 25 ) CV 3( 1 30 31 ) Máy 3 CV 1( 1 0 1 ) CV 3( 5 1 6 ) CV 2( 5 8 13 ) CV 5( 9 13 22 ) CV 4( 5 22 27 ) CV 6( 1 49 50 ) Máy 4 CV 3( 4 6 10 ) CV 6( 3 11 14 ) CV 4( 3 27 30 ) CV 1( 7 30 37 ) CV 2( 4 50 54 ) CV 5( 1 54 55 ) Máy 5 CV 2( 10 13 23 ) CV 5( 5 25 30 ) CV 4( 8 30 38 ) CV 3( 7 38 45 ) CV 6( 4 45 49 ) CV 1( 6 49 55 ) Máy 6 CV 3( 8 10 18 ) CV 6( 9 18 27 ) CV 2( 10 27 37 ) CV 5( 4 37 41 ) CV 1( 3 41 44 ) CV 4( 9 44 53 ) Kết quả tối ưu lần thứ 2
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 55 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 6 9 ) CV 4( 5 13 18 ) CV 3( 9 18 27 ) CV 6( 10 28 38 ) CV 2( 10 38 48 ) CV 5( 3 48 51 ) Máy 2 CV 2( 8 0 8 ) CV 4( 5 8 13 ) CV 6( 3 13 16 ) CV 1( 6 16 22 ) CV 5( 3 22 25 ) CV 3( 1 27 28 ) Máy 3 CV 3( 5 0 5 ) CV 1( 1 5 6 ) CV 2( 5 8 13 ) CV 5( 9 13 22 ) CV 4( 5 22 27 ) CV 6( 1 49 50 ) Máy 4 CV 3( 4 5 9 ) CV 6( 3 16 19 ) CV 4( 3 27 30 ) CV 1( 7 30 37 ) CV 2( 4 48 52 ) CV 5( 1 52 53 ) Máy 5 CV 2( 10 13 23 ) CV 5( 5 25 30 ) CV 3( 7 30 37 ) CV 4( 8 37 45 ) CV 6( 4 45 49 ) CV 1( 6 49 55 ) Máy 6 CV 3( 8 9 17 ) CV 6( 9 19 28 ) CV 2( 10 28 38 ) CV 5( 4 38 42 ) CV 1( 3 42 45 ) CV 4( 9 45 54 ) Kết quả tối ưu lần thứ 3
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 58 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 1 4 ) CV 6( 10 15 25 ) CV 4( 5 25 30 ) CV 3( 9 30 39 ) CV 5( 3 39 42 ) CV 2( 10 44 54 ) Máy 2 CV 6( 3 0 3 ) CV 2( 8 3 11 ) CV 5( 3 11 14 ) CV 1( 6 14 20 ) CV 4( 5 20 25 ) CV 3( 1 39 40 ) Máy 3 CV 1( 1 0 1 ) CV 5( 9 1 10 ) CV 3( 5 10 15 ) CV 2( 5 15 20 ) CV 4( 5 30 35 ) CV 6( 1 40 41 ) Máy 4 CV 6( 3 3 6 ) CV 3( 4 15 19 ) CV 1( 7 20 27 ) CV 4( 3 35 38 ) CV 5( 1 42 43 ) CV 2( 4 54 58 ) Máy 5 CV 5( 5 14 19 ) CV 2( 10 20 30 ) CV 1( 6 30 36 ) CV 6( 4 36 40 ) CV 4( 8 40 48 ) CV 3( 7 48 55 ) Máy 6 CV 6( 9 6 15 ) CV 3( 8 19 27 ) CV 1( 3 27 30 ) CV 5( 4 30 34 ) CV 2( 10 34 44 ) CV 4( 9 48 57 ) Kết quả tối ưu lần thứ 4
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 59 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 15 18 ) CV 4( 5 18 23 ) CV 6( 10 23 33 ) CV 3( 9 33 42 ) CV 5( 3 42 45 ) CV 2( 10 45 55 ) Máy 2 CV 2( 8 0 8 ) CV 6( 3 8 11 ) CV 4( 5 11 16 ) CV 5( 3 16 19 ) CV 1( 6 19 25 ) CV 3( 1 42 43 ) Máy 3 CV 3( 5 0 5 ) CV 5( 9 5 14 ) CV 1( 1 14 15 ) CV 2( 5 15 20 ) CV 4( 5 23 28 ) CV 6( 1 46 47 ) Máy 4 CV 3( 4 5 9 ) CV 6( 3 11 14 ) CV 4( 3 28 31 ) CV 1( 7 31 38 ) CV 5( 1 45 46 ) CV 2( 4 55 59 ) Máy 5 CV 5( 5 19 24 ) CV 2( 10 24 34 ) CV 4( 8 34 42 ) CV 6( 4 42 46 ) CV 3( 7 46 53 ) CV 1( 6 53 59 ) Máy 6 CV 6( 9 14 23 ) CV 3( 8 23 31 ) CV 5( 4 31 35 ) CV 2( 10 35 45 ) CV 1( 3 45 48 ) CV 4( 9 48 57 ) Kết quả tối ưu lần thứ 5
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 55 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 2 CV 2( 8 0 8 ) CV 6( 3 8 11 ) CV 4( 5 11 16 ) CV 1( 6 16 22 ) CV 5( 3 22 25 ) CV 3( 1 30 31 ) Máy 3 CV 1( 1 0 1 ) CV 3( 5 1 6 ) CV 2( 5 8 13 ) CV 5( 9 13 22 ) CV 4( 5 22 27 ) CV 6( 1 49 50 ) Máy 4 CV 3( 4 6 10 ) CV 6( 3 11 14 ) CV 4( 3 27 30 ) CV 1( 7 30 37 ) CV 2( 4 50 54 ) CV 5( 1 54 55 ) Máy 5 CV 2( 10 13 23 ) CV 5( 5 25 30 ) CV 4( 8 30 38 ) CV 3( 7 38 45 ) CV 6( 4 45 49 ) CV 1( 6 49 55 ) Máy 6 CV 3( 8 10 18 ) CV 6( 9 18 27 ) CV 2( 10 27 37 ) CV 1( 3 37 40 ) CV 5( 4 40 44 ) CV 4( 9 44 53 ) Kết quả tối ưu lần thứ 6
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 59 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 1 4 ) CV 4( 5 16 21 ) CV 6( 10 21 31 ) CV 3( 9 31 40 ) CV 5( 3 40 43 ) CV 2( 10 45 55 ) Máy 2 CV 6( 3 0 3 ) CV 2( 8 3 11 ) CV 4( 5 11 16 ) CV 5( 3 16 19 ) CV 1( 6 19 25 ) CV 3( 1 40 41 ) Máy 3 CV 1( 1 0 1 ) CV 5( 9 1 10 ) CV 3( 5 10 15 ) CV 2( 5 15 20 ) CV 4( 5 21 26 ) CV 6( 1 38 39 ) Máy 4 CV 6( 3 3 6 ) CV 3( 4 15 19 ) CV 1( 7 25 32 ) CV 4( 3 32 35 ) CV 5( 1 43 44 ) CV 2( 4 55 59 ) Máy 5 CV 5( 5 19 24 ) CV 2( 10 24 34 ) CV 6( 4 34 38 ) CV 4( 8 38 46 ) CV 1( 6 46 52 ) CV 3( 7 52 59 ) Máy 6 CV 6( 9 6 15 ) CV 3( 8 19 27 ) CV 5( 4 27 31 ) CV 1( 3 32 35 ) CV 2( 10 35 45 ) CV 4( 9 46 55 ) Kết quả tối ưu lần thứ 7
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 59 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 15 18 ) CV 4( 5 18 23 ) CV 6( 10 23 33 ) CV 3( 9 33 42 ) CV 5( 3 42 45 ) CV 2( 10 45 55 ) Máy 2 CV 6( 3 0 3 ) CV 2( 8 3 11 ) CV 4( 5 11 16 ) CV 5( 3 16 19 ) CV 1( 6 19 25 ) CV 3( 1 42 43 ) Máy 3 CV 5( 9 0 9 ) CV 3( 5 9 14 ) CV 1( 1 14 15 ) CV 2( 5 15 20 ) CV 4( 5 23 28 ) CV 6( 1 38 39 ) Máy 4 CV 6( 3 3 6 ) CV 3( 4 14 18 ) CV 1( 7 25 32 ) CV 4( 3 32 35 ) CV 5( 1 45 46 ) CV 2( 4 55 59 ) Máy 5 CV 5( 5 19 24 ) CV 2( 10 24 34 ) CV 6( 4 34 38 ) CV 4( 8 38 46 ) CV 1( 6 46 52 ) CV 3( 7 52 59 ) Máy 6 CV 6( 9 6 15 ) CV 3( 8 18 26 ) CV 5( 4 26 30 ) CV 1( 3 32 35 ) CV 2( 10 35 45 ) CV 4( 9 46 55 ) Kết quả tối ưu lần thứ 8
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 59 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 1 4 ) CV 4( 5 16 21 ) CV 3( 9 23 32 ) CV 5( 3 32 35 ) CV 6( 10 35 45 ) CV 2( 10 45 55 ) Máy 2 CV 6( 3 0 3 ) CV 2( 8 3 11 ) CV 4( 5 11 16 ) CV 5( 3 16 19 ) CV 1( 6 19 25 ) CV 3( 1 32 33 ) Máy 3 CV 1( 1 0 1 ) CV 3( 5 1 6 ) CV 5( 9 6 15 ) CV 2( 5 15 20 ) CV 4( 5 21 26 ) CV 6( 1 53 54 ) Máy 4 CV 6( 3 3 6 ) CV 3( 4 6 10 ) CV 4( 3 26 29 ) CV 1( 7 29 36 ) CV 5( 1 36 37 ) CV 2( 4 55 59 ) Máy 5 CV 5( 5 19 24 ) CV 2( 10 24 34 ) CV 3( 7 34 41 ) CV 4( 8 41 49 ) CV 6( 4 49 53 ) CV 1( 6 53 59 ) Máy 6 CV 6( 9 6 15 ) CV 3( 8 15 23 ) CV 5( 4 24 28 ) CV 2( 10 34 44 ) CV 1( 3 44 47 ) CV 4( 9 49 58 ) Kết quả tối ưu lần thứ 9
--- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 55 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 6 9 ) CV 4( 5 13 18 ) CV 3( 9 18 27 ) CV 6( 10 28 38 ) CV 2( 10 38 48 ) CV 5( 3 48 51 ) Máy 2 CV 2( 8 0 8 ) CV 4( 5 8 13 ) CV 6( 3 13 16 ) CV 1( 6 16 22 ) CV 5( 3 22 25 ) CV 3( 1 27 28 ) Máy 3 CV 3( 5 0 5 ) CV 1( 1 5 6 ) CV 2( 5 8 13 ) CV 5( 9 13 22 ) CV 4( 5 22 27 ) CV 6( 1 49 50 ) Máy 4 CV 3( 4 5 9 ) CV 6( 3 16 19 ) CV 4( 3 27 30 ) CV 1( 7 30 37 ) CV 2( 4 48 52 ) CV 5( 1 52 53 ) Máy 5 CV 2( 10 13 23 ) CV 5( 5 25 30 ) CV 4( 8 30 38 ) CV 3( 7 38 45 ) CV 6( 4 45 49 ) CV 1( 6 49 55 ) Máy 6 CV 3( 8 9 17 ) CV 6( 9 19 28 ) CV 2( 10 28 38 ) CV 1( 3 38 41 ) CV 5( 4 41 45 ) CV 4( 9 45 54 )
Kết quả tối ưu lần thứ 10 --- Bài Toán 6 Máy 6 Công Việc
Kết Quả Tôi Ưu: 58 Với 50 Cá Thể Sau : 200 Thế Hệ
Máy 1 CV 1( 3 1 4 ) CV 6( 10 15 25 ) CV 4( 5 25 30 ) CV 5( 3 31 34 ) CV 3( 9 34 43 ) CV 2( 10 44 54 ) Máy 2 CV 6( 3 0 3 ) CV 2( 8 3 11 ) CV 5( 3 11 14 ) CV 1( 6 14 20 ) CV 4( 5 20 25 ) CV 3( 1 43 44 ) Máy 3 CV 1( 1 0 1 ) CV 5( 9 1 10 ) CV 3( 5 10 15 ) CV 2( 5 15 20 ) CV 4( 5 30 35 ) CV 6( 1 35 36 ) Máy 4 CV 6( 3 3 6 ) CV 3( 4 15 19 ) CV 1( 7 20 27 ) CV 5( 1 34 35 ) CV 4( 3 35 38 ) CV 2( 4 54 58 ) Máy 5 CV 5( 5 14 19 ) CV 2( 10 20 30 ) CV 6( 4 30 34 ) CV 1( 6 34 40 ) CV 4( 8 40 48 ) CV 3( 7 48 55 ) Máy 6 CV 6( 9 6 15 ) CV 3( 8 19 27 ) CV 5( 4 27 31 ) CV 1( 3 31 34 ) CV 2( 10 34 44 ) CV 4( 9 48 57 ) .
TÀI LIỆU THAM KHẢO TIẾNG VIỆT
1.Nguyễn Hữu Mùi(2013), Thuật toán và các bài toán lịch biểu, Luận án Tiến sĩ,
Trường Đại học Công nghệ, Đại học Quốc Gia Hà Nội.
2.Nguyễn Hữu Mùi, Vũ Đình Hòa(2012), Một thuật toán di truyền hiệu quả cho bài