Tải bản đầy đủ (.docx) (8 trang)

Bài toán xếp lịch

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (80.64 KB, 8 trang )

Bài toán xếp lịch
18 Tháng Ba 2011
11:48 SA

Ứng dụng thuật toán tô màu đồ thị để giải quyết Bài toán xếp lịch

Giới thiệu bài toán

Bài toán xếp lịch có một lịch sử phát triển dài, trải qua nhiều sự thay đổi lớn. Kể từ
những thế hệ đầu tiên
của máy tính,người ta đã nghĩ đến việc sử dụng máy tính để trợ giúp người xếp lịch. Ban
đầu đó chỉ là những
công cụ trợ giúp cho việc phân công những công việc điều hành phối hợp. Sau này mới
thực sự được phát triển
thành những công cụ xếp lịch cụ thể.

Bài toán xếp lịch được chia thành những lớp bài toán cụ thể sau:

- Xếp thời khoá biểu. Thường được sử dụng trong các trường Phổ thông, Đại học.
- Xếp lịch thi. Được quan tâm mỗi khi kì thi tuyển sinh Đại học hoặc thi học kì ở các
trường Đại học và Cao đẳng.
- Xếp lịch công tác cán bộ. Được sử dụng chủ yếu ở các cơ quan, tổ chức lớn.
....

Tuy nhiên trong bài báo này chúng ta chỉ quan tâm đến bài toán xếp lịch thi trong các
trường Đại học.

Phát biểu bài toán

Bài toán được phát biểu như sau: Vào cuối mỗi một học kì, các trường đại học phải tổ
chức một đợt thi cho từng


khoa hoặc cả trường.

Trường có một nhiều phòng thi, các phòng có kích cỡ khác nhau (khả năng chứa thí
sinh).
Mỗi lớp có thể được chia thành nhiều nhóm thi, mỗi nhóm thi thi trong một phòng, mỗi
phòng có thể có nhiều
nhóm cùng thi. Và tổng số lượng thí sinh của các nhóm phải nhỏ hơn hoặc bằng kích cỡ
của phòng.

Kì thi được chia thành các đợt thi. Mỗi nhóm sẽ thi một môn trong một đợt thi.

Yêu cầu chặt chẽ: có một số môn thi không được thi cùng đợt với môn thi khác, các
nhóm của cùng một lớp
(nếu có thể) phải thi trong cùng một đợt.

Ta có thể chia bài toán trên thành 2 bài toán đơn giản hơn:

- Phân bổ các nhóm thi vào các đợt thi sao cho chúng không xung đột nhau (không vi
phạm ràng buộc).
Xây dựng một đồ thị G, với mỗi đỉnh là một nhóm, nối cạnh giữa hai đỉnh mà nhóm của
chúng có ràng
buộc với nhau, tìm cách tô màu và sắc số p của đồ thị G. Số p là giới hạn dưới của số
các đợt thi. Các
đỉnh được tô cùng màu có nhóm tương ứng được xếp vào một đợt thi.

- Tìm cách xếp các nhóm trong một đợt thi (đã tìm được ở trên) vào các phòng thi của
trường.

Bài toán tô màu đồ thị và sắc số đồ thị


Cho trước một số nguyên dương P, ta nói rằng đồ thị G có P sắc có nghĩa là: chỉ bằng P
màu khác
nhau ta có thể tô màu tất cả các đỉnh sao cho 2 đỉnh liền kề bất kỳ có màu khác nhau.
Khi số p nhỏ
nhất thì ta gọi P là sắc số của đồ thị và việc tìm cách tô P màu lên đồ thị chính là bài
toán tô màu đồ thị.

Ví dụ:

Việc tô màu bản đồ hành chính, ta phải tô màu các nước sao cho: mỗi Quốc gia được tô
một màu,
hai nước có liền kề (có chung biên giới) không được tô cùng một màu.

