Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 156 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
156
Dung lượng
2,13 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ NGUYỄN HỮU MÙI THUẬT TOÁN VÀ CÁC BÀI TOÁN LỊCH BIỂU LUẬN ÁN TIẾN SĨ CÔNG NGHỆ THÔNG TIN Hà Nội – 2013 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CƠNG NGHỆ NGUYỄN HỮU MÙI THUẬT TỐN VÀ CÁC BÀI TOÁN LỊCH BIỂU Chuyên ngành: Khoa học máy tính Mã số: 62 48 01 01 LUẬN ÁN TIẾN SĨ CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TSKH Vũ Đình Hịa PGS.TS Hồng Xn Huấn Hà Nội - 2013 LỜI CẢM ƠN Về phía cá nhân, tác giả xin bày tỏ lịng biết ơn chân thành tới PGS TSKH Vũ Đình Hồ, PGS TS Hồng Xn Huấn tận tình hƣớng dẫn tác giả q trình hồn thành luận án Tác giả chân thành cảm ơn TS Phạm Thọ Hoàn, Giám đốc Trung tâm khoa học tính tốn Trƣờng Đại học Sƣ phạm Hà Nội giúp đỡ tác giả nhiều trình thử nghiệm Trung tâm Về phía tập thể, tác giả xin chân thành cảm ơn Bộ mơn Khoa học máy tính, Khoa Cơng nghệ thơng tin, Trƣờng Đại học Công nghệ; Bộ môn Khoa học máy tính, Khoa Cơng nghệ thơng tin, Trƣờng Đại học Sƣ phạm Hà Nội hết lòng ủng hộ tạo điều kiện thuận lợi cho tác giả thời gian hồn thành luận án Cuối cùng, tác giả vơ biết ơn bàn bè ngƣời thân gia đình cổ vũ to lớn họ suốt thời gian hoàn thành luận án Hà Nội, tháng 09 năm 2013 Nguyễn Hữu Mùi LỜI CAM ĐOAN Tơi xin cam đoan cơng trình nghiên cứu riêng Các kết đƣợc viết chung với tác giả khác đƣợc đồng ý đồng tác giả trƣớc đƣa vào luận án Các kết nêu luận án trung thực chƣa đƣợc công bố cơng trình khác Tác giả Nguyễn Hữu Mùi MỤC LỤC LỜI CẢM ƠN LỜI CAM ĐOAN MỤC LỤC DANH MỤC CÁC KÝ HIỆU VÀ TỪ VIẾT TẮT DANH MỤC CÁC BẢNG DANH MỤC CÁC HÌNH VẼ 10 MỞ ĐẦU 12 CHƢƠNG TỔNG QUAN VỀ THUẬT TOÁN DI TRUYỀN VÀ BÀI TOÁN LẬP LỊCH JOB SHOP 19 1.1 Thuật toán di truyền cổ điển 19 1.1.1 Cấu trúc thuật toán di truyền cổ điển 20 1.1.2 Một thủ tục đơn giản cho thuật toán di truyền cổ điển 24 1.2 Các lớp toán P, NP, NPC NP-hard 25 1.2.1 Các lớp toán P NP 25 1.2.2 Các lớp toán NPC NP-hard 25 1.3 Tổng quan toán lập lịch job shop 26 1.3.1 Bài toán lập lịch job shop 26 1.3.2 Các tiếp cận xác 29 1.3.3 Các tiếp cận gần 32 1.3.4 Tổng kết đánh giá chung tiếp cận cho JSP 50 1.3.5 Một số tồn đề xuất 52 CHƢƠNG HAI BÀI TOÁN CON CỦA BÀI TOÁN LẬP LỊCH JOB SHOP 55 2.1 Bài toán lập lịch flow shop hoán vị 55 2.1.1 Mơ tả tốn 55 2.1.2 Cách tính thời gian hồn thành lịch biểu hốn vị 57 2.1.3 Thuật toán Johnson cho PFSP máy PFSP máy 60 2.1.4 Một thuật toán di truyền mã hóa tự nhiên cho tốn lập lịch flow shop hoán vị tổng quát 67 2.1.5 Các kết thử nghiệm 73 2.2 Bài toán lập lịch flow shop 74 2.2.1 Mơ tả tốn 74 2.2.2 Một thuật toán di truyền mã hóa tự nhiên cho tốn lập lịch flow shop tổng quát 75 2.2.3 Các kết thử nghiệm 80 2.3 Kết luận 81 CHƢƠNG MỘT THUẬT TOÁN DI TRUYỀN LAI MỚI CHO BÀI TOÁN LẬP LỊCH JOB SHOP 82 3.1 Các lịch biểu tích cực bán tích cực 82 3.2 Thuật toán GT 85 3.3 Một thuật toán di truyền lai cho toán lập lịch job shop 88 3.3.1 Mã hoá lời giải 89 3.3.2 Khởi tạo tập lời giải cho hệ ban đầu 90 3.3.3 Xây dựng hàm thích nghi 90 3.3.4 Các toán tử di truyền 91 3.3.5 Thuật tốn tiến hóa 95 3.3.6 Tính đắn thuật toán đƣợc đề nghị 96 3.4 Song song hóa thuật tốn di truyền lai cho toán lập lịch job shop 97 3.4.1 Mơ tả thuật tốn 97 3.4.2 Thủ tục di truyền song song cho JSP 99 3.4.3 Cài đặt thuật toán 100 3.5 Kết thử nghiệm 101 3.5.1 Kết thử nghiệm thuật toán 101 3.5.2 Kết thử nghiệm thuật toán song song 104 3.6 Kết luận 107 CHƢƠNG PHÂN TÍCH TÍNH HỘI TỤ CỦA THUẬT TỐN DI TRUYỀN LAI MỚI CHO BÀI TOÁN LẬP LỊCH JOB SHOP 109 4.1 Lý thuyết Xích Markov 109 4.1.1 Khái niệm xích Markov 110 4.1.2 Các tính chất Xích Markov 112 4.2 Xích Markov Ergodic 113 4.3 Phân tích tính hội tụ thuật tốn di truyền lai cho toán lập lịch job shop 114 4.3.1 Phân tích tính hội tụ thuật tốn di truyền truyền thống 114 4.3.2 Phân tích tính hội tụ thuật tốn di truyền với cá thể tinh hoa toán tử chép 122 4.4 Kết luận 126 KẾT LUẬN 127 HƢỚNG NGHIÊN CỨU TIẾP THEO 128 DANH MỤC CƠNG TRÌNH KHOA HỌC CỦA TÁC GIẢ LIÊN QUAN ĐẾN LUẬN ÁN 129 TÀI LIỆU THAM KHẢO 131 PHỤ LỤC 141 DANH MỤC CÁC KÝ HIỆU VÀ TỪ VIẾT TẮT ACO Ant Colony Optimization AI Artificial Intelligence AS Ant System BB Branch and Bound CPU Central Processing Unit FSP Flow shop Scheduling Problem GA Genetic Algorithms GLS Genetic Local Search GT Giffler and Thompson 10 HTT Hyper Threading Technology 11 IM Iterative Improvement 12 JSP Job shop Scheduling Problem 13 MIP Mixed Integer linear Programming 14 MPP Massively Parallel Processor 15 PFSP Permutation Flow shop Scheduling Problem 16 RISC Reduced Instructions Set Computer 17 SA Simulated Annealing 18 SB Shifting Bottleneck 19 TA Threshold Acceptance 20 TS Tabu Search DANH MỤC CÁC BẢNG Bảng 1.1 - JSP công việc, máy 28 Bảng 2.1 - PFSP công việc máy 56 Bảng 2.2 - PFSP công việc máy 62 Bảng 2.3 - Các công việc chƣa đƣợc lập lịch 63 Bảng 2.4 - Các công việc chƣa đƣợc lập lịch 63 Bảng 2.5 - Các công việc chƣa đƣợc lập lịch 64 Bảng 2.6 - PFSP công việc máy 66 Bảng 2.7 - Thời gian xử lý công việc máy G H 66 Bảng 2.8 - Mã hóa lời giải theo số tự nhiên 67 Bảng 2.9 - Kết chạy thử nghiệm 73 Bảng 2.10 - FSP máy công việc 75 Bảng 2.11 - Mã hóa lời giải theo số tự nhiên 76 Bảng 2.12 - Kết chạy thử nghiệm 80 Bảng 3.1 - JSP công việc, máy 83 Bảng 3.2 - Mã hoá thao tác số tự nhiên JSP 89 Bảng 3.3 - Nhiệm vụ Master Slave 98 Bảng 3.4 - Kết chạy thử nghiệm toán test Lawrence 101 Bảng 3.5 - So sánh kết chạy thử nghiệm 104 Bảng 3.6 - Kết chạy thử nghiệm NHGA PHGA toán test Muth & Thompson đề nghị 105 Bảng 3.7 - So sánh thời gian chạy thử nghiệm NHGA PHGA 105 PHỤ LỤC Các hàm thuật tốn di truyền lai mà luận án đề xuất đƣợc cài đặt ngôn ngữ C++ nhƣ dƣới đây: Hàm GT() dùng cho khởi tạo quần thể void Gene :: InitGT(Operation ***arrope, int numMachine, int numJob, int numOpe) { Random rd; Operation ***S; S = new Operation **[numMachine + 1]; for(int i = 0; i < numMachine + 1; i++) S[i] = new Operation*[numJob + 1]; List G; List C; List **PM= new List *[numMachine + 1]; for (int i = 0; i < numMachine + 1; i++) PM[i] = new List; for (int i = 1; i Clone(); ope->ES = 0; ope->EC = ope->getPt(); G.Add(ope); } for (int k = 0; k < numOpe ; k++) 141 { Operation *opeMinEc = findOpeMinEC(G); int machineIndex = opeMinEc->getMachine(); List GM; for (int i = 0; i < G.Count; i++) if (G[i]->getMachine() == machineIndex) GM.Add(G[i]); List CM; for (int i = 0; i < GM.Count; i++) if (GM[i]->ES < opeMinEc->EC) CM.Add(GM[i]); int idOpeChooser = rd.Next(CM.Count); Operation *opeChooser = CM[idOpeChooser]; int J = machineIndex; int I = PM[machineIndex]->Count + 1; opeChooser->s = opeChooser->ES; opeChooser->c = opeChooser->EC; S[J][I] = opeChooser->Clone(); PM[J]->Add(S[J][I]); for (int I = 0; i < GM.Count; i++) if (GM[i] != opeChooser) { GM[i]->ES = Max(GM[i]->ES, opeChooser->EC); GM[i]->EC = GM[i]->ES + GM[i]->getPt(); } Operation *opeNext = opeChooser->findOpeNext (arrope, numMachine); if (opeNext != NULL) 142 { G.Add(opeNext); Operation *opeResult = findOpeBothMachine(PM, opeNext); opeNext->ES = Max(opeChooser->EC, opeResult->EC); opeNext->EC = opeNext->ES + opeNext->getPt(); } G.Remove(opeChooser); } for (int i = 1; i InitGT(arrope, numMachine, numJob, numOpe); gene->makespan(); Add(gene); } tinhM(); tinhFitness(); } 143 Hàm tính tham số M void Population :: tinhM() { M = 0; float _M = 0.0; for (int i = 0; i < Count; i++) { ptu[i]->makespan(); _M+ = 2.0*((float)ptu[i]->MakeSpan/nPopulation); } M = (int)_M; } Hàm tính độ thích nghi cá thể void Population :: tinhFitness() { for (int i = 0; i < Count; i++) ptu[i]->fitness(M); } Hàm chọn cá thể tham gia đột biến void Population :: selectMutation() { List temp = Select(); List listMutation; for (int i = 0; i < nPopulation; i++) if (rd.Next() < pMutation) { listMutation.Add(temp[i]); 144 } if (listMutation.Count > 0) for (int i = 0; i < listMutation.Count ; i ++) { for(int ii = 0;ii < 5; ii++) { Gene *ge = listMutation[i]->Clone(); ge->Mutation(); if (ge->updateGene() == true && kiemtratrunggene(ge)==false) { ge->Eval(M); if(ge->MakeSpan MakeSpan) { Add(ge->Clone()); break; } } } } } Hàm đột biến void Gene :: Mutation() { Random rd; int p1, p2; 145 { p1 = rd.Next(Count); p2 = rd.Next(Count); if ((ptu[p1]->getMachine() == ptu[p2]->getMachine()) && (p1 != p2)) { Operation *temp; temp = ptu[p2]; ptu[p2] = ptu[p1]; ptu[p1] = temp; } } while (ptu[p1]->getMachine() != ptu[p2]->getMachine() || (p1 == p2)); } Hàm chọn cá thể tham gia trao đổi chéo void Population :: selectCrossOver3() { List temp = Select(); List listcross; for (int i = 0; i < nPopulation; i++) if (rd.Next() < pCrossover) { listcross.Add(temp[i]); } while (listcross.Count % != 0) listcross.RemoveAt(listcross.Count – 1); 146 if (listcross.Count > 0) for (int i = 0; i < listcross.Count - 2; i += 3) { Gene *g= new Gene; { g->InitCrossOver3 (arrope, numMachine, numJob, numOpe, *listcross[i], *listcross[i + 1], *listcross[i + 2]); } while (g->updateGene() == false); if (kiemtratrunggene(g) == false) { g->Eval(M); Add(g->Clone()); } } } Hàm trao đổi chéo void Gene :: InitCrossOver3(Operation ***arrope,int numMachine, int numJob, int numOpe, Gene g1, Gene g2, Gene g3) { Operation ***S1; S1= new Operation **[numMachine + 1]; for(int i =0; i < numMachine + 1; i++) S1[i] = new Operation*[numJob + 1]; Operation ***S2; S2 = new Operation **[numMachine + 1]; for(int i = 0; i < numMachine + 1; i++) S2[i] = new Operation*[numJob + 1]; 147 Operation ***S3; S3= new Operation **[numMachine + 1]; for(int i = 0; i < numMachine + 1; i++) S3[i] = new Operation*[numJob + 1]; { int k = 0; for (int i = 1; i getPt(); G.Add(ope); } for (int k = 0; k < numOpe ; k++) { Operation *opeMinEc = findOpeMinEC(G); int machineIndex = opeMinEc->getMachine(); 149 List GM; for (int i = 0; i < G.Count; i++) if (G[i]->getMachine() == machineIndex) GM.Add(G[i]); List CM; for (int i = 0; i < GM.Count; i++) if (GM[i]->ES < opeMinEc->EC) CM.Add(GM[i]); Operation *opeChooser = NULL; int num = rd.Next(3); int Lmin = 30000; if (num == 0) { for (int kk = 0; kk < CM.Count; kk++) { int i = CM[kk]->getJob(); int l = 30000; for (int j = 1; j getJob() == i) { l = j; break; } if (l < Lmin) Lmin = l; } int r = S1[machineIndex][Lmin]->getJob(); for (int i = 0; i < CM.Count; i++) 150 { Operation *x = CM[i]; if (x->getJob() == r) opeChooser = x; } } else if (num == 1) { for (int kk = 0; kk < CM.Count; kk++) { int i = CM[kk]->getJob(); int l = 30000; for (int j = 1; j getJob() == i) { l = j; break; } if (l < Lmin) Lmin = l; } int r = S2[machineIndex][Lmin]->getJob(); for (int i = 0; i < CM.Count; i++) { Operation *x = CM[i]; if (x->getJob() == r) opeChooser = x; } } else 151 { for (int kk = 0; kk < CM.Count; kk++) { int i = CM[kk]->getJob(); int l = 30000; for (int j = 1; j getJob() == i) { l = j; break; } if (l < Lmin) Lmin = l; } int r = S3[machineIndex][Lmin]->getJob(); for (int i = 0; i < CM.Count; i++) { Operation *x = CM[i]; if (x->getJob() == r) opeChooser = x; } } int J = machineIndex; int I = PM[machineIndex]->Count + 1; opeChooser->s = opeChooser->ES; opeChooser->c = opeChooser->EC; S[J][I] = opeChooser->Clone(); PM[J]->Add(S[J][I]); for (int i = 0; i < GM.Count; i++) 152 if (GM[i] != opeChooser) { GM[i]->ES = Max(GM[i]->ES, opeChooser->EC); GM[i]->EC = GM[i]->ES + GM[i]->getPt(); } Operation *opeNext = opeChooser->findOpeNext(arrope, numMachine); if (opeNext != NULL) { G.Add(opeNext); Operation *opeResult = findOpeBothMachine(PM, opeNext); opeNext->ES = Max(opeChooser->EC, opeResult->EC); opeNext->EC = opeNext->ES + opeNext->getPt(); } G.Remove(opeChooser); } for (int i = 1; i Clone(); if(max->MakeSpan MakeSpan) { newPopulation.Add(max); Copy(); } else newPopulation.Add(TheBestGene); tinhFtotal(); tinhP(); tinhQ(); for(int i=0;iq >= rd1) newPopulation.Add(ptu[0]->Clone()); else for(int j=1;jq < rd1 && rd1 q) { newPopulation.Add(ptu[j]->Clone()); break; } } return newPopulation; } Hàm chép void Population:: Copy() 154 { Gene *max = NULL; float GiaTri = 0; for (int i=0; iFitness) { max = ptu[i]; GiaTri = max->Fitness; } TheBestGene = max->Clone(); } 155