Tải bản đầy đủ (.doc) (11 trang)

cai toan to mau do thi

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 (142.34 KB, 11 trang )

các ứng dụng thực tế của bài toán
tô màu đồ thị:
I. Nhắc lại thuật toán của bài toán tô màu đồ
thị
Thuât toán tô mu đồ thị
- Đếm số bậc của mỗi đỉnh trong đồ thị
- Tô mu cho đỉnh có bậc cao nhất, gán số bậc của đỉnh
đó bằng 0
- Giảm bậc của các đinh còn lại 1 đơn vị,không tô mu các
đỉnh còn lại bằng mu đà tô cho dỉnh có bậc cao nhất
- Lặp lại 3 bớc trên cho đến khi bậc của các đỉnh đều bằng
0
- Định mu cho đỉnh no cha đợc tô

II. Các ứng dụng của bài toán tô màu đồ thị

1. Bi toỏn tụ màu đồ thị tổng quát :
Cho một đồ thị vô hướng N đỉnh ( N ≤ 200 ), mỗi đỉnh được nối với 1
số đỉnh khác bằng 1 cung nối trực tiếp duy nhất ( khơng có 2 đỉnh nào có
nhiều hơn 1 đường nối trực tiếp ). Bài tốn đặt ra là: Hãy tô màu các đỉnh
sao cho không có hai đỉnh nào có 2 màu giống nhau mà lại nối trực tiếp với
nhau với số màu cần tô là ít nhất.
*Giải thuật cho bài tốn tơ màu đồ thị:
Một đồ thị là một tập hợp các điểm gọi là đỉnh và các đường nối các
đỉnh gọi là cạnh. Tô màu một đồ thị nghĩa là gán một màu cho mỗi đỉnh của
đồ thị sao cho hai đỉnh thuộc cùng một cạnh phải được gán màu khác nhau.
Bài toán tô màu đồ thị đã được nghiên cứu từ nhiều thập kỉ trước nhưng để
tô màu một đồ thị với số màu ít nhất là một bài tốn NP-complete mà những
giải pháp được biết đến đều thuộc dạng “thử hết mọi khả năng”, nghĩa là cố
thử gán các màu cho các đỉnh cho đến khi việc tơ màu hồn tất. Vì vậy ta
thấy rằng để đạt được giải pháp tối ưu cho bài tốn này thì phải chấp nhận


một giải thuật ở cấp mũ.
Tuy nhiên đối với một số ứng dụng mà ta chỉ cần có một giải pháp tốt
chấp nhận được chứ không cần giải pháp tối ưu, nghĩa là chúng ta hài lòng
với giải pháp mà số màu gần bằng số màu ít nhất nhưng thời gian chạy

1


nhanh hơn. Một trong những giải pháp như vậy cho bài tốn tơ màu đồ thị là
“giải thuật tham lam”.

2. C¸c øng dơng
Bài tốn tơ màu có nhiều ứng dụng trong thực tế. Chẳng hạn:
a. Ứng dụng bài tốn tơ màu đồ thị vào việc xếp lịch thi cho sinh viên
Bài toán lập lịch thi: Hãy lập lịch thi cho các sinh viên trong một
trường đại học sao cho không có sinh viên nào phải thi 2 mơn trong cùng
một lúc.
b. Ứng dụng bài tốn tơ màu đồ thị vào việc phân lng giao th«ng:
Bài tốn phân luồng giao thơng: Cho một ngã năm
B
như hình dưới, trong đó C và E là các đường một
A
chiều theo chiều mũi tên, các đường khác là hai
chiều. Hãy thiết kế một bảng đèn hiệu điều khiển
giao thông tại ngã năm này một cách hợp lý, nghĩa
C
là: phân chia các lối đi tại ngã năm này thành các
E
nhóm, mỗi nhóm gồm các lối đi có thể cùng đi đồng
D

thời nhưng khơng xảy ra tai nạn giao thông ( các
hướng đi không cắt nhau ), và số lượng nhóm là ít nhất có thể được.
c. Ứng dụng bài tốn tơ màu đồ thị vào việc phân chia tần số:
Bài toán phân chia tần số: Hãy phân chia kênh truyền hình cho các
đài truyền hình sao cho khơng có hai đài nào cách nhau khơng q 150 dặm
lại phát cùng một kênh.

