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,2 MB
Nội dung
Header Page of 113 ĐẠ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 Footer Page of 113 Header Page of 113 ĐẠ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 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 Hoàng Xuân Huấn Hà Nội - 2013 Footer Page of 113 Header Page of 113 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 Hoà, PGS TS Hoàng Xuân Huấn tận tình hƣớng dẫn tác giả trình hoà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 toá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 hoà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 Footer Page of 113 Header Page of 113 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 Footer Page of 113 Header Page of 113 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 Footer Page of 113 Header Page of 113 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ả toán 55 2.1.2 Cách tính thời gian hoàn thành lịch biểu hoá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 toá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ả toán 74 2.2.2 Một thuật toán di truyền mã hóa tự nhiên cho toá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 Footer Page of 113 Header Page of 113 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 toá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 toán di truyền lai cho toán lập lịch job shop 97 3.4.1 Mô tả thuật toá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 TOÁ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 toá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 toán di truyền truyền thống 114 Footer Page of 113 Header Page of 113 4.3.2 Phân tích tính hội tụ thuật toá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 Footer Page of 113 Header Page of 113 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 Footer Page of 113 Header Page 10 of 113 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 Footer Page 10 of 113 Header Page 142 of 113 PHỤ LỤC Các hàm thuật toá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++) Footer Page 142 of 113 141 Header Page 143 of 113 { 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) Footer Page 143 of 113 142 Header Page 144 of 113 { 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(); } Footer Page 144 of 113 143 Header Page 145 of 113 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]); Footer Page 145 of 113 144 Header Page 146 of 113 } 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; Footer Page 146 of 113 145 Header Page 147 of 113 { 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); Footer Page 147 of 113 146 Header Page 148 of 113 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]; Footer Page 148 of 113 147 Header Page 149 of 113 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(); Footer Page 150 of 113 149 Header Page 151 of 113 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++) Footer Page 151 of 113 150 Header Page 152 of 113 { 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 Footer Page 152 of 113 151 Header Page 153 of 113 { 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++) Footer Page 153 of 113 152 Header Page 154 of 113 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() Footer Page 155 of 113 154 Header Page 156 of 113 { Gene *max = NULL; float GiaTri = 0; for (int i=0; iFitness) { max = ptu[i]; GiaTri = max->Fitness; } TheBestGene = max->Clone(); } Footer Page 156 of 113 155 ... 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... viên, Các ví dụ khác lập lịch bao gồm toán vận chuyển (chẳng hạn nhƣ toán ngƣời du lịch, lập lịch hàng không, lập lịch tầu hỏa, ), toán lập lịch tính toán (chẳng hạn nhƣ lập lịch CPU, lập lịch. .. NPC cho P Q Các toán lập lịch toán tối ƣu Ngƣời ta chứng minh đƣợc đa số toán lập lịch NP-hard 1.3 Tổng quan toán lập lịch job shop 1.3.1 Bài toán lập lịch job shop JSP tiếng toán tối ƣu tổ