1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đề tài nghiên cứu khoa học xây dựng thuật toán liệt kê bằng phương pháp sinh

13 0 0
Tài liệu đã được kiểm tra trùng lặp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây Dựng Thuật Toán Liệt Kê Bằng Phương Pháp Sinh
Tác giả Nguyễn Thị Như Kiều, Nguyễn Hoàng Huy
Người hướng dẫn Nguyễn Đình Lầu
Trường học Trường Đại Học Sư Phạm – Đại Học Đà Nẵng
Chuyên ngành Khoa Tin Học
Thể loại Đề Tài Nghiên Cứu Khoa Học
Năm xuất bản 2023
Thành phố Đà Nẵng
Định dạng
Số trang 13
Dung lượng 751,96 KB

Nội dung

Thuật toán liệt kê bằng phương pháp sinh có thể được sử dụng để giải quyết nhiều bài toán khác nhau, từ các bài toán cơ bản như liệt kê tất cả các hoán vị của một tập hợp đến các bài toá

Trang 1

KHOA TIN HỌC

ĐỀ TÀI NGHIÊN CỨU KHOA HỌC

XÂY DỰNG THUẬT TOÁN LIỆT KÊ BẰNG

PHƯƠNG PHÁP SINH

Nhóm sinh viên : Nguyễn Thị Như Kiều

Nguyễn Hoàng Huy CBHD : Nguyễn Đình Lầu

ĐÀ NẴNG, 02/2023

Nguyễn Thị Như Kiều – Nguyễn Hoàng Huy – 21CNTTC

Trang 2

1 Lý do chọn đề tài 1

2 Mục tiêu đề tài 1

3 Đối tượng và phạm vi nghiên cứu 2

3.1 Đối tượng nghiên cứu 2

3.2 Phạm vi nghiên cứu 2

4 Phương pháp nghiên cứu 2

5 Kết quả dự kiến 2

5.1 Lý thuyết 2

5.2 Thực tiễn 2

6 Bố cục của báo cáo 2

CHƯƠNG 1 GIỚI THIỆU VỀ PHƯƠNG PHÁP SINH 3

2.1 Phân tích bài toán liệt kê dãy nhị phân: 4

2.2 Các bước thực hiện thuật toán liệt kê dãy nhị phân: 4

2.3 Cài đặt thuật toán liệt kê dãy nhị phân: 4

CHƯƠNG 3: BÀI TOÁN LIỆT KÊ HOÁN VỊ 5

3.1 Phân tích bài toán liệt kê hoán vị: 5

3.2 Các bước thực hiện thuật toán liệt kê hoán vị: 6

3.3 Cài đặt thuật toán liệt kê hoán vị: 6

CHƯƠNG 4: BÀI TOÁN LIỆT KÊ TỔ HỢP 7

4.1 Phân tích bài toán liệt kê tổ hợp: 7

4.2 Các bước thực hiện thuật toán liệt kê tổ hợp: 8

4.3 Cài đặt thuật toán liệt kê tổ hợp: 8

CHƯƠNG 5: BÀI TOÁN SINH TẬP CON CỦA TẬP A 9

5.1 Phân tích bài toán liệt kê tập con của tập A: 9

5.2 Các bước thực hiện thuật toán liệt kê tập con của tập A: 9

5.3 Cài đặt thuật toán liệt kê liệt kê tập con K phần tử của tập A: 10

7 Kế hoạch dự kiến triển khai đề tài 10

DANH MỤC TÀI LIỆU THAM KHẢO 10

Trang 3

1 Lý do chọn đề tài

Trong lĩnh vực khoa học máy tính, việc tìm kiếm các giải pháp là một vấn đề quan trọng Thuật toán liệt kê là một trong những phương pháp tiếp cận để giải quyết vấn đề này

Việc xây dựng thuật toán liệt kê bằng phương pháp sinh là một lựa chọn phổ biến và hiệu quả trong nhiều bài toán Phương pháp sinh cho phép tạo ra các giá trị trong tập hợp một cách tuần tự và đơn giản Điều này giúp giảm thiểu thời gian và tài nguyên tính toán cần thiết cho việc liệt kê các giá trị trong tập hợp Ngoài ra, phương pháp sinh cũng cho phép giải quyết các bài toán liệt kê có tính chất đệ quy một cách tối ưu Thuật toán liệt kê bằng phương pháp sinh có thể được sử dụng để giải quyết nhiều bài toán khác nhau, từ các bài toán cơ bản như liệt kê tất cả các hoán vị của một tập hợp đến các bài toán phức tạp hơn như liệt

kê tất cả các đồ thị liên thông của một đồ thị vô hướng Nghiên cứu này còn giúp nâng cao hiệu suất và chất lượng các ứng dụng liên quan đến các bài toán liệt kê trong nhiều lĩnh vực khác nhau

Có một số bài toán trên thực tế yêu cầu chỉ rõ: trong một tập hợp các đối tượng cho trước, có bao nhiêu đối tượng thỏa mãn những điều kiện nhất định và đó là những đối tượng nào Để giải quyết vấn đều của những bài toán này, ta cần xác định được một thuật toán để có thể liệt kê lần lượt tất cả các cấu hình đang quan tâm

Khi giải các bài toán liệt kê, ta sẽ biểu diễn các đối tượng cần tìm dưới dạng một cấu hình các biến số Có nhiều phương pháp liệt kê, nhưng chúng ta cần đáp ứng được hai yêu cầu sau đây:

 Không được lặp lại một cấu hình

 Không được bỏ sót một cấu hình

Thuật toán liệt kê bằng phương pháp sinh là một trong những thuật toán đáp ứng được hai yêu cầu trên Vì vậy, chọn đề tài xây dựng thuật toán liệt kê bằng phương pháp sinh là một điều hợp lý và có ý nghĩa trong lĩnh vực khoa học máy tính và nhiều lĩnh vực khác nhau

2 Mục tiêu đề tài

 Mô tả quá trình thực hiện của tất cả các phương pháp sinh

Trang 4

 Liệt kê tất cả các cấu hình của từng bài toán.

 Xây dựng chương trình cho từng thuật toán với ngôn ngữ lập trình C+ +

3 Đối tượng và phạm vi nghiên cứu

3.1 Đối tượng nghiên cứu

Các thuật toán liệt kê bằng phương pháp sinh như: liệt kê dãy nhị phân có độ dài N, liệt kê hoán vị, liệt kê tổ hợp, liệt kê các tập con của tập A

3.2 Phạm vi nghiên cứu

Tìm hiểu và vận dụng các lý thuyết cơ bản về một số phương pháp sinh như: Liệt kê dãy nhị phân, hoán vị, tổ hợp, tập con của tập A, cài đặt chương trình Demo, cho phép liệt kê các cấu hình của bài toán theo từng thuật toán vừa nêu trên

4 Phương pháp nghiên cứu

 Tổng hợp, phân tích các kết quả nghiên cứu trước đây từ đó rút ra, tìm

ra các vấn đề cần phải giải quyết và đút rút các phương pháp giải quyết vấn đề

 Tìm các phương pháp mở rộng bài toán, cải tiến, xây dựng các thuật toán mới để giải quyết các vấn đề đặt ra

 Từ thực nghiệm đến chứng minh bằng phương pháp toán học để chỉ ra tính vượt trội của cấu trúc mới, thuật toán mới

5 Kết quả dự kiến

5.1 Lý thuyết

 Hiểu rõ quá trình thực hiện của tất cả các phương pháp sinh

 Áp dụng thuật toán vào các bài toán liệt kê các đối tượng với điều kiện cho trước

5.2 Thực tiễn

 Trình bày rõ ràng, cụ thể từng bước thực hiện để đi đến kết quả

 Xây dựng được chương trình cho từng thuật toán để áp dụng cho nhiều trường hợp tương tự của bài toán

6 Bố cục của báo cáo

Báo cáo của bài báo cáo dự kiến tổ chức thành 5 mục chính như sau: Chương 1: Giới thiệu về phương pháp sinh

Chương 2: Bài toán liệt kê tất cả dãy nhị phân có độ dài N

Chương 3: Bài toán liệt kê hoán vị

Trang 5

Chương 4: Bài toán sinh tổ hợp

Chương 5: Bài toán sinh tập con của tập A

CHƯƠNG 1 GIỚI THIỆU VỀ PHƯƠNG PHÁP SINH

Phương pháp sinh là một trong những phương pháp tiếp cận để giải quyết vấn đề liệt kê các giải pháp trong lĩnh vực khoa học máy tính Phương pháp này cho phép tạo ra các giá trị trong tập hợp một cách tuần tự và đơn giản, giúp giảm thiểu thời gian và tài nguyên tính toán cần thiết cho việc liệt kê Việc áp dụng phương pháp sinh để xây dựng thuật toán liệt kê có thể giúp giảm thiểu thời gian

và tài nguyên tính toán cần thiết cho việc liệt kê các giá trị trong tập hợp Phương pháp sinh có thể áp dụng để giải các bài toán liệt kê nếu như hai điều kiện sau thỏa mãn:

 Có thể xác định được một thứ tự trên tập các cấu hình tổ hợp cần liệt kê

Từ đó có thể biết được cấu hình đầu tiên và cấu hình cuối cùng theo thứ tự đó

 Xây dựng được thuật toán từ một cấu hình chưa phải cấu hình cuối, sinh ra được cấu hình kế tiếp nó

Thuật toán sinh tổng quát như sau:

Kí hiệu s là cấu hình hiện hành, s là cấu hình đầu tiên (theo thứ tự từ điển) 0

Bước 1 Khởi tạo, gán s := s 0

Bước 2 Kết xuất s

Bước 3 Kiểm tra tiêu chuẩn kết thúc

Nếu s là cấu hình cuối cùng thì kết thúc, nguợc lại sang buớc 4 Bước 4 Tìm cấu hình t đứng kề sau s theo thứ tự từ điển

Gán s:= t và quay lại bước 2

Phương pháp sinh có thể viết bằng mô hình chung như sau:

<Xây dựng cấu hình đầu tiên>

while True:

<Đưa ra cấu hình đang có>

<Từ cấu hình đang có, sinh ra cấu hình kế tiếp nếu còn>

if <hết cấu hình>:

break

Trang 6

CHƯƠNG 2 BÀI TOÁN LIỆT KÊ CÁC DÃY NHỊ PHÂN CÓ ĐỘ DÀI N 2.1 Phân tích bài toán liệt kê dãy nhị phân:

Bài toán có thể được phát biểu như sau: Cho N là một số nguyên dương, hãy chỉ

ra tất cả các dãy d1d d 2 N với d €{0; 1}, (1 ≤ i ≤ N) i

Ví dụ, với N = 3 ta có các dãy đó là:

1 0 0 0

2 0 0 1

3 0 1 0

4 0 1 1

5 1 0 0

6 1 0 1

7 1 1 0

8 1 1 1

Ta có thể thấy ngay dãy đầu tiên là 0 0 0 0 (dãy toàn số 0) và dãy cuối cùng là

1 1 1 1 (dãy toàn số 1) Từ cấu hình đang có, cấu hình tiếp theo được xây dựng bằng cách cộng thêm 1 (cộng nhị phân) vào cấu hình đó Ví dụ từ cấu hình

0 1 0 thì cấu hình tiếp theo là 0 1 1

2.2 Các bước thực hiện thuật toán liệt kê dãy nhị phân:

Để giải quyết bài toán này, chúng ta bắt đầu bằng cách tạo ra một dãy nhị phân đầu tiên có độ dài N, ví dụ như 0 0 … 0 Sau đó, chúng ta sử dụng một vòng lặp

để duyệt qua tất cả các dãy nhị phân có độ dài N Trong mỗi vòng lặp, chúng ta thực hiện các bước sau:

1 Tìm i đầu tiên (theo thứ tự i từ N đến 1) thoã mãn d = 0;i

2 Gán lại d = 1 và d = 0 với tất cả j > i Dãy mới thu được là dãy nhị i j phân kế tiếp

Quá trình lặp lại các bước này sẽ tạo ra tất cả các dãy nhị phân có độ dài N

2.3 Cài đặt thuật toán liệt kê dãy nhị phân:

Thuật toán liệt kê dãy nhị phân bằng phương pháp sinh được viết như sau: int i,n,m,s[10001];

cin>>n;

for (i=1; i<=n; i++) s[i]=0;

while (m!=0)

{

Trang 7

for (i=1; i<=n; i++) cout<<s[i]<<" ";

cout<<"\n";

for (i=n; i>=0; i )

{

if (s[i]==0)

{

m=i;

break;

}

}

s[m]=1;

for (i=m+1; i<=n; i++) s[i]=0;

}

CHƯƠNG 3: BÀI TOÁN LIỆT KÊ HOÁN VỊ

3.1 Phân tích bài toán liệt kê hoán vị:

Bài toán có thể phát biểu như sau: Cho X = {1, 2, 3, , n} Hãy liệt kê các hoán

vị từ n phần tử của X Ví dụ với n = 3 thì các hoán vị của nó là:

1 (1, 2, 3)

2 (1, 3, 2)

3 (2, 1, 3)

4 (2, 3, 1)

5 (3, 1, 2)

6 (3, 2, 1) Phân tích bài toán:

Ta thấy ngay theo thứ tự trên thì cầu hình đầu tiên là: (1, 2, 3, n) và cấu hình cuối cùng là (n, n-1, , 2, 1) Từ cấu hình đang có, xét phần tử thứ i và i-1 từ phải sang trái của cấu hình, nếu phần tử thứ i lớn hơn phần tử thứ i-1 thì hoán vị hai phần tử đó, nếu phần tử thứ i-1 lớn hơn phần tử thứ i,xét 2 phần tử liền trước

là i-1 và i-2, song hoán vị đọan phần tử thứ i-1 đến n Ví dụ, từ cấu hình (1, 2, 3) thì cấu hình tiếp theo là (1,3,2), từ cấu hình (2,3,1) thì cấu hình tiếp theo là (3,1,2)

3.2 Các bước thực hiện thuật toán liệt kê hoán vị:

Bài toán này được giải quyết như sau: Đầu tiên, chúng ta cần tạo ra một hoán vị

có độ dài N (1,2,3,…,N) Cần xây dựng thuật toán để từ cấu hình đang có là (a , 1

Trang 8

a ,…,a2 n) ta tìm được cấu hình tiếp theo Từ cấu hình đang có (a 1, a2,…,an ) ta xây dựng cấu hình tiếp theo bằng qui tắc:

1 Tìm j đầu tiên thoả mãn aj<aj+1 (j giảm từ n-1, , 1);

2 Tìm a là số nhỏ nhất và ak k>aj trong các số aj+1, aj+2, , an;

3 Đỗi chỗ a với a ; j k

4 Đảo ngược đoạn từ a đến a j+1 n

Lặp lại các bước trên, ta sẽ tạo ra tất cả dãy hoán vị có độ dài N

3.3 Cài đặt thuật toán liệt kê hoán vị:

Chương trình của bài toán liệt kê hoán vị bằng phương pháp sinh được viết như sau:

int s[1000],n,k,dem=0,m,i,j;

cin>>n;

for(int i=1; i<=n; i++) s[i]=i;

m=n;

while(m!=0)

{

for(i=1; i<=n; i++) cout<<s[i]<<" ";

cout<<"\n";

m=0;

for(i=n; i>1; i )

{

if(s[i-1]<s[i])

{ m=i-1;

break;

}

}

for(i=n; i>=1; i )

{

if(s[m]<s[i])

{ k=i;

break;

Trang 9

}

}

swap(s[m],s[k]);

j=n;

for(i=1+m; i<=j; i++)

{

swap(s[i],s[j]);

j ;

}

}

CHƯƠNG 4: BÀI TOÁN LIỆT KÊ TỔ HỢP

4.1 Phân tích bài toán liệt kê tổ hợp:

Bài toán có thể phát biểu như sau: Một tổ hợp chập K của N là một tập con K phần tử của tập N phần tử {1,2,3,…,N} Ví dụ N=5, K=3 ta có các tổ hợp chập 2 như sau:

1 ( 1, 2, 3 )

2 ( 1, 2, 4 )

3 ( 1, 2, 5 )

4 ( 1, 3, 4 )

5 ( 1, 3, 5 )

6 ( 1, 4, 5 )

7 ( 2, 3, 4 )

8 ( 2, 3, 5 )

9 ( 2, 4, 5 ) 10.( 3, 4, 5 ) Phân tích bài toán: Ta thấy ngay theo thứ tự trên thì cầu hình đầu tiên là: (1, 2,

…, K) và cấu hình cuối cùng là (N-K+1, N-K+2,…, N) Từ cấu hình đang có, ta xét phần tử thứ i lớn nhất trong cấu hình có giá trị không vượt qua N-K+i Tăng giá trị của phần tử đó lên 1 đơn vị và đặt các giá trị sau phần tử thứ i là các giá trị liên tiếp tiếp theo của nó Ví dụ từ cấu hình ( 1, 2, 4 ) thì cấu hình tiếp theo là ( 1, 2, 5), từ cấu hình ( 1, 4, 5 ) thì cấu hình tiếp theo là ( 2, 3, 4 )

4.2 Các bước thực hiện thuật toán liệt kê tổ hợp:

Bài toán này được giải quyết như sau: Đầu tiên ta xây dựng cấu hình tổ hợp đầu tiên có độ dài K (1, 2, 3,…, K) Sau đó, ta lặp lại quá trình sau cho đến khi không thể tạo ra thêm bất kỳ tổ hợp chập k nào khác:

1 Tìm chỉ số lớn nhất i sao cho a < N-k+ii

Trang 10

2 Tăng giá trị a lên 1i

3 Đặt các giá trị phía sau a bằng các giá trị tiếp theo của ai i

Sau mỗi lần thực hiện các bước trên, ta sẽ tạo ra một tổ hợp chập k mới

4.3 Cài đặt thuật toán liệt kê tổ hợp:

Chương trình của bài toán liệt kê tổ hợp bằng phương pháp sinh được viết như sau:

int i,n,k,s[100],m,t;

cin>>n>>k;

for (i=1; i<=k; i++) s[i]=i;

m=n;

while (m!=0)

{ for (i=1; i<=k; i++) cout<<s[i]<<" ";

cout<<"\n";

m=0;

for (i=k; i>=1; i )

{ if (s[i]<n-k+i)

{ m=i;

break;

}

}

s[m]=s[m]+1;

for (i=m+1; i<=k; i++) s[i]=s[i-1]+1;

}

CHƯƠNG 5: BÀI TOÁN SINH TẬP CON CỦA TẬP A

5.1 Phân tích bài toán liệt kê tập con của tập A:

Bài toán có thể phát biểu như sau: Liệt kê các tập con của tập A = {1, 2, …, N} Các tập phải chứa các số khác nhau, không tính vị trí Ví dụ, nếu ta có tập hợp A

= {1, 2, 3} ta có các tập con như sau:

1 { }

2 { 1 }

3 { 2 }

4 { 1, 2 }

5 { 3 }

6 { 1, 3 }

Trang 11

7 { 2, 3 } 8 { 1, 2, 3 }

Phân tích bài toán: Ta thấy tập con đầu tiên là tập rỗng và tập con cuối cùng là tập {1, 2, …, N}, các tập con được tạo ra bằng cách sử dụng các số nhị phân từ

0 đến 2^N – 1 Với cấu hình hiện tại, nếu phần tử thứ i của tập A xuất hiện ở tập con, thì bit thứ i của số đó là 1, và ngược lại nếu phần tử thứ i của tập A không xuất hiện ở tập con, bit thứ i của số đó là 0 Cấu hình tiếp theo sẽ được tạo ra bằng cách cộng 1 theo phương pháp cộng nhị phân vào cấu hình hiện tại Ví dụ

từ cấu hình { 1, 2 } tương ứng với số nhị phân 011 thì cấu hình tiếp theo sẽ là {3} tương ứng với số nhị phân 100

5.2 Các bước thực hiện thuật toán liệt kê tập con của tập A:

Bài toán này được giải quyết như sau: Đầu tiên ta tạo tập con đầu tiên là tập rỗng tương ứng với số nhị phân 00 0 Sau đó, ta sẽ sinh tiếp các tập con khác bằng cách thực hiện các bước sau:

1 Chuyển tập hợp sang dạng số nhị phân Nếu bit thứ i của tập A xuất hiện trong tập con thì bit thứ i của số đó là 1 và ngược lại, bit thứ i của tập A không xuất hiện trong tập con thì bit thứ i của số đó là 0

2 Cộng 1 vào số nhị phân đó theo phương pháp cộng nhị phân

3 Chuyển số nhị phân đó sang dạng tập hợp Nếu bit thứ i bằng 1 thì thêm phần tử thứ i của tập A vào tập con

Thực hiện các bước trên cho đến khi tạo ra tất cả tập con của tập A

5.3 Cài đặt thuật toán liệt kê liệt kê tập con K phần tử của tập A:

Chương trình của bài toán liệt kê tập con K phần tử của tập A bằng phương pháp sinh được viết như sau:

int n, A[100];

cin>>n;

for (int i = 0; i < n; i++) A[i]=i+1;

int count = pow(2, n);

for (int i = 0; i < count; i++)

{

for (int j = 0; j < n; j++)

{

Trang 12

if ((i & (1 << j)) != 0)

cout << A[j] << " ";

}

cout << endl;

}

7 Kế hoạch dự kiến triển khai đề tài STT Thời gian Nội dung thực hiện Kết quả dự kiến 1 30-01-2023 đến 10-02-2023 Lý do, mục tiêu chọn đề tài, đối tượng, phương pháp nghiên cứu Phần mở đầu của bài báo cáo, kết quả dự kiến 2 11-02-2023 đến 06-03-2023 Bố cục bài báo cáo Tóm tắt đầy đủ 5 chương của bài báo cáo 3 07-03-2023 đến 10-03-2023 Hoàn thiện bài báo cáo Bài báo cáo hoàn chỉnh DANH MỤC TÀI LIỆU THAM KHẢO Hoàng, L M (2015) Retrieved from V1Study: https://www.v1study.com/giai-thuat-va-lap-trinh-phuong-phap-sinh-generation.html lylyngoc (2013) Retrieved from Tìm Tài Liệu: https://timtailieu.vn/tai-lieu/chuong-i-ky-thuat-thiet-ke-thuat-toan-42188/ Ý KIẾN CỦA CÁN BỘ HƯỚNG DẪN

Đà Nẵng, ngày tháng 01 năm 2023

Cán bộ hướng dẫn

Ngày đăng: 07/01/2025, 16:03

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN