a Viết thứ tự các đỉnh được thăm của đồ thị theo thuật toán BFS.b Tìm đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại của đồ thị bằng thuậttoán Dijkstra.c Tìm cây khung nhỏ nhất của đồ
Trang 1TRƯỜNG ĐẠI HỌC KINH TẾ - KỸ THUẬT CÔNG NGHIỆP
KHOA CÔNG NGHỆ THÔNG TIN
*********************
BÀI TẬP LỚN CUỐI KỲ MÔN: TOÁN HỌC RỜI RẠC
Sinh viên thực hiện:
Nguyễn Đình Hoàng – 20103100804
Giảng viên hướng dẫn:
G.V Lê Thị Thu Hiền
Hà Nội - 2021
Trang 2MỤC LỤC
I TỰ LUẬN 3
Câu 1: 3
Câu 2: 3
Câu 3: 4
Câu 4: 5
Câu 5: 7
II LẬP TRÌNH 12
1 Đề bài : 12
2 Ý tưởng giải thuật: 12
3 Code chương trình: 13
4 Chạy chương trình : 17
III TÀI LIỆU THAM KHẢO : 18
Trang 3NỘI DUNG
I TỰ LUẬN :
Câu 1: Mỗi cá nhân sử dụng mạng máy tính đều có mật khẩu gồm từ 6 đến 8 ký
tự, mỗi ký tự là chữ cái in hoa hoặc chữ số Mật khẩu phải chứa ít nhất một chữ số
Có bao nhiêu mật khẩu khác nhau?
BÀI LÀM
Số mật khẩu gồm 6 kí tự không chứa chữ số là: 266
→ Số mật khẩu gồm 6 kí tự chứa ít nhất 1 chữ số là: 36 - 266 6
Số mật khẩu gồm 7 kí tự không chứa chữ số là: 267
→ Số mật khẩu gồm 7 kí tự chứa ít nhất 1 chữ số là: 36 – 267 7
Số mật khẩu gồm 8 kí tự không chứa chữ số là: 268
→ Số mật khẩu gồm 8 kí tự chứa ít nhất 1 chữ số là: 36 – 268 8
Vậy số mật khẩu khác nhau gồm từ 6 đến 8 kí tự chứa ít nhất 1 chữ số là:
366 - 26 + 36 – 26 + 36 – 266 7 7 8 8
Câu 2: Có 5 đấu thủ thi đấu cờ, mỗi người đấu một trận với mỗi đấu thủ khác
Chứng minh rằng trong suốt thời gian thi đấu, luôn tồn tại hai đấu thủ có số trận đã đấu bằng nhau
BÀI LÀM
Trang 4-Ta có số trận đã đấu của mỗi người có thể là 0,1,2,3,4 Nhưng vì không thể
có cùng lúc một người đã đấu 4 trận và một người chưa đấu trận nào, nên có tối đa 4 loại số trận đã đấu
-Vận dụng nguyên lý Dirichlet ta có ít nhất có 2 người có cùng số trận đã đấu
Câu 3: Tìm số nghiệm nguyên không âm của phương trình: x1 + x + x + x = 20 2 3 4 ,
thỏa màn điều kiện x1 ≤ 3; x ≥2; x >4 2 3
BÀI LÀM
Ta có: x + x + x + x = 20 (1)1 2 3 4
x1 3; x 2; x > 4 (2 3 )
Ta viết điều kiện đã cho thành x 3; x1 2 2; x 5 Xét các điều kiện 3
sau:
x2 2; x3 5 ( )
x1 4; x2 2; x 3 5 ( )
Gọi p, q, r lần lượt là số nghiệm nguyên không âm của phương trình (1) thỏa các điều kiện ( ), ( ), ( ) Ta có:
p = q – r
Đặt : x ’ = x ; x ’ = x - 2; x ’ = x - 5; x ’ = x 1 1 2 2 3 3 4 4
Phương trình (1) trở thành :
x1’+ x ’ + x ’ + x ’ = 13 (2) 2 3 4
Số nghiệm nguyên không âm của (1) thỏa( ) bằng số nghiệm nguyên không âm của (2)
Trang 5→ Số nghiệm là : K = C4 (4+13-1) = C
Vậy q = C13
Lý luận tương tự, ta có : r = K = C9 9 = C
(4+9-1) 912
→ p = q - r = C13 - C = 560 - 220 = 3409
12
Vậy số nghiệm nguyên không âm của phương trình (1) thỏa điều kiện ( ) là 340
Câu 4: Áp dụng thuật toán nhánh cận giải bài toán người du lịch với ma trận chi
phí như sau:
BÀI LÀM
Trang 6→ Hành trình ACBDA có chi phí 34.
→ Cập nhật f = 34
Câu 5: Cho đồ thị được biểu diễn bằng hình dưới đây.
f = +∞
(B)
= 8
g = 20
(C) = 5
g = 17 (C,B)
= 12
g = 20
(C,D = 17
g = 25
(C,B,D)
=29
g = 33
(C,D,B)
=44
g = 48
(D) = 22
g = 34
Trang 7a) Viết thứ tự các đỉnh được thăm của đồ thị theo thuật toán BFS.
b) Tìm đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại của đồ thị bằng thuật toán Dijkstra
c) Tìm cây khung nhỏ nhất của đồ thị trên bằng thuật toán Kruskal
d) Tìm cây khung nhỏ nhất của đồ thị trên bằng thuật toán Prim
BÀI LÀM a)
→ Thứ tự các đỉnh được thăm : a,b,c,d,e,g,h,k
b)
(∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) (∞,-) 0* (∞,-) (3,k) (2,k) (∞,-) (∞,-) (∞,-) (1,k)*
Trang 8-(3,h) (3,k) (2,k)* (6,h) (∞,-) (8,h) -
-Từ k đến h : k→h ; Độ dài : 1 ; S = {k,h}
Từ k đến g : k→c→g ; Độ dài : 5 ; S = { k,c,g}
Từ k đến e : k→c→g→e ; Độ dài : 10 ; S = {k,c,g,e}
Từ k đến d : k→c→d ; Độ dài : 4 ; S = {k,c,d}
Từ k đến c : k→c ; Độ dài : 2 ; S = {k,c}
Từ k đến b : k→b ; Độ dài : 3 ; S = {k,b}
Từ k đến a : k→h→a ; Độ dài : 3 ; S = {k,h,a}
c)
Trang 9Bắt đầu từ đồ thị rỗng T có 8 đỉnh.
Sắp xếp các cạnh của đồ thị theo thứ tự không giảm của trọng số:
{(h,k),(a,h),(c,d),(c,k),(b,k),(c,g),(a,b),(b,c),(d,g),(d,h),(e,g),(d,e),(g,h),(a,g)}
1 2 2 2 3 3 4 4 4 5 5 7 7 10
Thêm vào đồ thị T cạnh: (h,k)
Do số cạnh của T là 1 < 8-1 nên tiếp tục thêm cạnh (a,h),(c,d),(c,k) vào T
Do số cạnh của T là 4 < 7 nên tiếp tục thêm cạnh (b,k),(c,g) vào T
Do số cạnh của T là 6 < 7 nên ta tiếp tục thêm, tuy nhiên nếu thêm cạnh (a,b) thì nó sẽ tạo với 2 cạnh (a,h), (b,k) đã có trong T thành 1 chu trình Vì vậy ta sẽ bỏ qua cạnh (a,b) Tương tự, ta bổ sung thêm cạnh (e,g) và thu được T với tập E gồm 7 cạnh: (h,k),(a,h),T
(c,d),(c,k),(b,k),(c,g),(e,g)
→ Độ dài nhỏ nhất của cây khung: 18
Cây khung nhỏ nhất :
d)
Trang 10Khởi
tạo
[∞,k] [3,k] [2,k] [∞,k] [∞,k] [∞,k] [1,k]* [0,k] k
1 [2,h]* [3,k] [2,k] [5,h] [∞,k] [7,h] - - k,h
2 - [3,k] [2,k]* [5,h] [∞,k] [7,h] - - k,h,a
3 - [3,k] - [2,c]* [∞,k] [3,c] - - k,h,a,c
→ Độ dài cây khung nhỏ nhất là: 1+2+2+2+3+3+5 = 18
Cây khung nhỏ nhất của đồ thị :
Trang 11II LẬP TRÌNH :
1 Đề bài : Lập trình cài đặt thuật toán nhánh cận giải bài toán người du lịch
2 Ý tưởng giải thuật:
Ta đánh giá được một giới hạn (cận) chung cho những giá
trị này (đối với bài toán tìm min là cận dưới, đối với bài toán tìm max là cận trên) Nếu cận tính được không tốt hơn kỷ lục hiện có (đối với bài toán tìm min là không nhỏ hơn, đối với bài toán tìm max là không lớn hơn) thì có nghĩa là hướng phát triển của nhánh tìm kiếm này là vô ích, có thể bỏ qua để xét giá trị khác cho xi Việc không xét những giá trị tiếp theo của xi giúp cho loại bỏ được một loạt các nhánh trên cây tìm kiếm Vì thế kỹ thuật đánh giá này có tên gọi là đánh giá nhánh cận (tìm cận tại mỗi nhánh tìm
kiếm) Để đánh giá được nhánh cận, cần có sự xem xét kỹ tính chất của hàm mục tiêu và điều này không đơn giản Thông thường, cận được đánh giá cố gắng đạt được hai tiêu chí :
- Càng sát với giá trị tối ưu của bài toán càng tốt
- Việc tính cận càng đơn giản càng tốt
Tiêu chí thứ nhất giúp cho việc lùi càng sớm trên cây tìm kiếm, nghĩa là càng cắt được nhiều nhánh trên cây này, tiêu chí thứ hai làm giảm bớt các phép tính trong một vòng lặp đệ quy (mà số lượng lồng nhau của chúng là rất lớn!) Trên thực tế hai tiêu chí này thường xung đột lẫn nhau: để đánh giá cận càng sát, việc tính nó càng phức tạp Việc điều chỉnh hai tiêu chí này cho phù hợp là cả một nghệ thuật,
nó đòi hỏi nhiều kinh nghiệm và kiến thức trong việc đánh giá các bất đẳng thức Bây giờ, giả sử g(x1, x2, ,
xi) là cận dưới tương ứng với bước thứ i của bài toán tìm min Khi đó trong thủ tục TRY(i) của mô hình duyệt toàn bộ, trước khi gọi TRY(i +1), ta cần thử lại bất đẳng thức g(x1, x2, , xi) < min (nghĩa là chỉ tiến sang bước sau nếu cận dưới nhỏ hơn kỷ lục hiện thời):
Trang 12Void Try (i)
{
j: int;
for (j thuộc Si)
if (chấp nhận j)
{
xi = j; (ghi nhận trạng thái mới);
if (i == n) (ghi nhận kỷ kục) else (g(x1, x2, , xi) < min) Try(i+1); (trả về trạng thái cũ); }
}
3 Code chương trình:
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>
using namespace std;
int n;
int c[100][100];
int x[100];
Trang 13int chuaxet[100];
int kq[100];
int MIN=0;
int a=1;
void Input()
{
cout<<"\nNhap so luong thanh pho: ";
cin>>n;
cout<<"Nhap chi phi cho cac cung duong \n"; for(int i=1; i<=n; i++)
for(int j=1;j<=n;j++)
{
if(i!=j)
{
cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];
}
else
c[i][j]=0;
}
x[1]=1;
for(int i=2;i<=n;i++)
chuaxet[i]=1;
}
Trang 14void Output()
{
cout<<"\nMa tran chi phi :\n";
for(int i=1; i<=n; i++)
{
cout<<"{" ;
for(int j=1;j<=n;j++)
{
if(j!=n)
cout<<c[i][j]<<","; else
cout<<c[i][j];
}
cout<<"}"<<endl;
}
}
void Result()
{
cout<<"\nT1=>";
for(int i=2;i<=n;i++)
cout<<"T"<<kq[i]<<"=>";
cout<<"T1";
cout<<"\n Chi phi cua hanh trinh la: "<<MIN; }
void Work()
{
int S=0;
Trang 15for(int i=1;i<=n-1;i++) S=S+c[x[i]][x[i+1]]; S=S+c[x[n]][1];
if(S<MIN||a==1)
{
a=0;
MIN=S;
for(int i=1;i<=n;i++) kq[i]=x[i]; }
}
void Try(int i)
{
for(int j=2;j<=n;j++) {
if(chuaxet[j]) {
x[i]=j; chuaxet[j]=0; if(i==n) Work(); else
Try(i+1); chuaxet[j]=1; }
}
}
Trang 16int main()
{
Input();
Output();
Try(2);
Result();
getch();
}
4 Chạy chương trình :
III TÀI LIỆU THAM KHẢO :
- Tài liệu học tập môn Toán rời rạc, Đại học KTKTCN.
- Giáo trình C++ (Phạm Văn Ất)