Thuật toán tô mầu đồ thị

4 4.6K 88
Thuật toán tô mầu đồ thị

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

Thông tin tài liệu

Thuật toán tô mầu đồ thị

Ư'ng dụng thuật toán màu đồ thịLê Thanh Hà(Tiếp theo số trước)Thuật toán xếp các nhóm thivào các phòng thi (Thuật toán 2):Sắp xếp các nhóm thi tăng dầntheo số lượng thí sinh trong nhóm e1, e2, ., en.Kí hiệu |ei| là số lượng của nhóm ei. Tương tự sắp xếp các phòng theothứ tự tăng dần theo kích cỡ R1, R2, ., Rn.Kí hiệu |Ri| là độ lớn của phòng thi Ri.Bước 1: Đặt i=1 , j=1, D1 = φ.Bước 2: Nếu |ei|≤ |Rj| thì thêm eivào Rj.Ngược lại đặt j=j+1, lặp lại Bước 2.Bước 3: Đặt k = j.Bước 4: Nếu ≥ |Rk|, tìm tập các nhóm trong Rk sao chotổng số số lượng của các nhóm lớn nhất, nhưng chứa được trong Rkhay.Nếu k=m đặt Di+1= Di hợp {các nhóm còn lại}Ngược lại đặt chúng vào Rk+1, k = k+1, Di+1 = Di và lặp lại bước 4.Bước 5: Đặt i = i+1.Nếu i ≤ n, lặp lại bước 2.Thuật toán bắt đầu xếp lần lượttừ nhóm nhỏ nhất trong danh sách vào các phòng. Thuật toán đặt mỗi nhóm vàophòng nhỏ nhất có thể chứa nó. Nếu số lượng thí sinh trong phòng đó lớn hơn khảnăng chứa của phòng, thuật toán sẽ đẩy một số ít thí sinh nhất lên phòng cókích thước lớn hơn. Nếu số phòng đã hết trong khi số nhóm vẫn còn, thì số nhómđó sẽ được đặt trong tập DUD (tập Di ở vòng lặp cuối cùng), tập DUD chứa nhữngnhóm không thể xếp vào các phòng trong đợt thi này.Cài đặt:Cấu trúc dữ liệu Mảng 1 chiều chứa kích thước của nnhóm đã được sắp xếp tăng dần: E, E[i] là số thí sinh trong nhóm i.Mảng 1 chiều chứa sức chứa của mphòng đã được sắp xếp tăng dần: R, R[i] là sức chứa của phòng i.Mảng 1 chiều xác định nhóm thuộcphòng: p, p[i] là chỉ số phòng mà nhóm i thuộc. P[I]=DUD=m+1 nếu phòng đó khôngđược xếp vào một phòng nào cả.Các thủ tục và hàm sử dụngtrong chương trình:procedure input; Nhập hai mảng Evả R, khởi tạo tất cả các phòng đều chưa được xếp (p[i]=0). Chú ý: phòng chưađược xếp khác với phòng không được xếp (p[i]=DUD)procedure output; Xuất mảng p thểhiện nhóm nào đã được xếp vào phòng nào.procedure PushUp(k:byte; sum:integer);{Đẩynhóm lên phòng có kích thước lớn hơn}var i:byte;Beginfor i:=1 to n doif (p[i]=k) and sum-e[i] ≤ r[k]) then {Tìm một nhóm thuộc phòng k sao cho nếu loại nhóm đó đi thì phòng đó chứa đủ số nhóm còn lại}beginif (k < m) then {Ne^'uchu+a pha?i la` pho`ng cuo^'i cu`ng}p[i]:=k+1{đẩy nhóm lên phòng cao hơn}elsep[i]:=DUD;{Khôngxếp phòng cho nhóm này, đẩy nhóm này vào tập DUD}break;end;End; {Chú ý: ở đây ta chỉ xét việc đẩy1 phòng ra, nếu muốn bạn có thể cài đặt đẩy số nhiều nhóm ra hơn sao cho tổngsố thí sinh được đẩy ra là nhỏ nhất, càng ít thí sinh bị đẩy ra thì càng tốt}function SumK(k:byte):integer;Tính tổng số thí sinh trong phòng k.Chương trình chính:procedure main;var i,j,k,t:byte;sum:integer;BeginInput;for i:=1 to n do {Bắtđầu từ nhóm có số thí sinh nhỏ nhất}beginfor j:=1 to m doif (e[i] ≤ r[j])then {Tìm phòng nhỏ nhất có thể chứa được nhóm i}beginp[i]:=j; {Đặtnhóm i vào phòng j}break; end;k:=j;sum:=SumK(k); {Tính sốthí sinh trong phòng k}while(sum>r[k]) do{Nếu số thí sinh lớn hơn khả năng chứa của phòng k}beginPushUp(k,sum);{Đẩymột số nhóm lên phòng có sức chứa lớn hơn}inc(k); sum:=SumK(k);{Làmtương tự đối với phòng trên}end;end;Ouput;end;Lập lịch thi theo hai thuậttoán trênHai thuật toán trên đã được xâydựng xong. Thuật toán thứ nhất dùng để phân chia các nhóm thành những tập hợpđộc lập với nhau. Thuật toán thứ hai sẽ xếp các tập đó vào các phòng thích hợp.Ta có thể sử dụng cả hai thuật toán để được một công cụ xếp lịch thi tương đốitốt.Cho một số phòng thi, cho các nhóm thi và các ràng buộc của chúng được thể hiệntrên đồ thị G. Mỗi nhóm là một đỉnh của đồ thị, hai đỉnh có cạnh nối với nhaunếu hai nhóm tương ứng xung đột nhau.Đồ thị G là dữ liệu vào.Bước 1: Đặt p = 1.Bước 2: Dùng thuật toán 1để tìm ra một tập các nhóm không xung đột với nhau, tập I.Bước 3: Từ tập I, sử dụng thuật toán 2 để đặt mỗi nhóm trong I vào phòngthích hợp. Những nhóm chưa được xếp (nằm trong DUD) sẽ được xếp trong đợt thisau.Bước 4: Đặt p = p+1.Bước 5: Xoá tất cả cácđỉnh (và các cạnh nối đến chúng) trong I trừ các đỉnh có nhóm tương ứng nằmtrong DUD, ta có đồ thị G. Nếu G là một đồ thị rỗng, việc xếp thời khoá biểuhoàn thành.Bước 6: Bắt đầu với từ đỉnh được nhập bởi nhiều đỉnh mà nhóm tương ứng cótrong DUD. Nếu DUD rỗng chọn đỉnh có bậc lớn nhất. Sử dụng thuật toán 1 để tạotập I mới có từ đồ thị G. Đặt G = G, Quay lại bước 3. Thuật toán trên là tổng hợp củahai thuật toán đã trình bày trước. Cài đặt thuật toán này không quá khó khăn.Bạn có thể tự mình cài đặt được.Bài toán xếp lịch, cụ thể là bàitoán xếp lịch thi tuy đã được chứng minh là thuộc lớp bài toán NP-đầy đủ(NP-complete), nhưng nếu biết sử dụng một một chiến thuật thuật toán hợp lýcùng với sự phát triển như vũ bão của công nghệ máy tính bài toán trên cũngphần nào đã được giải quyết. . Ư'ng dụng thuật toán tô màu đồ thịLê Thanh Hà(Tiếp theo số trước )Thuật toán xếp các nhóm thivào các phòng thi (Thuật toán 2):Sắp xếp các nhóm. dụng thuật toán 1 để tạotập I mới có từ đồ thị G. Đặt G = G, Quay lại bước 3. Thuật toán trên là tổng hợp củahai thuật toán đã trình bày trước. Cài đặt thuật

Ngày đăng: 11/09/2012, 15:27

Từ khóa liên quan

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

Tài liệu liên quan