1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo bài tập lớn môn Đại số tuyến tính Đề tài chu trình euler và chu trình hamilton

21 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 đề Chu Trình Euler Và Chu Trình Hamilton
Người hướng dẫn Giáo viên Hướng Dẫn
Trường học Đại Học Quốc Gia Thành Phố Hồ Chí Minh Trường Đại Học Bách Khoa
Chuyên ngành Đại Số Tuyến Tính
Thể loại Báo Cáo Bài Tập Lớn
Năm xuất bản 2023
Thành phố TPHCM
Định dạng
Số trang 21
Dung lượng 607,96 KB

Nội dung

Sản phẩm: Viết chương trình matlab, python nhập vào ma trận kề kiểm tra sự tồn tại của chu trình Euler, chu trìnhHamilton và tìm một chu trình Euler, Hamilton của đồ thị.. Mởrộng có thể

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA

-BÁO CÁO BÀI TẬP LỚN MÔN : ĐẠI SỐ TUYẾN TÍNH

Đề tài:

Chu trình Euler và chu trình Hamilton

Giáo viên hướng dẫn :

TPHCM, tháng 12 năm 2023

Trang 2

Danh sách thành viên

Nội dung câu hỏi

Câu 1 Hệ thống các định nghĩa (Ma trận kề của đồ thị, đồ thị

liên thông, chu trình )

Câu 2 Điều kiện đồ thị có chu trình Euler, chu trình Hamilton,

thuật toán tìm chu trình Euler, chu trình Hamilton

Câu 3 Thực hành: Áp dụng chu trình Euler, Hamilton vào bài

toán tìm đường đi, bài toán phân phát hàng hóa

Câu 4 Sản phẩm: Viết chương trình (matlab, python ) nhập vào

ma trận kề kiểm tra sự tồn tại của chu trình Euler, chu trìnhHamilton và tìm một chu trình Euler, Hamilton của đồ thị Mởrộng có thể tìm tất cả các chu trình Euler, chu trình Hamilton của

đồ thị không?

MỤC LỤC

Trang 3

1. HỆ THỐNG CÁC ĐỊNH NGHĨA 2

1.1 Đồ thị Đỉnh Cạnh 3

1.2 Ma trận kề 3

1.3 Đồ thị liên thông 3

1.4 Bậc 3

2. CHU TRÌNH EULER, HAMILTON 4 2.1 Chu trình Euler 4

a Định nghĩa 4

b Điều kiện 4

c Thuật toán Fleury tìm chu trình Euler 5

d Ứng dụng chu trình Euler vào bài toán thực tế 7

2.2 Chu trình Hamilton 17

a Định nghĩa 17

b Điều kiện 17

c Thuật toán quay lui (Backtracking) tìm chu trình Hamilton 18

1 HỆ THỐNG CÁC ĐỊNH NGHĨA

1.1 Đồ thị Đỉnh Cạnh

Định nghĩa : 2.7.1/giáo trình ĐSTT trang 76

Trang 4

Đồ thị có hướng, vô hướng

● Đồ thị vô hướng:

Định nghĩa : 2.7.2/giáo trình ĐSTT trang 76

+ Đơn đồ thị vô hướng

+ Đa đồ thị vô hướng

Định nghĩa : 2.7.5/Giáo trình ĐSTT trang 77

+ Ma trận kề đối của đồ thị vô hướng, có hướng

+ Ma trận kề đối của đồ thị vô hướng, có hướng có trọng số

1.3 Đồ thị liên thông

Định nghĩa: Nếu giữa hai điểm bất kỳ của một đồ thị đều có thể thiết lập một

đường đi từ đỉnh này đến đỉnh kia thì đồ thị được coi là đồ thị liên thông; nếu không,

đồ thị được coi là không liên thông

+ Số cạnh tới ngoài đỉnh v gọi là bậc ngoài Kí hiệu dout(v)

+ Số cạnh tới trong đỉnh v gọi là bậc trong Kí hiệu din(v)

Trang 5

2 CHU TRÌNH EULER, HAMILTON

Cho 1 đồ thị vô hướng liên thông G có nhiều hơn 1 đỉnh

+ Định lí Euler 1: Đồ thị G có chu trình Euler nếu và chỉ nếu mọi đỉnh của G đều

Trang 6

+ Định lí Euler 3: Đồ thị H có chu trình Euler nếu và chỉ nếu H cân bằng (tức mọiđỉnh của nó đều có bậc ngoài bằng bậc trong)

Đồ thị H2có chu trình Euler (a, b, c, d, e, a)

● Các đỉnh a, b, c, d, e đều có bậc ngoài=bậc trong=1

Hình 3

+ Định lí Euler 4: Đồ thị H có đường đi Euler nếu và chỉ nếu trong H có 2 đỉnhđược nối với nhau và thoả điều kiện:

▪ Đỉnh thứ nhất: bậc trong=bậc ngoài+1

▪ Đỉnh thứ hai: bậc ngoài=bậc trong+1

Đồ thị H3có đường đi Euler (c, a, b, c, d, b)

● Đỉnh b, c được nối với nhau

+ Input: Đồ thị liên thông G gồm n đỉnh, các đỉnh đều có bậc chẵn

+ Output: Ghi ra chu trình Euler (nếu có)

Trang 7

3 Chọn một cạnh nối đỉnh đó với một đỉnh kề bất kì theo quy tắc:

+ Mỗi khi đi qua một cạnh nào đó thì xóa đó đi

+ Không đi qua cầu trừ khi không còn cách đi nào khác.

Một cạnh của đồ thị G được gọi là cầu nếu khi xóa cạnh đó khỏi đồ thị thì làmtăng số thành phần liên thông của G

4 Bổ sung cạnh vừa chọn và đỉnh cuối vào E, xoá cạnh đó trong G

5 Quay lại bước 2

Viết chương trình tìm chu trình Euler :

● Tạo function

function chutrinhEuler = timchutrinhEuler(matranke,batdau)

% Kiem tra tinh lien thong cua do thi

if ~isequal(matranke, matranke')

error( 'Do thi khong phai la do thi vo huong.' );

end

oddDegrees = sum(mod(sum(matranke), 2));

if oddDegrees ~= 0 && oddDegrees ~= 2

error( 'Do thi khong co chu trinh hoac duong di Euler.' );

% Them dinh vao stack va loai bo canh

stack = [stack currentVertex];

% Khi khong con canh nao noi voi dinh hien tai

chutrinhEuler = [chutrinhEuler currentVertex];

currentVertex = stack(end);

stack = stack(1:end-1);

end

end

% Them dinh cuoi cung

chutrinhEuler = [chutrinhEuler currentVertex];

end

Trang 8

● Nhập ma trận kề và tìm chu trình Euler hoặc đường đi Euler

% Nhap ma tran ke cua do thi vo huong

matranke = input( 'Nhap ma tran ke: ' );

batdau = input( 'Chon dinh xuat phat: ' );

% Tim chu trinh Euler hoac duong di Euler

chutrinhEuler = timchutrinhEuler(matranke,batdau);

% In ra chu trinh Euler hoac duong di Euler

fprintf( 'Chu trinh Euler hoac duong di Euler: ' );

disp(chutrinhEuler);

● Kết quả

d Ứng dụng chu trình Euler vào bài toán thực tế

Đề bài: Tìm đường đi ngắn nhất trong công tác thu gom rác trên tất cả các tuyếnđường của một khu vực như đồ thị dưới Địa điểm xuất phát là “1”

Trang 9

Hình 6 Đồ thị các tuyến đường của một khu vực

● Ý tưởng giải bài toán: Xây dựng ma trận kề có trọng số của khu vực trên

và sử dụng chương trình matlab tìm ma trận kề không trọng số tương ứng.Sau đó, yêu cầu nhập các cạnh cần thêm để biến đổi ma trận không trọng số

đó thành một ma trận mới và nhập đỉnh xuất phát Cuối cùng, kiểm tra matrận mới đó, in ra một chu trình Euler (nếu có) và tính toán đồ dài của

đường đi

Chi tiết các bước triển khai và giải bài toán:

Xây dựng ma trận kề

Trang 10

Biến đổi thành ma trận không trọng số

+ Để có thể tìm được một chu trình Euler thì ta cần thiết phải tìm ra một ma trậnkhông trọng số tương ứng

Nhập thủ công các cạnh sẽ được thêm vào

+ Do đề yêu cầu điểm xuất phát là “1” và phải đi qua tất cả các tuyến đường nên ta

sẽ biến đổi đồ thị sao cho đồ thị chứa một chu trình Euler bằng cách “thêm cạnh” chocác cặp đỉnh có bậc lẻ để tất cả các đỉnh đều có bậc chẳn

+ Tuy nhiên, việc “thêm cạnh” ở đây không phải là ta xây thêm đường mà là lặplại việc di chuyển trên con đường đó Vấn đề được đặt ra là ta cần chọn các đường lặplại đó có tổng độ dài ngắn nhất có thể

+ Ở đây, nhóm chúng em sẽ vẽ thêm cạnh như hình bên dưới

Trang 11

Hình 7 Vẽ thêm cạnh cho đồ thị+ Nhập các cạnh cần thêm vào chương trình MATLAB

Tìm chu trình Euler và tính toán độ dài đường đi bằng MATLAB

● Sơ đồ khối các bước giải bài toán

Trang 12

if oddDegrees ~= 0 && oddDegrees ~= 2

error( 'Do thi khong co chu trinh hoac duong di Euler.' );

% Them dinh vao stack va loai bo canh

stack = [stack dinhhientai];

dinhketiep = find(kotrongso(dinhhientai,:), ~0);

% Loai bo canh giua dinh hien tai va dinh tiep theo

Trang 13

kotrongso(dinhhientai, dinhketiep) = kotrongso(dinhhientai, dinhketiep) - 1;

kotrongso(dinhketiep, dinhhientai) = kotrongso(dinhketiep, dinhhientai) - 1;

% Di chuyen den dinh tiep theo

dinhhientai = dinhketiep;

else

% Khi khong con canh nao noi voi dinh hien tai

chutrinhEuler = [chutrinhEuler dinhhientai];

dinhhientai = stack(end);

stack = stack(1:end-1);

end

end

% Them dinh cuoi cung

chutrinhEuler = [chutrinhEuler dinhhientai];

% In ra chu trinh Euler

disp([ 'Duong di thu ' ,num2str(tt), ' la:' ])

% Tao ma tran ke khong co trong so

trongso = input( 'Nhap ma tran co trong so: ' );

kotrongso2 = kotrongso; % Khoi tao lai ma tran khong trong so

a = input( 'Nhap so canh can them: ' );

for i=1:a

dinh1 = input( 'Nhap dinh thu nhat: ' );

dinh2 = input( 'Nhap dinh thu hai: ' );

kotrongso2(dinh1, dinh2) = kotrongso2(dinh1, dinh2) + 1;

kotrongso2(dinh2, dinh1) = kotrongso2(dinh2, dinh1) + 1;

end

% Tim chu trinh Euler va do dai duong di

batdau = input( 'Da xong! Hay nhap dinh bat dau: ' );

Trang 14

Hình 8 Nhập ma trận kề có trọng số

Hình 9 Nhập các cạnh cần thêm và đỉnh bắt đầu

Hình 10 Hiển thị đường đi cần tìm và độ dài đường đi tương ứng cách thêm cạnh 1

Trang 15

❖ Ngoài ra, chương trình MATLAB trên còn xây dựng để người dùng tiếp tục tìmmột chu trình Euler mới (tương ứng với cách thêm cạnh mới và điểm xuất phátmới) khi nhập “0”.

Hình 11 Cách thêm cạnh khác

Hình 12 Nhập các cạnh thêm của cách mới

Trang 16

Hình 13 Hiển thị đường đi và độ dài đường đi tương ứng cách thêm cạnh 2

o Con đường tìm được có thể không phải tối ưu nhất (ngắn nhất)

o Việc thêm cạnh là thủ công nên việc giải bài toán đối với một khu vực

lớn trở nên rất khó khăn và tốn thời gian

o Đồ thị G1có chu trình Hamilton là: a-b-c-d-e-a

o Đồ thị G2chỉ có đường đi Hamilton là: a-b-c-d

o Đồ thị G3không có chu trình lẫn đường đi Hamilton

b Điều kiện

Trang 17

Theo định lý Dirak, G có chu trình Hamilton.

Ta có A-B-C-E-F-D-A là một chu trình Hamilton củaG

Hình 16

Ta có: A-B-D-C-E-A là một chu trình Hamilton của G

c. Thuật toán quay lui (Backtracking) tìm chu trình Hamilton

Yêu cầu:

+ Input: đồ thị G(V, E), trong đó V là tập hợp các đỉnh và E là tập hợp các cung

+ Ouput: Viết thuật toán quay lui (Backtracking) (nếu có)

Thuật toán:

1 Cho trước đồ thị G(V, E) và bắt đầu từ đỉnh bất kì v

2 Tuần tự thăm các đỉnh liền kề bằng cách lần lượt lựa chọn một cung (u, v) trong E

3 Khi đến đỉnh v, kiểm tra xem v có thể thuộc chu trình Hamilton hay không Nếu có,thì thuật toán hoàn thành

4 Nếu không, thì đổi hướng đến đỉnh u, ghi nhớ các đỉnh đã thăm (xử lý quá trình quaylui)

5 Lặp lại bước 2 tới khi tìm thấy chu trình Hamilton hoặc không thể thăm các đỉnh nữa

Trang 18

Nếu thuật toán kết thúc mà không tìm thấy chu trình Hamilton, thì câu trả lời là khôngtồn tại Nếu tìm thấy chu trình Hamilton, thì câu trả lời là tồn tại.

Viết chương trình tìm chu trình Hamilton

disp( 'Chu trinh Hamilton hoac duong di Hamilton:' );

if hamiltonianCycleUtil(matranke, path, 2, numNodes) == 0

disp( 'Khong tim thay chu trinh Hamilton hoac duong di Hamilton' );

function res = hamiltonianCycleUtil(matranke, path, pos, numNodes)

if pos == numNodes + 1 % Kiem tra xem da di qua tat ca dinh chua

if matranke(path(pos - 1), path(1)) == 1 % Kiem tra xe co tao thanh chu trinh chua

Trang 19

● Nhập ma trận kề và tìm chu trình Hamilton hoặc đường đi Hamilton

% Nhap ma tran ke cua do thi vo huong

matranke = input( 'Nhap ma tran ke: ' );

% Chon dinh xuat phat

batdau = input( 'Chon dinh xuat phat: ' );

timchutrinhHamilton(matranke,batdau);

● Kết quả

LỜI CẢM ƠN

Trang 20

Chúng em, thành viên của nhóm 6, xin gửi lời cảm ơn chân thành đến thầy – thầyĐặng Văn Vinh vì đã dành thời gian xem qua bài báo cáo của nhóm

chúng em Nhờ có sự hướng dẫn tận tình của thầy mà nhóm đã thành công hoànthiện bài tập lớn môn Đại số tuyến tính

Đồng thời qua quá trình làm bài tập lớn, nhóm cũng đã hiểu hơn về cách để làmviệc nhóm sao cho hiệu quả cũng như cách hoàn thành một bài báo cáo chỉn chu,hoàn chỉnh nhất tại trường Đại Học Bách Khoa TP Hồ Chí Minh.Tuy nhiên

trong quá trình làm bài tập lớn có thể có những sai sót và không hoàn hảo Do

đó, chúng em mong thầy có thể thông cảm cho những khuyết điểm của chúng em.Chúng em mong sẽ nhận được những đóng góp từ thầy để cải thiện những thiếusót của mình

Đây sẽ là một trải nghiệm quý báu, giúp chúng em không những phát triển đượckiến thức chuyên môn vững vàng mà còn là một tinh thần trách nhiệm lớn khiđóng góp vào một tập thể

TÀI LIỆU THAM KHẢO :

Hình ảnh:

Trang 21

- Hình 1, 2:

https://viblo.asia/p/do-thi-euler-va-chu-trinh-euler-WAyK8Bj6lxX#_ii-cac-khai-niem-va-dinh-ly-1

- Hình 3,4 : Bởi Hungnhot – Tác phẩm được tạo bởi người tải lên, CC BY-SA 3.0,

https://commons.wikimedia.org/w/index.php?curid=25754777

Cơ sở lý thuyết, thuật toán:

- Định lý Dirak, Ore : “Lý thuyết đồ thị”- Nguyễn Cam, Chu Đức Khánh, Nhà xuấtbản trẻ 1998

- Sách Đại Số Tuyến Tính của tác giả Đặng Văn Vinh (nhà xuất bản ĐHQG TP HồChí Minh)

Ngày đăng: 24/11/2024, 06:57

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

TÀI LIỆU LIÊN QUAN

w