Tải bản đầy đủ (.doc) (15 trang)

ỨNG DỤNG MAPPLE ĐỂ GIẢI BÀI TOÁN TÌM ĐƯỜNG ĐI EULER VÀ ĐƯỜNG ĐI HALMITON TRONG ĐỒ THỊ VÔ HƯỚNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (364.76 KB, 15 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
CHƯƠ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
Giảng viên hướng dẫn: PGS.TS. ĐỖ VĂN NHƠN
Học viên thực hiện: VŨ VĂN VIỆT (CH1101058)
tháng 01 năm 2013
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
GIỚ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. (), 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.
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
2
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
MỤ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
i. Thủ tục khởi tạo ban đầu: 5
ii. Thủ tục m chu trình Euler 6
iii. Thủ tục m chu trình đường đi Euler 8
iv. Thủ tục m tất cả đường đi Hamilton trong đồ thị G 9
DỮ LIỆU THỬ NGHIỆM 13
TÀI LIỆU THAM KHẢO 15
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
3

LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
PHÂ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
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
4
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
3. 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.
2. Nếu đồ thị vô hướng G là Euler thì đồ thị đường L(G) cũng là Euler.
3. Đồ thị có hướng là Euler nếu nó liên thông và mọi đỉnh của nó có bậc
vào bằng bậc ra.

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
Một đường đi Hamilton là một đường đi trong đồ thị vô hướng đi qua tất cả các đỉnh
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
i. Thủ tục khởi tạo ban đầu:
> Init:=proc()
restart;
interface( warnlevel = 0 );
with(networks);
#with(LinearAlgebra);
end:
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
5
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
ii. 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];
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
6
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
fi;
#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
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
7
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
V:={};
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:
iii. 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;

Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
8
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
od;
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:
iv. Thủ tục tìm tất cả đường đi Hamilton trong đồ thị G
> Hamilton:=proc(Grph::graph)
local R,C,Try,Found,i;
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
9
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
R:=[];
C:=[];
#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;
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
10
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
else
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;
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
11
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
if (C=[]) and (R=[]) then
printf("Khong co chu trinh-duong di Hamilton!")
fi;
end:
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
12
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
Dữ 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):
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
13

LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
> 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);
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
14
LẬP TRÌNH SYMBOLIC CHO TRÍ TUỆ NHÂN TẠO
TÀ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ế)
Sinh viên thực hiện: VŨ VĂN VIỆT - CH1101058
15

×