1. Trang chủ
  2. » Công Nghệ Thông Tin

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

4 4,6K 88
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 37,5 KB

Nội dung

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

Trang 1

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

Trang 2

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 ị

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 ị

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àọ

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 {Nếuchưa phải là phòng cuối cù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;

Trang 3

{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);

Trang 4

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

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

TỪ KHÓA LIÊN QUAN

w