III. Cách giải quyết
Đối với bài tốn xếp lịch thi: Có thể giải quyết bài tốn lập lịch thi
bằng mơ hình đồ thị, với các đỉnh là các mơn thị, có một cạnh giữa 2 đỉnh
nếu tồn tại một sinh viên phải thi cả 2 môn được biểu diễn bằng 2 đỉnh
này(không nối hai đỉnh này nếu một sinh viên không phải thi 2 môn này
2


cùng một lúc). Thời điểm thi của mỗi môn được biễu thị bằng các màu khác
nhau. Như vậy việc lập lịch thi sẽ tương ứng với việc tô màu đồ th ny.
Đối với bài toán phân luồng giao thông:
Ta cú thể xem đầu vào ( input ) của bài toán là tất cả các lối đi tại ngã
năm này, đầu ra ( output ) của bài tốn là các nhóm lối đi có thể đi đồng thời
mà khơng xảy ra tai nạn giao thơng, mỗi nhóm sẽ tương ứng với một pha
điều khiển của đèn hiệu, vì vậy ta phải tìm kiếm lời giải với số nhóm là ít
nhất để giao thơng khơng bị tắc nghẽn vì phải chờ đợi quá lâu.
Trước hết ta nhận thấy rằng tại ngã năm này có 13 lối đi: AB, AC, AD,
BA, BC, BD, DA, DB, DC, EA, EB, EC, ED. Tất nhiên, để có thể giải được
bài tốn ta phải tìm một cách nào đó để thể hiện mối liên quan giữa các lối đi
này. Lối nào với lối nào không thể đi đồng thời, lối nào và lối nào có thể đi
đồng thời. Ví dụ cặp AB và EC có thể đi đồng thời, nhưng AD và EB thì
khơng, vì các hướng giao thông cắt nhau. Ở đây ta sẽ dùng một sơ đồ trực
quan như sau: tên của 13 lối đi được viết lên mặt phẳng, hai lối đi nào nếu đi

đồng thời sẽ xảy ra đụng nhau (tức là hai hướng đi cắt qua nhau) ta nối lại
bằng một đoạn thẳng, hoặc cong, hoặc ngoằn ngoèo tuỳ thích. Như vậy, hai
lối đi có cạnh nối lại với nhau là hai lối đi không thể cho đi đồng thời. Với
cách biểu diễn như vậy ta đã có một đồ thị (Graph), tức là ta đã mơ hình hố
bài tốn giao thơng ở trên theo mơ hình tốn là đồ thị, trong đó mỗi lối đi trở
thành một đỉnh của đồ thị, hai lối đi không thể cùng đi đồng thời được nối
nhau bằng một đoạn ta gọi là cạnh của đồ thị. Bây giờ ta phải xác định các
nhóm, với số nhóm ít nhất, mỗi nhóm gồm các lối đi có thể đi đồng thời, nó
ứng với một pha của đèn hiệu điều khiển giao thông. Giả sử rằng, ta dùng
màu để tô lên các đỉnh của đồ thị này sao cho:
- Các lối đi cho phép cùng đi đồng thời sẽ có cùng một màu: Dễ dàng
nhận thấy rằng hai đỉnh có cạnh nối nhau sẽ khơng được tơ cùng màu.
- Số nhóm là ít nhất: ta phải tính tốn sao cho số màu được dùng là ít
nhất.
- Hai đỉnh có cạnh nối với nhau (hai cịn gọi là hai đỉnh kề nhau) không
cùng màu.
- Số màu được dùng là ít nhất.

3


Đối với bài tốn phân chia tần số: Có thể phân chia kênh truyền hình
bằng mơ hình tơ màu đồ thị. Ta xây dựng đồ thị bằng cách coi mỗi đài phát
là một đỉnh. Hai đỉnh được nối với nhau bằng một cạnh nếu chúng ở cách
nhau không quá 150 dặm(hai đỉnh cách nhau lớn hơn 150 dặm thì khơng nối
với nhau). Việc phân chia kênh tương ứng với việc tơ màu đồ thị, trong đó
mỗi màu biểu thị một thời điểm phát sóng của kênh.

IV. Ví dụ minh họa
(ta chi xét bài toán lập lịch thi và bài toán phân chia tần số)

Bi toỏn xp lch thi:
Chng hn, cú 7 môn cần xếp lịch thi được đánh số lần lượt từ 1 đến 7
và các cặp mơn sau có chung sinh viên dự thi:
+ 1 và 2, 1 và 3, 1 và 4, 1 và 7.

+ 4 và 5, 4 và 6.

+ 2 và 3, 2 và 4, 2 và 5, 2 và 7.

+5 và 6, 5 và 7.

+ 3 và 4, 3 và 6, 3 và 7.

+ 6 và 7.

Giải: Xây dựng đồ thị G = (V, E) mơ tả bài tốn:
- Mỗi đỉnh vi V (i 1,7) đại diện cho môn thi thứ i.
- Mỗi cạnh e  E nối 2 đỉnh vi và vj nếu có sinh viên phải thi cả hai
môn được biểu diễn bằng 2 đỉnh này.
Ta có đồ thị G =(V, E) như sau:
1
2

