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

bài tập lớn cuối kỳ toán học rời rạc

16 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

Định dạng
Số trang 16
Dung lượng 724,87 KB

Nội dung

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 1

TRƯỜ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 2

MỤ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 3

NỘ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 7

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ậ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 9

Bắ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 10

Khở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 11

II 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 12

Void 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 13

int 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 14

void 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 15

for(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 16

int 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)

Ngày đăng: 22/05/2024, 08:50

w