Tải bản đầy đủ (.doc) (5 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 (110.44 KB, 5 trang )

Bài toán xếp lịch
Lê Thanh Hà
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ủamáy tính, người ta đã nghĩ đến việc sử dụng máy tính để trợ giúp người
xếplịch. Ban đầu đó chỉ là những công cụ trợ giúp cho việc phân công những côngviệ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ôngcụ 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ụngtrong 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ọchoặ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úngta 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 thicho 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ộtphòng, mỗi
phòng có thể có nhiều nhóm cùng thi. Và tổng số lượng thí sinh củacá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 đợtthi. 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ônthi 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ố pnhỏ 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ợpriê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âungười ta đã
chứng minh bài toán tô màu đồ thị thuộc lớp NP - đầy đủ. Tuy nhiênnế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ấpnhậ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 thaythế 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ớinhau. Đồ thị G -
{x} là một đồ thị thu được từ đồ thị G bằng cách loại bỏ đỉnhx 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ôngchứ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ớinhau.
Với một đỉnh x bất kỳ, ta xâydựng một tập các bộ 3 như sau:
(x,z
(1,1)
, y
1
)

(x,z
(1,2)
, y
1
)
(x,z
(1,m1)
, y
1
)
(x,z
(i,1)
, y
i
)
(x,z
(i,2)
, y
i
)
(x,z
(i,mi)
, y
i
)
(x,z
(n,mn)
, y
n
)

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
đỉnhy
i
sao cho có: m
i
= max(m
1
, m
2
,...,m
n
) và đặt y
i
= x. Nếu có nhiều đỉnh y đạtmax 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ị Glà dữ liệu vào):
Bước 1: Đặt j = 1, H=G.
Bước 2: Đặt v
j
là đỉnh có bậc cao nhất trong H.
Bước 3: Từ v
j
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 v
j
.
Bước 4: Nhập x vào v
j

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ạibước 2 với : H=H-{v
j
}, 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ậpvào v
i
với (1 ≤ i ≤ j). Khi đó j ;à sắc số của đồ thị G.
Cài đặt:
Dữ liệu:
Mảng hai chiều M chứa matrậ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ảngColor[i] là màu của đỉnh i ra file.
Function Degree(x:byte):byte; Tínhbậc của đỉnh x, bậc của đỉnh x là số đỉnh chưa bị
nhập vào đỉnh khác (hayMerge[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ạnhnối với x (M[i,x]=false) có bậc lớn nhất (Degree(i) * Max).
Chương trình chính:
Procedure main;
var ncol,m,i,mx:byte;
Begin
input;
ncol:=0;{Đặt màu ban đầubằ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ớnnhất}
if(mx=0) then mx:=Non_MaxDegree(m);{Khôngtì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ậpmx 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) thenmx:=Non_MaxDegree(m);
{Tiếp tục tìm đỉnhmx như trên cho đến khi không còn tìm được nữa}
end;
m:=MaxDegree;{m là đỉnhcó 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ộtthuậ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ị.

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

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