7
6
5
G

4


- Để lập lịch thi ta sẽ tiến hành tô màu cho
G theo thuật tốn Welch-Powell như sau:
§Ønh:
2
3
4
7
1
5
6
BËc: 5
5
5
5
4
4
4
3 Màu: M1 M3 M4 M4 M2 M2 M1
- Ta thấy G có chứa đồ thị con K4 nên dùng
4 màu để tơ cho G là ít nhất. Vậy

Ø Tóm lại, ta có lịch thi như sau:
4


Buổi thi

Mơn thi

I


2, 6

II

1,5

III

3

IV

4,7

Bài tốn phân chia tần số:
Chẳng hạn, có 10 đài truyền hình được đánh số lần lượt từ 1 đến 10 và
các cặp đài truyền hình sau cách nhau không quá 150 dặm mà phát cùng một
kênh:
+ 1 và 2, 1 và 4, 1 và 5, 1 và 6.
+ 6 và 7, 6 và 9.
+ 2 và 3.
+ 7 và 8.
+ 3 và 5.
+ 8 và 9, 8 và 10.
+ 4 và 5, 4 và 7, 4 và 8.
+ 9 và 10.
+ 5 và 6, 5 và 7, 5 và 9.
Giải:
Xây dựng đồ thị G = (V, E) mơ tả bài tốn:

- Mỗi đỉnh vi V (i 1,7) đại diện cho kênh thứ i.
- Mỗi cạnh e  E nối 2 đỉnh vi và vj nếu có 2 đài phải cách nhau
không quá 150 dặm được biểu diễn bằng 2 đỉnh này.
Ta có đồ thị G =(V, E) như sau:

- Để phân chia kênh cho các đài ta sẽ tiến hành tơ màu cho G theo thuật
tốn Welch-Powell như sau:
5


§Ønh: 5 1
BËc: 6
4
Màu: M1 M2

4
4
M3

6
4
M3

7
4
M2

8
4
M1


9
4
M2

2
2
M1

3
2
M2

10
2
M3

- Ta thấy G có chứa đồ thị con K4 nên dùng 4 màu để tơ cho G
là ít nhất. Vậy X(G)=3.
Ø Tóm lại, ta có lịch phát sóng của các kênh cho các đài như sau:
Thời điểm phát

Đài truyền hình

I

2, 5, 8

II


1, 3, 7, 9

III

4, 6, 10

IV. Cài đặt thuật toán
Tư tưởng của thuật toán(dựa trên tư tưởng của thuật toán tham lam):
- Trước hết ta định nghĩa bậc của một đỉnh là số đỉnh trên đồ thị chưa
được tô mầu mà đỉnh này được nối trực tiếp với đỉnh đang xét bằng một
cạnh nối trực tiếp. Nếu đỉnh đó khơng được nối với bất kỳ đỉnh nào thì bậc
của đỉnh đó là 0.
- Bước 1: Tìm đỉnh có bậc cao nhất trên đồ thị (gọi là đỉnh u )
- Bước 2: Tăng số màu cần tô lên 1 và tô màu cho đỉnh vừa tìm
- Bước 3: Tìm đỉnh v để tơ màu giống u thỏa mãn các điều kiện sau: v đi
đến đỉnh u thông qua duy nhất 1 đỉnh w khác và v có số bậc lớn nhất.
Nếu khơng tìm được đỉnh như vậy ta sẽ tìm đỉnh v có số bậc lớn nhất mà
khơng kề với u. Nếu tìm được v thỏa mãn thì ta tơ màu cho v chính là
màu của đỉnh u. Sau đó nhập đỉnh u và v vào làm 1 đỉnh. Tức: đỉnh w kể
với v thì cũng coi như kề với u (a[v,w] =1 → a[u,w] =1 and a[w,u] = 1)
- Bước 4 : Lặp lại bước 3 cho đến khi v = 0.
- Bước 5 : Lặp lại bước 1 cho đến khi tô ht mu cỏc nh ca th.

Chơng trình:
#include<fstream.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
6