Ta thiết lập một đồ thị G, có tập các đỉnh là tập tất cả các quốc gia trên bản đồ. Hai nước
liền kề nhau
thì có cạnh nối hai đỉnh tương ứng với nhau. Ta tiến hành tìm sắc số của đồ thị này.

Đây là trường hợp riêng của bài toán tô màu đồ thị. Khi đồ thị chỉ là đồ thị phẳng. Người
ta đã chứng
minh được rằng: chỉ cần nhiều nhất là 4 màu để tô đồ thị này. Từ lâu người ta đã chứng
minh bài toán
tô màu đồ thị thuộc lớp NP - đầy đủ. Tuy nhiên nếu dùng một chiến thuật thuật hợp lý
thì kết quả thu được
cũng có thể chấp nhận được.

Thuật toán tìm sắc số của đồ thị (Thuật toán 1):

Giả sử chúng ta có một đồ thị chứa các đỉnh x và y. G: xy là một đồ thị thu được từ đồ
thị G bằng
cách thay thế hai đỉnh x và y bằng một đỉnh, đỉnh đó có cạnh nối tới tất cả các đỉnh kề

với đỉnh x, y
hoặc cả x lẫn y. Hay là hai đỉnh x và y đã được nhập với nhau. Đồ thị G - {x} là một đồ
thị thu được
từ đồ thị G bằng cách loại bỏ đỉnh x cùng với tất cả các cạnh nối tới đỉnh x đó. Một đồ thị
trống là đồ
thị không chứa một đỉnh hay một cạnh nào. Hai đỉnh gọi là kề nhau nếu có cạnh nối với
nhau.

Với một đỉnh x bất kỳ, ta xây dựng một tập các bộ 3 như sau:
Graph Code:
L ựa chọn code | Ẩ n/Hi ệ n code
(x, z(1,1), y1)

(x, z(1,2), y1)

. ........

(x, z(1,m1), y1)

. ........

(x, z(i,1), yi)

(x, z(i,2), yi)

. ........

(x, z(i,mi), yi)

. .........


(x, z(n,mn), yn)
Trong đó đỉnh thứ nhất kề với đỉnh thứ hai, đỉnh thứ 2 kề với đỉnh thứ 3. Và không tồn
tại một bộ 3 nào mà:
đỉnh thứ nhất kề hoặc trùng với đỉnh thứ 3. Từ tập các bộ 3 đó, ta tìm các đỉnh yi sao
cho có:
mi = max(m1, m2,..., mn) và đặt yi = x. Nếu có nhiều đỉnh y đạt max ta chọn đỉnh đầu
tiên.
Ta có thể hình dung: Chọn một đỉnh trong số những đỉnh không kề với đỉnh x, kề với
đỉnh (đỉnh trung gian)
kề với đỉnh x, có số đỉnh trung gian là lớn nhất.

Các bước của thuật toán (đồ thị G là dữ liệu vào):

Bước 1: Đặt j = 1, H=G.

Bước 2: Đặt vj là đỉnh có bậc cao nhất trong H.

Bước 3: Từ vj xây dựng tất cả các bộ 3 như trên và tìm đỉnh x. Nếu không tìm được x,
trong trường hợp
không tìm được bộ 3 nào, chọn một đỉnh có bậc lớn nhất không kề với vj.

Bước 4: Nhập x vào vj và quay lại bước 3 cho tới khi không chọn được một đỉnh nào nữa
thì quay lại bước 2
với : H=H-{vj}, j=j+1.

Bước 5: Khi không còn một đỉnh nào còn lại trong H, dựng lại và tô màu i cho tất cả các
đỉnh được
nhập vào vi với (1 =< i =< j). Khi đó j là sắc số của đồ thị G.


Cài đặt:

Dữ liệu:

Mảng hai chiều M chứa ma trận thể hiện đồ thị n đỉnh.

Mảng 1 chiều n phần tử: Color đánh dấu màu của đỉnh i là Color[i].

Mảng 1 chiều n phần tử: Merged, Merged[i]=true nếu đỉnh i đã bị nhập vào 1 đỉnh khác.

