Tải bản đầy đủ (.docx) (14 trang)

LẬP TRÌNH SYMBOLIC VÀ ỨNG DỤNG GIẢI BÀI TOÁN VỀ TAM GIÁC

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 (339.16 KB, 14 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
 
BÀI THU HOẠCH MÔN LẬP TRÌNH SYMBOLIC
Đề tài:
LẬP TRÌNH SYMBOLIC VÀ ỨNG DỤNG GIẢI BÀI
TOÁN VỀ TAM GIÁC
Giảng viên hướng dẫn: PGS. TSKH. Đỗ Văn Nhơn
Học viên thực hiện: Vưu Văn Tòng (CH1101146)
Thành phố Hồ Chí Minh - Tháng 01 Năm 2013
Lập trình symbolic và ứng dụng trong việc giải tam giác
LỜI MỞ ĐẦU
Trí tuệ nhân tạo ngày càng trở thành một lĩnh vực nghiên cứu và có ứng
dụng thực tế nhất trong thời đại công nghệ ngày nay. Từ những phần mềm
thông minh, có khả năng mô phỏng hành vi của con người, đến các phần
mềm trợ giúp cho con người giải những bài toán mà nếu tính toán bằng sức
người thì rất mất thời gian.
Trên cơ sở đó, các ngôn ngữ lập trình và các phương pháp lập trình cũng
phát triển theo để xây dựng nên các chương trình trí tuệ nhân tạo. Trong đó,
đáng kể nhất là Prolog, LISP và Maple. Các ngôn ngữ trên được gọi là ngôn
ngữ lập trình symbolic.
Trong bài báo cáo này, em xin trình bày đề tài “lập trình symbolic và ứng
dụng giải bài toán về tam giác”. Trong đó bao gồm các phần: sơ lược về lập
trình symbolic, sử dụng Maple để lập trình symbolic và phần ứng dụng về
lập trình giải tam giác bằng Maple.
Em xin chân thành cảm ơn thầy Đỗ Văn Nhơn đã tận tình hướng dẫn chúng
em từ những bước cơ bản, giải đáp những thắc mắc một cách rõ rang và tạo
cho chúng em một nền tảng để có thể dễ dàng tiếp cận vào lĩnh vực lập trình
symbolic cho trí tuệ nhân tạo. Em cũng xin cảm ơn phòng đào tạo sau đại
học đã đưa môn học thú vị này vào chương trình.
Mặc dù đã cố gắng để hoàn thành bài thu hoạch, nhưng do hạn chế về thời


gian và kiến thức nên chắc chắn không thể tránh khỏi những thiếu sót. Rất
mong nhận được những ý kiến đóng góp của thầy.
Lập trình symbolic Trang 2
Lập trình symbolic và ứng dụng trong việc giải tam giác
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN




























Lập trình symbolic Trang 3
Lập trình symbolic và ứng dụng trong việc giải tam giác
NỘI DUNG
Lập trình symbolic Trang 4
Lập trình symbolic và ứng dụng trong việc giải tam giác
1. MAPLE VÀ LẬP TRÌNH SYMBOLIC
1.1. Lập trình symbolic là gì?
Một trong những bước tiến hóa quan trọng của chương trình trên máy tính
trong những năm gần đây là những chương trình có khả năng thực hiện việc tính
toán đại số và các vấn đề toán học dựa trên ký hiệu (symbol) chứ không phải dựa
trên số, chuỗi hay các giá trị khác. LISP và Prolog là những ví dụ của ngôn ngữ
lập trình symbolic. Ví dụ, chúng ta hoàn toàn có thể tính toán rằng: (a+b) *
(c+d) = ac + ad +bc +bd mà không cần biết đến giá trị của a,b,c,d. Symbol là
thành phần cốt lõi của ngôn ngữ cũng như của lập trình symbolic.
Tóm lại, lập trình symbolic là sử dụng ngôn ngữ symbolic để thiết kế và
giải các bài toán. Những ngôn ngữ này thao tác trên các ký hiệu chứ không đơn
thuần dựa trên số, chuỗi như các ngôn ngữ khác (C,C++, )
1.2. Maple – công cụ lập trình symbolic
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 mạnh
mẽ. Maple có cách cài đặt rất đơn giản và hỗ trợ nhiều hệ điều hành khác nhau
như Window, Unix, Mac OS và thậm chí cả Maple.NET chạy trên mạng hỗ trợ
tính toán phân tán.
Maple là một ngôn ngữ lập trình hướng thủ tục – một dãy các lệnh Maple
được sắp xếp tuần tự để thực hiện một tác vụ nào đấy. Khi thực thi, các lệnh đó
sẽ được thực thi tuần tự và trả kết quả sau cùng.
Maple có các chức năng cơ bản:
- Tính toán trên các biểu thức đại số
- Có khả năng tính chính xác hoặc gần đúng

- Có một hệ thống minh họa hình học thuận tiện và mạnh mẽ như vẽ đồ
thị động/tĩnh của các đường, mặt phẳng trong các hệ tọa độ khác nhau.
- Cho phép một số ngôn ngữ lập trình khác (Java, C#, C) tương tác thông
qua hệ thống APIs hoặc REST server.
- Hệ thống help khá hữu ích, dễ dàng tra cứu và sử dụng
Lập trình symbolic Trang 5
Lập trình symbolic và ứng dụng trong việc giải tam giác
2. ỨNG DỤNG LẬP TRÌNH SYMBOLIC ĐỂ GIẢI QUYẾT VẤN ĐỀ
TAM GIÁC
2.1. Mô tả bài toán
Giả sử ta có một tam giác như sau:

Với:
- A,B,C: là các đỉnh của như các góc của tam giác
- a,b,c: là các cạnh tương ứng với các góc (a là ký hiệu cho cạnh BC, b là
ký hiệu cho cạnh AC và c là ký hiệu cho cạnh AB)
- m
a
, m
b
, m
c:
là các đường trung tuyến từ các đỉnh A,B,C
- p: chu vi của tam giác
- S: diện tích của tam giác
Bài toán: giả sử ta biết được giá trị của một số thành phần trong tam giác
(như trên). Ta cần tính giá trị của một thành phần khác.
Ký hiệu bài toán: H  G
Với H là phần giả thuyết còn G là phần kết luận của bài toán.
Ví dụ bài toán được ký hiệu: H = {a=5,b=10,C=90}, G={S}

Thì ta hiểu là: cho trước giá trị của cạnh a, cạnh b và góc C. Hãy tính diện
tích của tam giác.
2.2. Phân tích bài toán
2.2.1. Quy ước
Với bài toán được mô tả như trên, ta sẽ sử dụng Maple để giải quyết. Tuy
nhiên, có một số quy ước cần được tuân thủ:
Lập trình symbolic Trang 6
A
c
b
m
b
m
c
m
a
a
C
B
Lập trình symbolic và ứng dụng trong việc giải tam giác
 H là tập giả thuyết của bài toán, mỗi phần tử trong tập hợp là một
cấu trúc gồm: <tên biến> = <giá trị>. Ví dụ: H := {a=5,b=10}
 G là tập kết luận của bài toán (biến mong muốn tìm được giá trị,
hiện nay chỉ hỗ trợ tìm một biến mỗi lần). Ví dụ: G := {S} hoặc G
:= {a}
 Một tập các công thức (Formula) được áp dụng trên tam giác (truyền
như biến toàn cục) với cấu trúc mỗi phần tử là một đa thức. Ví dụ:
Formular := {A+B+C=180, p=(a+b+c)/2}
 Nếu bài toán giải được ta cần:
o Đưa ra giá trị của thành phần cần tìm

o Đưa ra các bước giải (áp dụng công thức nào trong Formula
và được gì từ công thức đó)
2.3. Thuật giải
Để giải quyết bài toán trên, ta sẽ áp dụng thuật giải trên đối tượng tính toán
(trong trường hợp này đối tượng đó là tam giác). Có 2 thuật giải được áp dụng
trong chương trình: thuật giải tìm đáp số và các bước giải và thuật giải nhằm rút
gọn (loại bỏ các bước dư thừa).
2.3.1. Thuật giải tìm đáp số
 Input:
o Tập các biến cùng với giá trị (phần giả thuyết). Ký hiệu: GT
o Tập gồm một biến cần tìm (phần kết luận). Ký hiệu: KL
o Tập Formular cho trước. Ký hiệu: Formula
 Output:
o Khẳng định có thể tìm được đáp án không
o Nếu có, thì đáp án là gì và áp dụng công thức nào (thứ tự) để có
đáp án
 Thuật giải:
Bước 1:
- Khởi tạo Solution := [] (đây là danh sách các công thức được áp dụng để
giải)
- Khởi tạo varsFoundSet := GT (đây là tập hợp các đẳng thức với vế trái
là một biến và vế phải là giá trị đã tìm được)
- Khởi tạo formulaFound := false (cờ hiệu để biết ta có tìm thấy một công
thức có thể áp dụng dựa trên tập giá trị đã có hay không)
Lập trình symbolic Trang 7
Lập trình symbolic và ứng dụng trong việc giải tam giác
- Khởi tạo solutionFound := true (cờ để xác nhận có tìm thấy lời giải hay
không)
- Khởi tạo SolutionValue := [] (danh sách các đẳng thức đã tính được nhờ
các công thức trong Solution – dùng cho việc rút gọn lời giải và khác

với varsFoundSet, SolutionValue coi trọng thứ tự )
Bước 2:
- While KL not subsets varsFoundSet (tức là chưa tìm thấy)
o formulaFound := false (reset mỗi lần tìm một công thức mới)
o Tìm một công thức f từ Formular có thể áp dụng được (một công
thức được gọi là áp dụng được khi số lượng biến chưa biết giá trị
trong một công thức là 1. Ví dụ: A + B + C = pi thì ta phải biết
được ít nhất 2 giá trị: (A,B) hoặc (A,C) hoặc (B,C))
 If apdungduoc(f) = true then (tìm được công thức thỏa yêu
cầu)
• Thế các biến đã có vào công thức, giải bằng hàm
solve để tìm ra biến còn lại. Đặt là: newvars
• Solution := [op(Solution),f] (thêm f vào Solution)
• varsFoundSet := varsFoundSet union newvars
(thêm biến tìm được vào tập các biến tìm được)
• SolutionValue := [op(SolutionValue),newvars]
• Đặt formulaFound := true để tiếp tục vòng lặp
o If formulaFound = false then: solutionFound := false (không tìm
được công thức nào có thể sử dụng nữa và cũng chưa tìm được
kết quả.
 Goto bước 3;
Bước 3:
- If solutionFound = false then
o Printf(“Không tìm được kết quả”);
- Else
o Printf(“Tìm được kết quả”)
o Gọi hàm rút gọn để loại bỏ các bước dư thừa. Được newSol
o Lặp và in các công thức trong newSol để thể hiện các bước giải
2.3.2. Thuật giả rút gọn lời giải
Lập trình symbolic Trang 8

Lập trình symbolic và ứng dụng trong việc giải tam giác
Một điểm cần lưu ý là sau khi chạy thuật giải đi tìm lời giải ở trên, thì biến
Solution[nops(Solution)] chính là công thức cuối giúp tìm ra kết quả bài toán và
SolutionValue[nops(SolutionValue)] chính là lời giải. Do đó, công thức này là
cần thiết và là cơ sở cho việc rút gọn lời giải.
 Input:
o Danh sách các Solution (các công thức đã áp dụng)
o Danh sách các SolutionValue ( các đẳng thức tìm được sau khi áp
dụng các công thức trong Solution)
 Output:
o Trả về biến newSolution sẽ lưu trữ lại các công thức và giá trị
thật sự có ý nghĩa trong việc tìm lời giải
 Thuật giải:
Bước 1:
- Khởi tạo newSolution là một danh sách 2 chiều (như ma trận)
- Khởi tạo needvarset := indets(Solution[nops(Solution)],name) (lưu trữ
các biến cần phải biết để tìm ra lời giải)
Bước 2:
- newSolution[1] := Solution[ops(Solution)] (lưu lại công thức đã áp dụng
cuối nhất và quan trọng nhất)
- newSolution[2] := SolutionValue[nops(SolutionValue)] (lưu lại kết quả
bài toán)
Bước 3:
- For i from nops(SolutionValue) – 1 by -1 to 1 do (Lặp ngược qua danh
sách các công thức trong Solution trừ công thức cuối cùng)
o x := lhs(SolutionValue[i]) (tìm ra biến mà một công thức nào đó
tính được)
o If x subset needvarset then (x là biến quan trọng cần xác định
mới có thể tìm lời giải)
 newSolution[1] := [op(newSolution[1]),Solution[i]];

 newSolution[2] := [op(newSolution[2]),SolutionValue[i])]
 Bổ sung biến mới vào needvarset.
Lập trình symbolic Trang 9
Lập trình symbolic và ứng dụng trong việc giải tam giác
Bước 4:
- Return newSolution;
2.4. Kiểm tra với dữ liệu giả
Trước khi chạy chương trình để kiểm tra, ta cần đảm bảo rằng tất cả các
hàm và biến phải được load (bằng cách vào hàm hoặc biến nhấn ENTER để
Maple server tự động load các hàm và biến đó).
Giả sử ta có các công thức tính toán như sau:
Bài toán 1: Cho biết các giá trị như sau:
BAI TOAN DA DUOC GIAI QUYET
Ket qua : {S = 2*(-(cos(1/2*pi)^2-
1)*(32*cos(1/2*pi)^2+8*cos(1/2*pi)*(16*cos(1/2*pi)^2+9)^(1/2)+9))^(1/2)}
Cac buoc giai:
Ap dung cong thuc: a^2 = b^2+c^2-2*b*c*cos(A) ta co: c = 4*cos(1/2*pi)
+(16*cos(1/2*pi)^2+9)^(1/2)
Ap dung cong thuc: c^2 = a^2+b^2-2*a*b*cos(C) ta co: C = Pi-
arccos(4/5*cos(1/2*pi)^2+1/5*cos(1/2*pi)*(16*cos(1/2*pi)^2+9)^(1/2)-4/5)
Ap dung cong thuc: S = 1/2*a*b*sin(C) ta co: S = 2*(-(cos(1/2*pi)^2-
1)*(32*cos(1/2*pi)^2+8*cos(1/2*pi)*(16*cos(1/2*pi)^2+9)^(1/2)+9))^(1/2)
Ta thấy, điều đầu tiên giải thuật đã khẳng định là có đáp án.
Tiếp theo, giải thuật in ra đáp án của bài toán
Lập trình symbolic Trang 10
Lập trình symbolic và ứng dụng trong việc giải tam giác
Cuối cùng, giải thuật in ra các công thức và giá trị các biến tìm được theo
công thức (đã rút gọn).
Giờ, chúng ta sẽ thử trong trường hợp KL đã có sẵn trong phần GT xem.
Bài toán 2: kết luận đã được thêm trong phần giả thuyết

BAI TOAN DA DUOC GIAI QUYET
Ket qua da nam trong gia thuyet
Ta thấy, chương trình đã đưa ra gợi ý rằng phần đang tìm đã tồn tại. Không
cần tìm nữa.
2.5. Ưu và khuyết điểm của chương trình
Do hạn chế về thời gian và kiến thức nên chương trình có một số lỗi/hạn
chế nhất định. Dưới đây là danh sách các hạn chế:
- Chưa xây dựng được giao diện chương trình.
- Công thức về tam giác chưa đủ. Cần bổ sung thêm các công thức khác
- Số lượng thành phần trong tam giác còn thiếu. Ví dụ như đường cao,
bán kính đường tròn nội tiếp….
- Chưa áp dụng thuật giải Heuristic vào chương trình, chỉ tìm công thức
theo dạng vòng lặp.
Tuy nhiên, chương trình cũng có số ưu điểm:
- Dễ dàng cài đặt (chỉ cần mở bằng Maple là xong).
- Có thể bổ sung thêm các công thức mới, thành phần mới dễ dàng (thêm
vào biến toàn cục Formula)
- Có khả năng rút gọn lời giải để tạo ra một lời giải TỐT.
Lập trình symbolic Trang 11
Lập trình symbolic và ứng dụng trong việc giải tam giác
3. KẾT LUẬN
Học được một cái mới, cách lập trình Symbolic bằng công cụ mạnh như
Maple là một điều tuyệt với ở môn học này.
Qua quá trình học tập và làm tiểu luận, em đã có cơ hội để hiểu rõ hơn,
cũng cố và trao dồi thêm nhiều kiến thức về các phương pháp lập trình (đặc biệt
là lập trình symbolic) và cách mà con người tạo ra những chương trình mang tính
trí tuệ cao
Trong giới hạn của đề tài, em mong rằng những kiến thức em đã tìm hiểu,
những kết quả em đã đạt được sẽ có ích cho tập thể, góp phần làm trực quan hóa
một phương pháp lập trình và biểu diễn tri thức, góp phần khuyến khích sự tìm

tòi và học hỏi mở rộng trên các bài toán trí tuệ nhân tạo khác nhau.
Theo em, hướng phát triển tiếp theo của bài thu hoạch này nên đi theo:
- Áp dụng Heuristic vào chương trình với thông tin thêm là độ phức tạp
của công thức. Công thức nào đơn giản nhất thì nên được chọn.
- Trong trường hợp không tìm ra được lời giải thì chương trình nên ít nhất
gợi ý cho người dùng như: “để giải bài toán này thì ta cần biết thêm giá
Lập trình symbolic Trang 12
Lập trình symbolic và ứng dụng trong việc giải tam giác
trị của một biến/tập biến nào đó” hoặc “biến a nên được thay đổi như
thế này để có lời giải”…
- Mở rộng chương trình từ một đối tượng tính toán thành mạng các đối
tượng tính toán để có thể giải quyết nhiều bài toán hơn, hoặc các bài
toán phức tạp hơn.
- Thiết lập giao diện trực quan bằng Maplet hoặc bằng cách kết hợp các
ngôn ngữ lập trình khác với Maple.
Lập trình symbolic Trang 13
Lập trình symbolic và ứng dụng trong việc giải tam giác
4. TÀI LIỆU THAM KHẢO
 Danh sách giáo trình và sách điện tử
[1]. Đỗ Văn Nhơn. Các bài giảng về Maple, lập trình Symbolic. Đại học
Công nghệ Thông tin.
[2]. Đỗ Văn Nhơn. Model for Knowledge Bases of Computational
Objects. Department of Computer Science, University of Information
Technology, Ho Chi Minh City, Vietnam.
 Danh sách website
[1]. (một số khái niệm về
tam giác)
[2]. (hướng dẫn sử dụng các
APIs của Maple)
[3]. (các công

thức được áp dụng trong giải tam giác)
Lập trình symbolic Trang 14

×