Ứng dụng một số thuật toán vào giải các bài toán xếp lịch công việc

68 1.9K 9
Ứng dụng một số thuật toán vào giải các bài toán xếp lịch công việc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Nội dung Trang PHẦN I. MỞ ĐẦU 1. Lý do chọn đề tài 2. Mục đích của sáng kiến kinh nghiệm 3. Đối tượng và phạm vi nghiên cứu 4. Cơ sở khoa học của đề tài PHẦN II. NỘI DUNG Chương 1. Ứng dụng một số thuật toán, định lí vào việc giải các bài toán về xếp lịch 1. Xét bài toán xếp lịch 2. Ứng dụng một số thuật toán vào giải các bài toán xếp lịch a. Thuật toán Johnson b. Phương pháp Heuristic. c. Phương pháp duyệt có đặt cận d. Quy hoạch động e. Phương pháp làm mịn dần phương án f. Thuật toán tối ưu cho một số bài đặc biệt g. Phương pháp thế vị h. Phương pháp dựa vào luồng và đồ thị hai phía Chương 2. Một số bài tập về sắp xếp lịch PHẦN III. KẾT LUẬN VÀ KIẾN NGHỊ 2 2 2 2 4 8 8 11 16 20 25 34 37 41 57 68 1 PHẦN I. MỞ ĐẦU 1. Lý do chọn đề tài. Vào năm học 2010 – 2011 tôi đã viết về đề tài “Ứng dụng một số thuật toán vào giải các bài toán xếp lịch công việc” và được xếp bậc 4/4 của Sở GD - ĐT. Sau 3 năm trong quá trình dạy học tôi đã tìm hiểu, nghiên cứu, đúc rút thêm được một số kiến thức phương pháp giải các bài toán xếp lịch công việc, nên tôi phát triển thêm đề tài năm 2010 – 2011 để được một đề tài hoàn thiện hơn (Sáng kiến năm 2010 – 2011 tôi đã nêu được 4 phương pháp, năm nay tôi bổ sung thêm 4 phương pháp nữa). Bài toán xếp lịch công việc nảy sinh từ nhiều vấn đề thực tế khác nhau: giao việc, gia công các chi tiết máy, đóng gói hàng hóa vào một hoặc nhiều thùng, xếp lịch thi đấu, lịch học tập, hành trình du lịch, chọn đối tượng và phương án thi công, bài toán vận tải xếp hàng, điều hành xe, chọn địa điểm xây dựng nhà máy, kế hoạch sản xuất các sản phẩm, xếp thời gian cho phép (chỉ có thể chọn ra phương án tương đối thích hợp với điều kiện dữ liệu cụ thể nào đó), hơn nữa nhiều bài dưới dạng tổng quát còn được xếp vào lớp bài toán còn hạn chế ở một số bài tập gặp trong kì thi học sinh giỏi Tin học trước đây và nêu một số cách giải thích hợp. Qua việc giới thiệu các bài tập tôi cố gắng minh họa một số phương pháp thường gặp nhất trong bài toán xếp lịch Lí do chủ yếu để chọn các phương pháp là cân nhắc tới mức độ tiếp thu của học sinh phổ thông trung học. 2. Mục đích của sáng kiến kinh nghiệm. - Ứng dụng các thuật toán để giải các bài toán về xếp lịch, sưu tầm một số bài toán liên quan đến xếp lịch. - Đưa vào bồi dưỡng học sinh đi thi học sinh giỏi tỉnh. - Đưa vào tài liệu của tổ chuyên môn. 3. Đối tượng và phạm vi nghiên cứu: 3.1 Đối tượng nghiên cứu: - Các bài toán về xếp lịch để giảng dạy cho học sinh đi thi học sinh giỏi tỉnh. 3.2 Phạm vi nghiên cứu: 2 - Với các thuật toán, định lí, các bài toán, tôi áp dụng vào dạy học sinh ôn thi học sinh giỏi tỉnh. 4. Cơ sở khoa học của đề tài: 4.1 Cơ sở lí luận: Các bài toán về xếp lịch được ứng dụng rất nhiều trong thực tiễn, với sự phát triển của CNTT như hiện nay thì việc áp dụng CNTT vào các cơ quan tổ chức là một việc làm đúng đắn, mà công việc xếp lịch rất phổ biến 4.2 Cơ sở thực tiễn: - Đây là bài toán có nhiều ứng dụng trong thực tiễn, từ những bài sắp xếp lịch công việc đơn giản đến các công việc phức tạp hơn như xếp thời khóa biểu của một trường học,… 3 NỘI DUNG SÁNG KIẾN KINH NGHIỆM CHƯƠNG 1. ỨNG DỤNG MỘT SỐ THUẬT TOÁN, ĐỊNH LÍ VÀO VIỆC GIẢI CÁC BÀI TOÁN VỀ XẾP LỊCH 1. Xét bài toán xếp lịch sau: Giả sử trong một phiên làm việc từ thời điểm 0 đến thời điểm T=8640000, một trung tâm tính toán phải thực hiện N chương trình, chương trình i thực hiện từ thời điểm a[i] đến thời điểm b[i], 0 [ ] [ ]a i b i T≤ ≤ < . Cho trước một đoạn thời gian (P 1 , Q 1 ). Hãy xét xem liệu tại mọi thời điểm của đoạn đó luôn có chương trình chạy hay không? Cho trước một đoạn thời gian (R 1 , S 1 ). Hãy xét xem liệu tại mọi thời điểm của đoạn đó luôn không có chương trình nào chạy hay không? Hãy tìm đoạn thời gian (P, Q) dài nhất sao cho tại mọi điểm của nó luôn có chương trình chạy. Hãy tìm đoạn thời gian (R, S) dài nhất sao cho tại mọi điểm của nó đều không có chương trình nào chạy. Dữ liệu vào được cho bởi file văn bản LICHTRUC.INP có cấu trúc - Dòng thứ nhất ghi số nguyên dương 200N ≤ . - Dòng thứ i+1 (1 )i N≤ ≤ ghi hai số nguyên không âm A[i] và B[i] - Dòng thứ N+2 ghi hai số nguyên không âm P 1 , Q 1 ( 1 1 P Q≤ ) - Dòng thứ N+3 ghi hai số nguyên không âm R 1 , S 1 ( 1 1 R S≤ ) Dữ liệu ra ghi vào file văn bản LICHTRUC.OUT có cấu trúc - Dòng đầu tiên ghi 1 hoặc 0 tùy thuộc kết quả cụ thể (tìm được ghi số 1, không tìm được ghi số 0). - Dòng thứ hai cũng ghi 1 hoặc 0 theo nghĩa trên. - Dòng thứ ba ghi hai số P, Q - Dòng thứ tư ghi hai số R, S. 4 Ví dụ: LICHTRUC.INP LICHTRUC.OUT 5 1000 10000 2000 20000 20000 100000 200000 500000 8000000 8500000 1000 100000 0 1000 1 0 8000000 8500000 500001 7999999 Nhận xét: Để giải bài toán này thì ta có thể dùng mảng một chiều A (mỗi phần tử là một bản ghi gồm 2 trường: thời điểm đầu và thời điểm cuối của mỗi chương trình). Sắp mảng A theo thời điểm đầu của mỗi chương trình. Sau đó duyệt mảng A để tạo mảng B (cùng kiểu với A) lưu các đoạn gồm các thời điểm liên tiếp có chương trình, và tạo mảng C để lưu các đoạn gồm các thời điểm liên tiếp không có chương trình nào. Dựa vào mảng B và C dẫn ra kết luận thích hợp. Chương trình const T=8640000; max=1000; fi='lichtruc.inp'; fo='lichtruc.out'; type re=record d,c:longint end; m1=array[1 max] of re; var a,b,c:m1; f:text; n,sd,sr,i,j:integer; p,q,r,s:longint; procedure readfile; var i:integer; g:text; begin assign(g,fi); reset(g); readln(g,n); for i:=1 to n do begin read(g,a[i].d,a[i].c); readln(g); end; readln(g,p,q); readln(g,r,s); close(g); end; procedure sort; var i,j:integer; tgd,tgc:longint; begin 5 for i:=1 to n -1 do for j:=i+1 to n do if a[i].d>a[j].d then begin tgd:=a[i].d; a[i].d:=a[j].d; a[j].d:=tgd; tgc:=a[i].c; a[i].c:=a[j].c; a[j].c:=tgc; end; end; procedure Create_b_c; var i,j:integer; last:longint; begin sd:=1; i:=1; b[sd].d:=a[i].d; last:=a[i].c; while i<n do begin if a[i+1].d>last+1 then begin b[sd].c:=last; inc(sd); b[sd].d:=a[i+1].d; last:=a[i+1].c; inc(i); end else begin if a[i+1].c > last then last:=a[i+1].c; inc(i); end; end; b[sd].c:=last; sr:=1; if b[1].d<>0 then begin c[sr].d:=0; c[sr].c:=b[1].d-1; inc(sr); end; i:=2; while i<=sd do begin c[sr].d:=b[i-1].c+1; c[sr].c:=b[i].d-1; inc(sr); inc(i); end; if b[sd].c<T then begin c[sr].d:=b[sd].c+1; c[sr].c:=t; end; end; procedure caua; 6 var i:integer; begin for i:=1 to sd do if (b[i].d<=p) and (b[i].c>=q) then begin writeln(f,1); exit; end; writeln(f,0); end; procedure caub; var i:integer; begin for i:=1 to sr do if (c[i].d<=r) and (c[i].c>=s) then begin writeln(f,1); exit; end; writeln(f,0); end; procedure cauc; var ld,lc,lmax:longint; i:integer; begin lmax:=-1; for i:=1 to sd do if (b[i].c-b[i].d)>lmax then begin lmax:=b[i].c-b[i].d; ld:=b[i].d; lc:=b[i].c; end; writeln(f,ld,' ',lc); end; procedure caud; var ld,lc,lmax:longint; i:integer; begin lmax:=-1; for i:=1 to sr do if (c[i].c-c[i].d)>lmax then begin ld:=c[i].d; lc:=c[i].c; lmax:=c[i].c-c[i].d; end; writeln(f,ld,' ',lc); end; begin assign(f,fo); rewrite(f); readfile; sort; create_b_c; caua; caub; cauc; caud; 7 close(f); end. 2. ứng dụng một số thuật toán vào giải các bài toán xếp lịch a. Dựng thut toỏn Johnson Vớ d: Lp lch gia cụng trờn hai mỏy Mt sn phm gm N chi tit, mi chi tit phi gia cụng ln lt trờn hai mỏy A v B (A trc, B sau). Thi gian thc hin chi tit i trờn mỏy A l A i , trờn mỏy B l B i (i=1, 2, , N). Hóy xp lch hon thnh sn phm vi thi gian ớt nht. Hin lch v thi gian hon thnh. D liu vo t file GIACONG.INP cú cu trỳc: - Dũng u tiờn l s nguyờn dng N - N dũng tip theo: dũng i+1 l hai s A i v B i . D liu ra ghi vo file GIACONG.OUT cú cu trỳc: - Dũng u tiờn l thi gian ớt nht thc hin N cụng vic - Dũng th hai ln lt ghi s hiu ca N cụng vic thc hin theo lch ti u. Vớ d: GIACONG.INP GIACONG.OUT 5 3 3 4 3 6 2 5 7 6 3 26 1 4 2 5 3 gii bi toỏn trờn ta xột nh lớ sau: * nh lớ Johnson Phng ỏn v={v[1], v[2],,v[N]} ln lt thc hin cỏc chi tit v[1], v[2], , v[N] vi thi gian nh nht khi v ch khi Min{A v[k] , B v[k+1] } {B v[k] , A v[k+1] } 1,2, , 1,k n = trong ú A v[k] l thi gian thc hin v[k] v A [k+1] l thi gian thc hin v[k+1] trờn mỏy A, cũn B v[k] v B v[k+1 ] tng ng l thi gian thc hin v[k] v v[k+1] trờn mỏy B. 8 Từ định lí trên có thể đưa ra thuật toán để giải bài toán trên, và chứng minh sự đúng đắn của thuật toán sau: * Thuật toán: + Bước 1: Chia các chi tiết thành hai nhóm: Nhóm 1: gồm các chi tiết i mà i i A B≤ . Nhóm 2: gồm các chi tiết i mà i i A B> + Bước 2: Xếp nhóm 1 theo chiều tăng của A i , xếp nhóm 2 theo chiều giảm của B i . + Bước 3: Nối nhóm 2 vào sau nhóm 1 * Chứng minh: Nếu các chi tiết v[k] và v[k+1] cùng thuộc nhóm 1 thì [ 1] [ 1] [ ]v k v k v k B A A + + ≥ ≥ nên Min{A v[k] ,B v[k+1] }=A v[k] , mặt khác [ ] [ 1] [ ] [ ] , , v k v k v k v k A A A B + ≤ ≤ nên [ ] [ ] [ 1] { , } v k v k v k A Min B A + ≤ Vậy Min {A v[k] ,B v[k+1] } ≤ Min {B v[k] , A v[k+1] } Nếu chi tiết v[k] và v[k+1] cùng thuộc nhóm 2 thì [ 1] [ ] [ ]v k v k v k B B A + ≤ < nên Min {A [k] , B v[k] }=B v[k+1] mặt khác [ ] [ 1] [ 1] [ 1] , v k v k v k v k B B A B + + + ≥ ≥ nên Min {B v[k] , A v[k+1] } ≥ B v[k+1] . Vậy Min {A v[k] , B v[k] } ≤ Min {B v[k] , A v[k+1] }. Nếu chi tiết v[k] thuộc nhóm 1 và chi tiết v[k+1] thuộc nhóm 2 thì: Min {A v[k] , B v[k+1] } ≤ Min {B v[k] , A v[k+1] } do A v[k] ≤ B v[k] và B v[k+1] < A v[k+1] . có thể thực hiện cụ thể như sau: Xây dựng dần dãy kết quả từ hai đầu dồn vào giữa (dùng mảng một chiều KQ và hai biến: đầu và cuối). 1. Gán giá trị ban đầu: đầu:=0; cuối:=N+1; 2. Thực hiện vòng lặp: trong khi đầu < cuối a. Tìm chi tiết i chưa làm, có thời gian thực hiện nhỏ nhất. b. Nếu i thuộc dãy A thì tăng giá trị biến đầu, gán KQ[đầu]:=i, nếu i thuộc dãy B thì giảm giá trị biến cuối, gán KQ[cuối]:=i; 3. Đánh dấu đã làm chi tiết i. Cµi ®Æt ch¬ng tr×nh: const max=100; fi='giacong.inp'; fo='giacong.out'; 9 type m1=array[1 2,1 max] of integer; mkq=array[1 max] of byte; mdd=array[1 max] of boolean; var a:m1; kq:mkq; dd:mdd; n:byte; g,f:text; procedure readfile; var i:byte; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do readln(f,a[1,i],a[2,i]); close(f); end; function chitietmin(var may:byte):byte; var i,j,chitiet:byte; lmin:integer; begin lmin:=maxint; for i:=1 to 2 do for j:=n downto 1 do if not dd[j] then if (a[i,j]<lmin) then begin may:=i; chitiet:=j; lmin:=a[i,j]; end; chitietmin:=chitiet; end; procedure johnson; var may,chitiet,dau,cuoi:byte; begin fillchar(dd,sizeof(dd),false); dau:=0; cuoi:=n+1; repeat chitiet:=chitietmin(may); if may=1 then begin inc(dau); kq[dau]:=chitiet; dd[chitiet]:=true; end else begin dec(cuoi); kq[cuoi]:=chitiet; dd[chitiet]:=true; end; until dau=cuoi-1; end; procedure writefile; var i:byte; begin 10 [...]... END f Thuật toán tối ưu cho một số bài toán đặc biệt Trong một số bài, bằng suy luận toán học có thể tìm ra các công thức thể hiện quan hệ ràng buộc giữa các đại lượng cho trong bài toán, từ đó có thể sắp các công việc theo một khóa nào đó đặc trưng cho công việc Viết chương trình thể hiện sự sắp xếp đó (tăng hoặc giảm) để tìm lịch tối ưu Xét bài toán sau: Bài 3 Lập lịch có thưởng phạt Có N công việc. .. Trong một số trường hợp, khi giải một bài toán A, trước hết ta tìm họ bài toán A(p) phụ thuộc tham số p (có thể là một véc tơ) mà A(p 0)=A với p0 là trạng thái ban đầu của bài toán A Sau đó tìm cách giải họ bài toán A(p) với tham số p bằng cách áp 21 dụng nguyên lý tối ưu của Bellman Cuối cùng cho p=p0 sẽ nhận được kết quả của bài toán A ban đầu Các thuật ngữ dùng trong quy hoạch động: Bài toán giải. .. Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy hoạch động Công thức phối hợp nghiệm của các bài toán con để có nghiệm của bài toán lớn gọi là công thức truy hồi của quy hoạch động Tập các bài toán có ngay lời giải để từ đó giải quyết các bài toán lớn hơn gọi là cơ sở quy hoạch động Không gian lưu trữ lời giải các bài toán con để tìm cách phối hợp chúng gọi là bảng phương án của quy... writefile; close(g);; end b Xếp lịch theo heuristic - Về thuật giải heuristic Nhiều bài toán xếp lịch có dữ liệu vào lớn không thể áp dụng thuật toán cho lời giải tối ưu trong thời gian cho phép, trong những trường hợp đó chúng thường được giải bằng phương pháp heuristic (một chiến thuật tìm kiếm hợp lí nào đó) để có lời giải tương đối tối ưu thực hiện trong thời gian cho phép Bài toán xếp lịch thường có 2 yêu... CHIA.OUT 8 3 214 56 Phân tích bài toán: Với bài toán trên ta có thể thực hiện một heuristic sau: 1 Sắp xếp công việc theo thứ tự thời gian hoàn thành giảm dần 2 Lấy M công việc đầu phân công cho M máy, mỗi máy một việc Gọi maxT là thời gian lớn nhất của M công việc này 3 Vòng lặp 1 + Vòng lặp 2: Chọn máy có thời gian đã làm nhỏ hơn maxT, xếp thêm một công việc mới cho máy này (công việc lấy theo thứ tự đã... chọn được 3 số hạng nhưng nếu bỏ qua 8 và 10 thì ta chọn được 5 số hạng 1, 2, 4, 6, 7 Khi giải một số bài toán bằng cách "chia để trị", chuyển việc giải bài toán kích thước lớn về việc giải nhiều bài toán cùng kiểu có kích thước nhỏ hơn thì các thuật toán này thường được thể hiện bằng các chương trình con đệ quy Khi đó, trên thực tế, nhiều kết quả trung gian phải được tính nhiều lần Nói các khác phương... đổi một vài heuristic trong quá trình giải để thích ứng với các bộ dữ liệu khác nhau, kết hợp so sánh kết quả thực hiện các heuristic khác nhau và giữ lại kết quả tốt hơn Ví dụ: Chia N việc cho M máy Cho N công việc, công việc i hoàn thành trong thời gian t i Các công việc được thực hiện trên M máy (công suất như nhau, mỗi máy đều có thể thực hiện được công việc bất kì trong N công việc) mỗi công việc. .. 61 10 9 14 71 - Xếp tăng bộ dữ liệu theo khóa là thời điểm cuối cùng phải kết thúc công việc - Đặt cận: Tổng tiền k công việc+ Giá trị tối đa các công việc còn lại>Tổng tiền của phương án tốt nhất đã có Ta thấy rằng khi thử chọn công việc k thì có thể dẫn tới sự kiện hàng loạt công việc khác bị loại vì việc hoàn thành công việc k sẽ đẩy lùi thời điểm có thể bắt đầu thực hiện các công việc này dẫn đến... được giải Kết quả cuối cùng chính là kết quả của bài toán cần giải. Cụ thể như sau: Phương pháp quy hoạch động cùng nguyên lý tối ưu được nhà toán học Mỹ R.Bellman đề xuất vào những năm 50 của thế kỷ 20 Phương pháp này đã được áp dụng để giải hàng loạt bài toán thực tế trong các quá trình kỹ thuật của công nghệ, tổ chức sản xuất, kế hoạch hoá kinh tế… Tuy nhiên cần lưu ý rằng có một số bài toán giải. .. Có những bài toán mà quyết định ở bước thứ i phụ thuộc vào quyết định ở các bước trước đó Nếu ta xác định được hệ thức diễn đạt mối tương quan của quyết đinh ở bước thứ i với quyết định ở bước trước đó thì ta có thể triển khai chương trình theo hệ thức đã tìm được Khi đó việc giải các bài toán có kích thước lớn sẽ được chuyển về việc giải các bài toán cùng kiểu có kích thước nhỏ hơn .Các thuật toán này . DUNG Chương 1. Ứng dụng một số thuật toán, định lí vào việc giải các bài toán về xếp lịch 1. Xét bài toán xếp lịch 2. Ứng dụng một số thuật toán vào giải các bài toán xếp lịch a. Thuật toán Johnson b biểu của một trường học,… 3 NỘI DUNG SÁNG KIẾN KINH NGHIỆM CHƯƠNG 1. ỨNG DỤNG MỘT SỐ THUẬT TOÁN, ĐỊNH LÍ VÀO VIỆC GIẢI CÁC BÀI TOÁN VỀ XẾP LỊCH 1. Xét bài toán xếp lịch sau: Giả sử trong một phiên. kinh nghiệm. - Ứng dụng các thuật toán để giải các bài toán về xếp lịch, sưu tầm một số bài toán liên quan đến xếp lịch. - Đưa vào bồi dưỡng học sinh đi thi học sinh giỏi tỉnh. - Đưa vào tài liệu

Ngày đăng: 24/05/2015, 20:30

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan