CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNGCHUYÊN ĐỀ LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO BÁO CÁO ỨNG DỤNG MAPPLE ĐỂ GIẢI BÀI TOÁN TÌM ĐƯỜNG ĐI EULER VÀ ĐƯỜNG ĐI HALMITON TRONG ĐỒ THỊ
Trang 1CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNG
CHUYÊN ĐỀ
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
BÁO CÁO
ỨNG DỤNG MAPPLE ĐỂ GIẢI BÀI TOÁN TÌM ĐƯỜNG ĐI EULER VÀ
ĐƯỜNG ĐI HALMITON TRONG ĐỒ THỊ VÔ HƯỚNG
tháng 01 năm 2013
Trang 2GIỚI THIỆU
Maple là một hệ thống tính toán trên các biểu thức đại số và minh họa hình học mạnh
mẽ của công ty Warterloo Maple Inc (http://www.maplesoft.com), ra đời năm 1991,
đã phát triển đến phiên bản 11 (đến 4/2007) Maple chạy trên tất cả các hệ điều hành,
có trình trợ giúp (Help) rất dễ sử dụng Từ phiên bản 7, Maple cung cấp ngày càng
nhiều các công cụ trực quan, các gói lệnh tự học gắn liền với toán phổ thông và đại học Ưu điểm đó khiến ngày càng có nhiều nước trên thế giới lựa chọn sử dụng Maple trong dạy-học toán tương tác trước đòi hỏi của thực tiễn và sự phát triển của giáo dục
Có thể nêu vắn tắt các chức năng cơ bản của Maple như sau:
• Là một hệ thống tính toán trên các biểu thức đại số;
• Có thể thực hiệc được hầu hết các phép toán cơ bản trong chương trình toán đại học
và sau đại học;
• Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị tĩnh và động của các đường và mặt được cho bởi các hàm tùy ý trong nhiều hệ tọa độ khác nhau;
• Một ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác với các ngôn ngữ lập trình khác;
• Cho phép trích xuất ra các định dạng khác nhau như LaTex, Word, HTML,
• Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học tương tác trực tiếp;
• Một trợ giáo hữu ích cho học sinh và sinh viên trong việc tự học;
Trong phần báo cáo này em có cài đặt “ỨNG DỤNG MAPPLE ĐỂ GIẢI BÀI TOÁN TÌM ĐƯỜNG ĐI EULER VÀ ĐƯỜNG ĐI HALMITON TRONG ĐỒ THỊ VÔ HƯỚNG”, nhằm hiểu rõ hơn về Mapple và sau này có thể ứng dụng Mapple vào trong trong việc triển khai các dự án về giáo dục
Trang 3MỤC LỤC
PHÂN TÍCH YÊU CẦU 4
1 ĐỊNH NGHĨA VỀ CHU TRÌNH VÀ ĐƯỜNG ĐI EULER 4
2 ĐỊNH LÝ EULER VỀ CHU TRÌNH VÀ ĐƯỜNG ĐI EULER 4
3 CÁC TÍNH CHẤT KHÁC 5
4 ĐƯỜNG ĐI HAMILTON 5
CÁC THỦ TỤC TRONG BÀI TOÁN 5
1 Thủ tục khởi tạo ban đầu: 5
2 Thủ tục tìm chu trình Euler 6
3 Thủ tục tìm chu trình đường đi Euler 8
4 Thủ tục tìm tất cả đường đi Hamilton trong đồ thị G 10
DỮ LIỆU THỬ NGHIỆM 13
TÀI LIỆU THAM KHẢO 15
Trang 4PHÂN TÍCH YÊU CẦU
1 Định nghĩa về chu trình và đường đi Euler
1 Đường đi Euler (tiếng Anh: Eulerian path, Eulerian trail hoặc Euler walk)
trong đồ thị vô hướng là đường đi của đồ thị đi qua mỗi cạnh của đồ thị đúng một lần
2 Chu trình Euler (tiếng Anh: Eulerian cycle, Eulerian circuit hoặc Euler tour)
trong đồ thị vô hướng) là một chu trình đi qua mỗi cạnh của đồ thị đúng một lần
3 Đồ thị gọi là đồ thị Euler khi nó chứa chu trình Euler, và được gọi là nửa
Euler khi nó chứa đường đi Euler.
4 Đối với các đồ thị có hướng, các thuật ngữ đường đi và chu trình được thay
bằng đường đi có hướng và chu trình có hướng.
2 Định lý Euler về chu trình và đường đi Euler
1 Đồ thị vô hướng liên thông G=(X, E) có chu trình Euler khi và chỉ khi G không
có đỉnh bậc lẻ
2 Đồ thị vô hướng liên thông G=(X, E) có đường đi Euler khi và chỉ khi G có không quá hai đỉnh bậc lẻ Nếu G có hai đỉnh bậc lẻ thì đường đi Euler có hai đầu đường đi nằm ở hai đỉnh bậc lẻ
Phát biểu lại định lý 1: Một đa đồ thị không có điểm cô lập có chu trình Euler nếu và chỉ nếu đồ thị là liên thông và mỗi đỉnh của nó đều có bậc chẵn
Trang 53 Các tính chất khác
1 Một đồ thị vô hướng là đồ thị Euler nếu nó liên thông và có thể phân tích thành các chu trình có các cạnh rời nhau
4 Đồ thị có hướng là Euler nếu nó liên thông và có thể phân tích thành các chu trình có hướng với các cung rời nhau
4 Đường đi Hamilton
của đồ thị, mỗi đỉnh đúng một lần Một Chu trình Hamilton là một đường đi
Hamilton sau đi qua tất cả các đỉnh của đồ thị thì trở về đỉnh xuất phát
Một đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton, đồ thị có đường đi Hamilton được gọi là đồ thị nửa Hamilton
Bài toán tìm đường đi và chu trình như vậy được gọi là bài toán Hamilton Bài toán Hamilton là NP đầy đủ
Các thủ tục trong bài toán
1 Thủ tục khởi tạo ban đầu:
> Init:=proc()
restart;
interface( warnlevel = 0 );
with(networks);
#with(LinearAlgebra);
end:
Trang 62 Thủ tục tìm chu trình Euler
> Euler:=proc(G::graph)
local H,V,E,vStart,ECycle,C,S,cycleFound,i,j,k;
H:=duplicate(G);
V:=vertices(G);
E:=edges(G);
vStart:=V[1];
ECycle:=[];
while E<>{} do
i:=vStart;
C:=[i];
cycleFound:=false;
while not cycleFound do
#Tim dinh j ke can i, neu j=vStart -> duoc 1 chu trinh
S:=neighbors(i,H);
for j in S do
if j<>vStart then break; fi;
od;
#Them dinh j vao C, roi xoa canh (i,j)
if j=vStart then cycleFound:=true;
else C:=[op(C),j];
Trang 7fi;
#for k in E do
# if {i,j}=ends(k,H) then
k:=edges({i,j},H,all)[1];
E:=E minus {k};
delete(k,H);
# break;
# fi;
#od;
i:=j;
#Neu tim duoc 1 chu trinh C thi them vao ECycle,
if cycleFound then
#Them chu trinh C vao ECycle tai vi tri vStart
if ECycle=[] then ECycle:=C;
else
i:=1;
while ECycle[i]<>vStart do i:=i+1; od;
ECycle:=[op(1 i-1,ECycle), op(C), op(i nops(ECycle), ECycle)];
fi:
#Tim dinh vStart ke tiep neu con chu trinh
if E<>{} then
Trang 8V:={};
for i in E do V:=V union ends(i,H) od;
V:=V intersect convert(ECycle,set);
vStart:=V[1];
fi;
fi;
od;
od;
ECycle:=[op(ECycle),ECycle[1]];
return ECycle;
end:
3 Thủ tục tìm chu trình đường đi Euler
> EulerRouting:=proc(G::graph)
local Result,i,vOdd,H,tmp;
if connectivity(G)=0 then
printf("do thi khong lien thong");
return NULL;
fi;
vOdd:={};
for i in vertices(G) do
if vdegree(i,G) mod 2 = 1 then vOdd:=vOdd union {i} fi;
Trang 9od;
if nops(vOdd)=2 then
H:=duplicate(G);
connect({vOdd[1]},{vOdd[2]},H);
tmp:=Euler(H);
i:=1;
while {tmp[i],tmp[i+1]}<>vOdd do i:=i+1 od;
Result:=[op(i+1 nops(tmp)-1,tmp),op(1 i,tmp)];
printf("Duong di Euler : ");
lprint(Result);
elif nops(vOdd)=0 then
Result:=Euler(G);
printf("Chu trinh Euler tim duoc :");
lprint(Result);
else
printf("Do thi khong co duong di Euler");
fi;
end:
4 Thủ tục tìm tất cả đường đi Hamilton trong đồ thị G
> Hamilton:=proc(Grph::graph)
local R,C,Try,Found,i;
Trang 10C:=[];
#Found:=false;
Try:=proc(G::graph,v)
local H,S,i,j;
Result:=[op(Result),v];
S:=neighbors(v,G);
H:=duplicate(G);
delete({v},H);
if nops(vertices(H))=1 then
#Found:=true;
#Result:=[op(Result),S[1]];
if edges({S[1],Result[1]},Grph)<>{} then
C:=[op(C),[op(Result),S[1],Result[1]]];
else
R:=[op(R),[op(Result),S[1]]];
fi;
#lprint([op(Result),S[1]]);
return;
elif connectivity(H)=0 then
return;
Trang 11else
for i in S do
Try(H,i);
Result:=[op(1 nops(Result)-1,Result)];
od;
fi;
end:
for i in vertices(Grph) do
Found:=false;
Result:=[];
Try(Grph,i);
#if Found then
od;
if C<>[] then
printf("Chu trinh Hamilton : ");
for i in C do lprint(i) od;
fi;
if R<>[] then
printf("Duong di Hamilton : ");
for i in R do lprint(i) od;
fi;
Trang 12if (C=[]) and (R=[]) then
printf("Khong co chu trinh-duong di Hamilton!")
fi;
end:
Trang 13Dữ liệu thử nghiệm
> new(G):
addvertex({a,b,c,d,g},G):
addedge([{a,b},{a,d},{b,c},{c,d},{b,d},{b,d},{c,g}],G):
draw(G);
EulerRouting(G):
Trang 14> V:={a,b,c,d,f}:
E:=[{a,b},{a,c},{a,f},{b,c},{d,f},{b,d}]:
G:=graph(V,E):
draw(G);
Hamilton(G);
Trang 15TÀI LIỆU THAM KHẢO
[1] Tài Liệu lập trình Symbolic – PGS.TS Đỗ văn Nhơn – ĐHCNTT TP.HCM
[2] Sử dụng Mapple để dạy – học Toán trong môi trường tương - Nguyễn Chánh Tú (Khoa Toán, ĐHSP Huế)