typedef mang1[30];
typedef mang2[30][30];
mang1 color; //Mang luu mau cua dinh do thi, color [i] = 0
nghia la dinh i chua duoc to mau
mang2 a; //a[u,v] = 1 tuc hai dinh u va v co canh noi, a[u,v]
= 0 tuc hai dinh khong co canh noi
int somau,n,count,u,v,dem; //count=so dinh da to mau
,Count = N -> ngung chuong trinh
char *filename;
//-----------------TIM DINH CO BAC LON NHAT-------------------int dinh_bac_max(){
int max,dem,i,j;
max=-1; //Vi co the co dinh co bac la 0
for(i=1;i<=n;i++)
if (color[i]==0){ /*Xet cac dinh chua duoc to mau de
tim ra dinh bac lon nhat*/
dem=0;
for(j=1;j<=n;j++)
if ((color[j]==0)&&(a[i][j]==1)) dem++;
if (dem>max){ //cap nhat gia tri lon nhat
max=dem;
u=i;
}
}
return u;
}
//-------------------GAN MAU CHO DINH U---------------------void tomau(int u){
count=count+1;
color[u]=somau;

cout<<"\nDinh "<}
//-------------TIM DINH V CO THE TO CUNG MAU VOI DINH
U---------void tim_dinh_cung_mau(int u, int &v){
int i,j,max,dem;
max=0; //do neu ton tai v thi bac lon nhat cua v phai > 0
7


v=0;
for (i=1;i<=n;i++)
if ((color[i]==0)&&(a[u][i]==0)){/*xet cac dinh ma u
cach 1
hay cac dinh ma u khong ke ma di den u qua duy nhat
1 dinh khac */
dem=0;
for(j=1;j<=n;j++)
if ((color[j]==0)&&(a[i][j]==1)&&(a[u]
[j]==1)) dem++;
if(dem>max){
max=dem;
v=i;
}
}
if (v>0) exit;/*Neu ton tai v chua to mau di den duoc u
thong qua duy nhat 1 dinh khac*/
max=-1; //o day max phai = 0 va co the ton tai v ma bac
chi la 0
for(i=1;i<=n;i++)
if ((color[i]==0)&&(a[u][i]==0)){ /*Xet cac dinh i khong

ke voi u va chua duoc to mau voi so dinh lon nhat*/
dem=0;
for(j=1;j<=n;j++)
if ((color[j]==0)&&(a[i][j]==1)) dem++;
if(dem>max){
max=dem;
v=i;
}
}
}
//-------------NHAP 2 DINH U VA V COI NHU 1 DINH-------------void ghep_dinh(int &u,int &v){
for(int i=1;i<=n;i++)
if (a[v][i]==1){/*dinh i ke voi dinh v thi coi nhu no
ke voi dinh u */
a[u][i]=1;
a[i][u]=1;
8


}
}
//--------------NHAP CANH,MAU,TEN DINH-----------------------void nhap(){
cout<<"Nhap so dinh n="; cin>>n;cout<<"\n";
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cout<<"\ta["<cin>>a[i][j];
while((a[i][j]!=0)&&(a[i][j]!=1)){
cout<<"\tMoi nhap lai, du lieu khong hop le";
cout<<"\n\ta["<

cin>>a[i][j];
}
}
for(i=1;i<=n;i++) color[i]=0;
}
//------------------LAY DU LIEU TU FILE---------------------void docfile(){
ifstream fin(filename); //lop phuc vu cho cac thao tac doc
dl tu file
if (!fin) cout<<"tep chua ton tai ";
fin>>n; //su dung luong dl dua tu file vao
int i=1, j=1;
while (fin>>a[i][j])
if ((j % n) == 0){i++;j=1;}
else
j++;
fin.close();
}

//--------------TO mau de TIM RA SO MAU IT NHAT---------------void to_mau(){
somau=0;count=0;
somau=0;count=0;
9


do{
somau=somau+1;
u=dinh_bac_max();//u la dinh co bac lon nhat
tomau(u);//gan mau cho dinh u
do{
tim_dinh_cung_mau(u,v);//Tim dinh v co the to mau

giong mau cua u
if(v>0){
tomau(v);//gan mau cho hinh v
ghep_dinh(u,v);//nhap 2 dinh u,v coi nhu mot dinh
}
}
while(v!=0);
}
while(count!=n);
cout<<"\nVay so mau can to la "<// ve_hinh();
}
//-------------------------CHUONG TRINH CHINH----------------------void main(){
cout<<"\n\n\t\t************ TO MAU DO
THI****************";
cout<<"\n\t\t*";cout<<"\t\t\t\t\t *";
cout<<"\n\t\t**********NHOM THUC HIEN-NHOM
4**********";
char hoi;
cout<<"\n\nLay tu tep(C/K)?";cin>>hoi;
if (hoi=='k')
{nhap(); to_mau();}
else if (hoi=='c'){
cout<<"Ten tep can doc:";cin>>filename;
docfile();
to_mau();
}
else{
cout<<"\nBan nhap khong hop le!";
exit;

}
getch();}
10


11



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

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