You are on page 1of 4

Ư'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 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;

Begin

for i:=1 to n do

if (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}

begin

if (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}

else

p[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;

Begin

Input;

for i:=1 to n do {Bắtđầu từ nhóm có số thí sinh nhỏ nhất}

begin

for j:=1 to m do

if (e[i] ≤ r[j])then {Tìm phòng nhỏ nhất có thể chứa được nhóm i}

begin

p[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}

begin

PushUp(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ên

Hai 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.

You might also like