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

17 0 0
Tài liệu đã được kiểm tra trùng lặp
bài tập lớn cuối kỳ toán học rời rạc

Đ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

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ỆPKHOA 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 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?

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 = 20234 ,

thỏa màn điều kiện x1 ≤ 3; x ≥2; x >423

BÀI LÀM

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 11223344

Phương trình (1) trở thành :x1’+ x ’ + x ’ + x ’ = 13 (2) 234

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) = CVậy q = C13

Lý luận tương tự, ta có : r = K = C99 = C

(4+9-1) 912

→ p = q - r = C13 - C = 560 - 220 = 340912

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

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) = 8g = 20

(C) = 5g = 17(C,B)

= 12g = 20

(C,D = 17g = 25

(C,B,D)=29g = 33

(C,D,B)=44g = 48

(D) = 22g = 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ậttoá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ÀMa)

Trang 8

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 10Thê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ạovớ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

Trang 10

Khởi tạo

[∞,k] [3,k] [2,k] [∞,k] [∞,k] [∞,k] [1,k]* [0,k] k1 [2,h]* [3,k] [2,k] [5,h] [∞,k] [7,h] - - k,h2 - [3,k] [2,k]* [5,h] [∞,k] [7,h] - - k,h,a3 - [3,k] - [2,c]* [∞,k] [3,c] - - k,h,a,c

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ôngnhỏ 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ánhcậ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ụcTRY(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;}

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++){

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

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan