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 2Danh 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 31. 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 52 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 73 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 9Hì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 10Biế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 11Hì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 12if 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 13kotrongso(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 14Hì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 16Hì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 17Theo đị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 18Nế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 20Chú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)