Thuật toán mới của Dharwadker

Một phần của tài liệu Một số thuật toán giải bài toán phủ đỉnh (Trang 38 - 65)

Trong năm 1972, Karp giới thiệu một danh sách hai mươi mốt vấn đề NP-đầy đủ, một trong số đó là vấn đề của việc tìm kiếm một phủ đỉnh tối thiểu trong một đồ thị. Cho một đồ thị, người ta phải tìm thấy một tập nhỏ nhất của các đỉnh như vậy mà mỗi cạnh có ít nhất một đỉnh trong bộ này. Một tập hợp các đỉnh như vậy được gọi là một phủ đỉnh tối thiểu của đồ thị và nói chung có thể rất khó để tìm.

Một đồ thị vô hướng G với n đỉnh bao gồm một tập các đỉnh V, với |V | = n, và một tập các cạnh E, như vậy mà mỗi cạnh là một cặp không có thứ tự các đỉnh khác nhau.

- Thủ tục 1: Cho một đồ thị vô hướng G với n đỉnh và bao gồm một tập phủ đỉnh C của đồ thị G, nếu C không có đỉnh liên thuộc, đầu ra C. Ngược lại, cho mỗi đỉnh liên thuộc v của C, tìm số ρ(C-{v}) của đỉnh liên thuộc của phủ đỉnh C-{v}. vmax biểu thị một đỉnh liên thuộc mà ρ (C-{vmax}) là lớn nhất và được phủ đỉnh C-{vmax}. Lặp lại cho đến khi phủ đỉnh không có đỉnh liên thuộc.

- Thủ tục 2: Cho một đồ thị vô hướng G với n đỉnh và bao gồm một tập phủ đỉnh C nhỏ nhất của đồ thị G, nếu không có đỉnh v trong C, cho v có một đỉnh liên thuộc w bên ngoài C, đầu ra C. ngược lại, tìm một đỉnh v trong C, cho v có một đỉnh liên thuộc w bên ngoài C. Xác định Cc, w bằng cách loại bỏ v từ C và thêm w vào C. Lặp lại bước trên và đầu ra là phủ đỉnh kết quả.

Thuật toán: Cho đầu vào là một đồ thị vô hướng G với n đỉnh đánh số 1, 2, ..., n, tìm một phủ đỉnh kích thước tối đa là k, mỗi giai đoạn, nếu phủ đỉnh thu được có kích thước tối đa là k, dừng lại.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ Phần 1:

For i = 1, 2, ..., n

Khởi tạo phủ đỉnh Ci = V-{i}. Thực hiện thủ tục 1 trên Ci. for r = 1, 2, ..., n-k

Lặp đi lặp lại thủ tục 2 r lần.

Kết quả là một phủ đỉnh bé nhất Ci.

Phần 2: Với mỗi phủ đỉnh bé nhất Ci, Cj tìm thấy trong 1 Khởi tạo phủ đỉnh Ci, j = Ci Cj.

Thực hiện thủ tục 1 trên Ci, j. For r = 1, 2, ..., n-k

Thực hiện lặp đi lặp lại thủ tục 2 r lần. Kết quả là một phủ đỉnh bé nhất Ci, j

* Thí dụ: Đầu vào là đồ thị cho dưới với n=12 đỉnh dán nhãn. V= {1,2,3,4,5,6,7,8,9,10,11,12} 10 3 2 11 1 4 5 6 7 9 8 12

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ Hình 2.4. Thí dụ về bài toán phủ đỉnh theo Dharwadker (n=12)

Tìm phủ đỉnh có kích thước k=7

Cho i=1 và i=2 phủ đỉnh C1 và C2 có kích thước = 8 Khởi tạo phủ đỉnh với i=3

C3 = V-{3} = {1,2,4,5,6,7,8,9,10,11,12} Thực hiện theo thủ tục 1 ta có: Phủ đỉnh C3 = {1,2,4,5,6,7,8,9,10,11,12}, kích thước: 11 Đỉnh v của C3 V3 - {v} ρ(C3−{v}) 1 5,6,8,9,12 5 5 1,7,8,11,12 5 6 1,9,11,12 4 7 5,9,11,12 4 8 1,5,9,11 4 9 1,6,7,8,11 5 11 5,6,7,8,9,12 6 12 1,5,6,7,11 5

Max ρ(C3−{v}) = 6 cho v = 11, loại bỏ đỉnh 11 khỏi C3. Phủ đỉnh C3 = {1,2,4,5,6,7,8,9,10,12}, kích thước : 10.

Đỉnh v của C3 V3 - {v} ρ(C3−{v})

5 7,8,12 3

6 9,12 2

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

8 5,9 2

9 6,7,8 3

12 5,6,7 3

Max ρ(C3−{v}) = 3 cho v = 5, loại bỏ đỉnh 5 khỏi C3. Phủ đỉnh C3 = {1,2,4,6,7,8,9,10,12}, kích thước : 9.

Đỉnh v của C3 V3 - {v} ρ(C3−{v})

7 12 1

8 None 0

12 7 1 (adsbygoogle = window.adsbygoogle || []).push({});

Max ρ(C3−{v}) = 1 cho v = 7, loại bỏ đỉnh 7 khỏi C3. Phủ đỉnh C3 = {1,2,4,6,8,9,10,12}, kích thước : 8.

Đỉnh v của C3 V3 - {v} ρ(C3−{v})

12 None 0

Max ρ(C3−{v}) = 0 cho v = 12, loại bỏ đỉnh 12 khỏi C3.

Ta có phủ đỉnh tối thiểu: C3 = {1,2,4,6,8,9,10}, kích thước yêu cầu k=7 và thuật thoán kết thúc.

* Độ phức tạp của thuật toán:

Bây giờ ta sẽ thấy các thuật toán kết thúc trong đa thức thời gian bằng cách xác định một đa thức của n đỉnh là đầu vào của đồ thị, đó là ràng buộc về tổng số bước tính toán được thực hiện bởi các thuật toán. Ta cần xem xét :

+ Kiểm tra xem một cặp biểu diễn đỉnh có được kết nối bởi một cạnh trong G.

+ So sánh một số kết quả đầu ra có là ít hơn một số nguyên.

- Mệnh đề 1: Cho một đồ thị G đơn giản với n đỉnh và một phủ đỉnh C, thủ tục 1: có n5

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

Chứng minh: Kiểm tra xem một đỉnh đặc biệt có thể tách rời ít nhất n2 bước, từ đỉnh có ít hơn n lân cận và cho mỗi lân cận phải mất ít hơn n bước để kiểm tra xem nó là đỉnh trong phủ đỉnh không. Đối với một phủ đỉnh cụ thể việc tìm kiếm số đỉnh di chuyển mất ít nhất n3

= n*n2 bước, vì hầu hết các đỉnh n trong phủ đỉnh ta phải kiểm tra xem nó có thể tách rời hay không. Đối với một phủ đỉnh cụ thể, việc tìm kiếm một đỉnh mà là tối đa mất ít nhất n4

= n*n3 bước từ phủ đỉnh có ít nhất n đỉnh. Thủ tục 1 kết thúc khi ở hầu hết các đỉnh n được loại bỏ, phải mất tổng cộng tối đa n5

= n*n4 bước.

- Mệnh đề 2 : Cho 1 đồ thị đơn giản G với n đỉnh và một số đỉnh tối thiểu của C, thủ tục 2 mất ít nhất n5

+ n2 +1 bước,

Chứng minh: Để tìm một đỉnh v trong C có lân cận w với C mất ít nhất n2 bước, khi có ít hơn n đỉnh C ta phải tìm ra xem ít nhất một trong những lân cận có nhỏ hơn n của bất kỳ đỉnh ngoài C. Nếu một đỉnh v được tìm thấy phải mất 1 bước để trao đổi v và w. Sau đó thực hiện mệnh đề 1 phải mất ít nhất n5 bước để thực hiện thủ tục 1 trên trang bìa của đỉnh kết quả. Như vậy, thủ tục 2 mất ít nhất n2

+ 1 + n5 bước.

- Mệnh đề 3: Cho 1 đồ thị G đơn giản với n đỉnh, phần 1 của thuật toán mất ít nhất n7

+ n6 + n4 + n2 bước.

Chứng minh: Tại mỗi bước, thủ tục 1 có ở hầu hết n5

bước bởi mệnh đề 1. Sau đó thủ tục 2 được thực hiện ở hầu hết các lần n vì không thể có nhiều nhất n. Với mệnh đề 2 mất ít nhất n(n5

+ n2 + 1)= n6 + n3 + n bước. Vì vậy tại mỗi lượt có nhiều nhất n5

+ n6 + n3 + n bước được thực hiện. Có n biến cho i = 1, 2, ..., n do đó số bước tối đa là n(n5

+ n6 + n3 + n) = n6 + n7 + n4 + n2 bước.

- Mệnh đề 4: Cho 1 đồ thị G đơn giản với n đỉnh, các thuật toán mất ít hơn n8

+ 2n7 + n6 + n5 + n4 + n3 + n2 bước.

Chứng minh: Có ít hơn n2 cặp đỉnh riêng biệt được tìm thấy ở phần 1, được lần lượt tìm thấy. Tương tự như các giả thiết về mệnh đề 3, phần 2 mất

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ ít hơn n2 (n5+ n6 + n3 + n) = n7 + n8 + n5 + n3. Do đó, phần 1 và 2 cùng mất ít hơn tổng số là: (n7 + n6 + n4 + n2)(n8 + n7 + n5 + n3) = n8 + 2n7 + n6 + n5 +n4 + n3 + n2 bước để kết thúc. * Nhận xét (adsbygoogle = window.adsbygoogle || []).push({});

Đây là những phép thử cho những trường hợp tồi tệ nhất có thể. Thực tế số bước thực hiện của thuật toán để kết thúc sẽ phụ thuộc vào cả n và k. Cho giá trị lớn hơn k thuật toán kết thúc nhanh hơn.

* Sự đầy đủ

Các thuật toán có thể được áp dụng cho bất kỳ các đơn đồ thị và sẽ kết thúc trong thời gian đa thức, tìm kiếm nhiều đỉnh tối thiểu. Các mệnh đề dưới đây thiết lập điều kiện đủ trên đồ thị đầu vào trong đó đảm bảo rằng các thuật toán sẽ tìm thấy phủ tối thiểu của một kích thước nhất định. Cụ thể, ta chứng minh rằng tất cả các đồ thị với n đỉnh và bậc của đỉnh lớn nhất là phải có phủ đỉnh tối thiểu kích thước

( 1)

n

n và các thuật toán sẽ luôn tìm thấy

một phủ đỉnh của ít nhất kích thước này.

Ngoài ra ta chứng minh rằng điều kiện tốt nhất có thể trong điều kiện của n và bằng cách xây dựng các đồ thị mà kích thước của một phủ đỉnh tối thiểu là chính xác

( 1)

n

n . Ta sử dụng Định lý Euclid và nguyên tắc

chuồng bồ câu.

Định lý Euclid: Cho 1 số nguyên dương m và một số nguyên n, có tồn tại số nguyên đặc biệt q và r với 0 < r < m mà n = qm + r.

Nguyên tắc chuồng bồ câu: Nếu lthư được phân phối vào p chuồng sau đó một số chuồng nhận ít nhất thư và vài chuồng nhận tại hầu hết các

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

* Mệnh đề 5: Cho một đơn đồ thị G với n đỉnh và khởi tạo một phủ tối thiểu C ban đầu. Tại từng giai đoạn của thủ tục 1, nếu phủ đỉnh C có đỉnh và bậc lớn nhất trong số các đỉnh bên ngoài C là nhỏ hơn sau đó thủ tục 1 sẽ cho một nghiệm là phủ đỉnh tối thiểu nhỏ hơn.

Phân tích: Bằng cách phủ định. Giả sử số đỉnh C sao là tối thiểu, không loại bỏ được đỉnh nào và mỗi đỉnh trong C phải có lân cận ngoài C. Như vậy có ít nhất lcạnh với một giới hạn đỉnh trong C và kết thúc đỉnh khác ngoài C. Theo nguyên tắc cửa chuồng bồ câu p n l số đỉnh bên ngoài C

phải nhận được ít nhất cạnh nhưng mâu thuẫn với giả thiết rằng mức độ tối đa trong số các đỉnh bên ngoài C là ít hơn .

* Mệnh đề 6: Cho 1 đỉnh C sao của G, thủ tục 1 luôn tạo ra một đỉnh tối thiểu của G.

Phân tích: Thủ tục 1 kết thúc chỉ khi không có đỉnh có thể tách. Theo định nghĩa, phủ đỉnh kết quả phải là phủ tối thiểu.

* Mệnh đề 7: Cho 1 đơn đồ thị G với n đỉnh và một phủ đỉnh tối thiểu C. Nếu phủ tối thiểu C có đỉnh m là đỉnh có bậc lớn nhất trong các đỉnh ngoài C và nhỏ hơn 2

'

m

n m sau đó tồn tại một đỉnh v trong C cho v có lân cận w ngoài C và thủ tục 2 tạo ra một phủ đỉnh tối thiểu khác nhau từ C và kích thước nhỏ hơn hoặc bằng kích thước của C.

Chứng minh: Bằng cách phủ định. Chú ý rằng từ lúc C là nhỏ nhất, tức là không thể loại bỏ đỉnh nào và mỗi đỉnh trong C có ít nhất một đỉnh liền kề bên ngoài C. Giả sử tất cả các đỉnh trong C có nhiều hơn một đỉnh liền thuộc bên ngoài C. Khi đó có ít nhất l 2m cạnh với một đỉnh cuối trong C và các đỉnh cuối khác bên ngoài C, chính xác có đúng p n m đỉnh ngoài C. Theo nguyên tắc của chuồng bồ câu, mội vài đỉnh bên ngoài C phải nhận ít nhất

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ cạnh mâu thuẫn với giả thuyết rằng bậc cao nhất trong số các đỉnh ngoài C là nhỏ hơn . Do đó, tồn tại một đỉnh v trong C và mọi đỉnh v có đúng một đỉnh liên thuộc w bên ngoài C. Bây giờ kể từ khi thủ tục 2 thay đổi v và w, một phủ đỉnh khác từ C nhưng có cùng kích thước như C được tạo ra. Lưu ý rằng trong quá trình này một số đỉnh của phủ đỉnh có thể đã bị loại bỏ. Lúc đó, thủ tục 2 sử dụng thủ tục 1 tạo ra một phủ đỉnh tối thiểu khác từ C và có kích thước nhỏ hơn hoặc bằng kích thước của C.

Chƣơng 3 MÔ PHỎNG SỐ

3.1. Lựa chọn phƣơng pháp sử dụng

Để giải bài toán phủ đỉnh, ta có thể sử dụng một số thuật toán như đã nêu ở trên. Trong bài này ta sử dụng cài đặt thử nghiệm bằng thuật toán mới của Dharwadker.

3.2. Xây dựng chƣơng trình * Cài đặt thủ tục 1: (adsbygoogle = window.adsbygoogle || []).push({});

- Input: Cho một đồ thị vô hướng G với n đỉnh và bao gồm một tập phủ đỉnh C của đồ thị G

- Output: Tập phủ đỉnh C nhỏ nhất của đồ thị G

- Cài đặt:

+ Thủ tục chính:

vector<int> procedure_1(vector<vector<int> > neighbors, vector<int> cover) {

vector<int> temp_cover=cover; int r=0; while(r!=-1) { r= max_removable(neighbors,temp_cover); if(r!=-1) temp_cover[r]=0; }

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ return temp_cover;

}

+ Thủ tục giúp loại bỏ đỉnh v trong C:

intmax_removable(vector<vector<int> > neighbors, vector<int> cover) {

int r=-1, max=-1;

for(int i=0; i<cover.size(); i++) {

if(cover[i]==1 && removable(neighbors[i],cover)==true)

{

vector<int> temp_cover=cover; temp_cover[i]=0;

int sum=0;

for(int j=0; j<temp_cover.size(); j++)

if(temp_cover[j]==1 && removable(neighbors[j], temp_cover)==true) sum++; if(sum>max) { if(r==-1) { max=sum; r=i; } elseif(neighbors[r].size()>=neighbors[i].size()) { max=sum; r=i; } } } } return r; }

+ Thủ tục kiểm tra đỉnh đã được loại chưa:

boolremovable(vector<int> neighbor, vector<int> cover) {

bool check=true;

for(int i=0; i<neighbor.size(); i++) if(cover[neighbor[i]]==0)

{

check=false;

break;

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ return check;

}

* Cài đặt thủ tục 2:

- Input: Cho một đồ thị vô hướng G với n đỉnh và bao gồm một tập phủ đỉnh C nhỏ nhất của đồ thị G.

- Output: Tập phủ đỉnh C nhỏ nhất của đồ thị G (adsbygoogle = window.adsbygoogle || []).push({});

- Cài đặt:

vector<int> procedure_2(vector<vector<int> > neighbors, vector<int> cover, int k) {

int count=0;

vector<int> temp_cover=cover; int i=0;

for(int i=0; i<temp_cover.size(); i++) {

if(temp_cover[i]==1) {

int sum=0, index;

for(int j=0; j<neighbors[i].size(); j++)

if(temp_cover[neighbors[i][j]]==0) {index=j; sum++;} if(sum==1 && cover[neighbors[i][index]]==0)

{

temp_cover[neighbors[i][index]]=1; temp_cover[i]=0;

temp_cover=procedure_1(neighbors,temp_cover); count++; } if(count>k) break; } } return temp_cover; }

* Cài đặt thuật toán Dharwadker:

+ Chương trình chính:

void main() {

listBox2->Items->Clear();

//đọc đồ thị

int n, i, j, k, p, q, r, s, min, edge, counter=0;

if(System::String::IsNullOrEmpty(textBox1->Text)) {

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ MessageBox::Show(L"Vui lòng nhập kích thước phủ đỉnh cần tìm", L"Có lỗi xảy

ra", MessageBoxButtons::OK, MessageBoxIcon::Stop);

return; }

elseif(listBox1->Items->Count==0) {

MessageBox::Show(L"Vui lòng nhập đồ thị cần tìm phủ đỉnh", L"Có lỗi xảy ra", MessageBoxButtons::OK, MessageBoxIcon::Stop);

return; } else

n=System::Convert::ToInt32(listBox1->Items[0]->ToString()); vector< vector<int> > graph;

for(i=0; i<n; i++) {

vector<int> row; array<String^>^ str; str=listBox1->Items[i+1]->ToString()->Trim()->Split(' '); for(j=0; j<n; j++) { edge=System::Convert::ToInt32(str[j]); row.push_back(edge); } graph.push_back(row); } //Tìm đỉnh liền kề

vector<vector<int> > neighbors; for(i=0; i<graph.size(); i++) {

vector<int> neighbor; (adsbygoogle = window.adsbygoogle || []).push({});

for(j=0; j<graph[i].size(); j++) if(graph[i][j]==1) neighbor.push_back(j); neighbors.push_back(neighbor); } //Nhập vào số k k=System::Convert::ToInt32(textBox1->Text); //Tìm phủ đỉnh bool found=false; min=n+1;

vector<vector<int> > covers; vector<int> allcover;

for(i=0; i<graph.size(); i++) allcover.push_back(1);

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ // Bắt đầu phần

1.*************************************************************** for(i=0; i<allcover.size(); i++)

{

if(found) break; counter++;

listBox2->Items->Add(counter+"."); vector<int> cover=allcover;

// khởi tạo phủ đỉnh cover[i]=0; //thực hiện thủ tục 1 cover=procedure_1(neighbors,cover); // kích thước phủ đỉnh s=cover_size(cover); if(s<min) min=s;

// kiểm tra xem kích thước phủ đỉnh if(s<=k)

{

listBox2->Items->Add(L"Phủ đỉnh("+s+"):"); String^ item=nullptr;

for(j=0; j<cover.size(); j++) if(cover[j]==1) item+=(j+1)+", "; listBox2->Items->Add(item); covers.push_back(cover); found=true; break; } // thực hiện thủ tục 2, for(j=0; j<n-k; j++) cover=procedure_2(neighbors,cover,j); s=cover_size(cover); // kiểm tra phủ đỉnh. if(s<min) min=s; listBox2->Items->Add(L"Phủ đỉnh("+s+"):"); String^ item=nullptr;

for(j=0; j<cover.size(); j++) if(cover[j]==1) item+=(j+1)+", "; listBox2->Items->Add(item);

covers.push_back(cover); if(s<=k){ found=true; break; } }

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ // Bắt đầu phần 2.************************************************************ //Hợp 2 cặp Ci,Cj: for(p=0; p<covers.size(); p++) { if(found) break; for(q=p+1; q<covers.size(); q++) { if(found) break; counter++; listBox2->Items->Add(counter+"."); vector<int> cover=allcover;

Một phần của tài liệu Một số thuật toán giải bài toán phủ đỉnh (Trang 38 - 65)