Sắc số của đồ thị: Cromatic.

Một số thủ tục và hàm sử dụng trong chương trình:

Procedure Input; Nhập ma trận thể hiện đồ thị G từ file.

Procedure Output; Xuất mảng Color[i] là màu của đỉnh i ra file.

Function Degree(x:byte):byte; Tính bậc của đỉnh x, bậc của đỉnh x là số đỉnh chưa bị
nhập vào đỉnh
khác (hay Merge[I]=false) có cạnh nối với x (M[x,i]=true).

Function MaxDegree:byte; Trả lại đỉnh chưa được tô màu (Color[i]=0) và có bậc lớn nhất
(Degree(i) * Max).

Function NumIntermediate(x,y:byte):byte; Trả về số đỉnh trung gian giữa hai đỉnh x và
y (Đỉnh i là trung gian
của x và y (i<>x; i<>y; Merged[i]=false; M[x,i]=true và M[i,y]=True)

Function MaxIntermediate(x:byte):byte; Trả về đỉnh có số đỉnh trung gian với đỉnh x là

lớn nhất.
NumIntermediate(x,I) * Max.

Function Merge(i,x:byte); Nhập đỉnh I vào đỉnh x. Tìm tất cả các đỉnh chưa nhập vào
đỉnh
nào có cạnh nối với đỉnh i (Merged[j]=false; M[i,j]=true), nối đỉnh đó với đỉnh x
(M[j,x]:=true;M[x,j]:=true),
xoá cạnh nối giữa đỉnh đó với đỉnh i (M[i,j]:=0;M[j,i]=0).

Function NonMaxDegree(x:byte):byte; Tương tự như hàm MaxDegree, tìm đỉnh khác
đỉnh x (i<>x),
không có cạnh nối với x (M[i,x]=false) có bậc lớn nhất (Degree(i) * Max).

Chương trình chính:
Pascal Code:
Lựa chọn code | Ẩn/Hiện code
Procedure main;
var ncol,m,i,mx:byte;
Begin
input;
ncol:=0;{Đặt màu ban đầu bằng 0}
m:=MaxDegree;{m là đỉnh có bậc lớn nhất}
while(m<>0) do {Nếu đồ thị chưa rỗng}
begin
inc(ncol);{Tăng màu, sắc số đồ thị tại vòng lặp này}
color[m]:=ncol;{tô màu đỉnh m}
mx:=MaxIntermediate(m); {mx là đỉnh có số đỉnh trung gian với
đỉnh m là lớn nhất}
if (mx=0) then mx:=Non_MaxDegree(m);{Không tìm được đỉnh có đỉnh
trung gian với đỉnh m, tìm đỉnh không kề với m có bậc lớn nhất}

while(mx<>0) do
begin
Merge(mx,m);{Nhập mx vào m}
color[mx]:=ncol; {Tô màu cho đỉnh mx, mx có cùng màu với đỉnh m}
mx:=MaxIntermediate(m);
if (mx=0) then mx:=Non_MaxDegree(m);
{Tiếp tục tìm đỉnh mx như trên cho đến khi không còn tìm được nữa}
end;
m:=MaxDegree;{m là đỉnh có bậc lớn nhất trong đồ thị còn lại,
nếu m=0 thì đồ thị đã rỗng và việc tô màu đã hoàn thành}
end;
Cromatic:=ncol;{Đặt sắc số của đồ thị là ncol}
Ouput;
End;
Thuật toán trên không phải là một thuật toán tốt trong mọi trường hợp, nhưng nó cố
gắng để tìm một giải
pháp có thể chấp nhận được để tìm sắc số cho đồ thị.

(Còn nữa)


Ứ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 thi vào các phòng thi (Thuật toán 2):


Sắp xếp các nhóm thi tăng dần theo 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 theo thứ 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=phi.

Bước 2: Nếu |ei| =< |Rj| thì thêm ei vào Rj.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×