Mô hình bài toán:

Một phần của tài liệu XÂY DỰNG HỆ GIẢI BÀI TOÁN THÔNG MINH VỀ HÌNH HỌC KHÔNG GIAN VỚI MÔ HÌNH COKB VÀ ỨNG DỤNG GIẢI BÀI TOÁN TAM GIÁC (Trang 38)

- Chứng minh các giao điểm trên thẳng hàng Mô hình bài toán trên như sau:

3.3Mô hình bài toán:

CHƯƠNG 3:DEMO BIỂU DIỄN TRI THỨC VÀ GIẢI BÀI TOÁN TAM GIÁC

3.3Mô hình bài toán:

Để áp dụng cho bài toán tam giác ta có thể đề xuất mô hình bài toán tổng quát trên mô hình tri thức COKB gồm các thành phần như sau:

(O, Facts, Rules), Goal

Một số thông số (đối tượng, sự kiện) của tam giác cho trước.

...}

Xác định một thông số (đối tượng) của tam giác.

Tổ chức tri thức lưu trên bộ nhớ phụ với 2 file : Facts.txt và Rules.txt

Cấu trúc file Facts.txt : Begin

<tên đối tượng 1> : <mô tả của đối tượng 1> <tên đối tượng 2> : <mô tả của đối tượng 2>

End.

File Facts.txt của chương trình: Begin

A : so do goc doi dien canh a B : so do goc doi dien canh b C : so do goc doi dien canh c a : do dai canh a

b : do dai canh b c : do dai canh c

ha : do dai duong cao tuong ung voi canh a hb : do dai duong cao tuong ung voi canh b hc : do dai duong cao tuong ung voi canh c p : nua chu vi

S : dien tich tam giac End.

Cấu trúc file Rules.txt : <luật 1> : <công thức 1> <luật 2> : <công thức 2>

File Rules.txt của chương trình : //Rules for a

b,B,A->a.b * sin A / sin B c,C,A->a.c * sin A / sin C

//Rules for b

a,A,B->b.a * sin B / sin A c,C,B->b.c * sin B / sin C

a,c,B->b.sqrt ( a * a + c * c – 2 * a * c * cos B ) a,p,c-> a.(2 * p – a -c)

//Rules for c

a,A,C->c.a * sin C / sin A b,B,C->c.b * sin C / sin B a,b,C->c.sqrt ( a * a + b * b – 2 * a * b * cos C ) a,b,p-> a.(2 * p – a -b) //Rules for A a,b,B->A.arcsin ( a * sin B / b ) a,c,C->A.arcsin ( a * sin C / c ) B,C->A.180 – C – B //Rules for B a,b,A->B.arcsin ( b * sin A / a ) b,c,C->B.arcsin ( b * sin C / c ) A,C->B.180 – A – C //Rules for C a,c,A->C.arcsin ( c * sin A / a )

b,c,B->C.arcsin ( c * sin B / b ) A,B->C.180 – A – B //Rules for ha c,B->ha.c * sin B b,C->ha.b * sin C //Rules for hb a,C->hb.a * sin C c,A->hb.c * sin A //Rules for hc a,B->hc.a * sin B b,A->hc.b * sin A //Rules for p a,b,c->p.( a + b + c ) / 2 //Rules for S a,b,c,p->S.sqrt ( p * ( p – a ) * ( p – b ) * ( p – c ) ) a,b,C->S.( a * b * sin C ) / 2 a,c,B->S.( a * c * sin B ) / 2 b,c,A->S.( b * c * sin A ) / 2 a,ha->S.a * ha / 2 b,hb->S.b * hb / 2

c,hc->S.c * hc / 2

3.4 Thuật giải

Sau khi hoàn thành việc thu thập, biểu diễn tri thức và xây dựng cấu trúc dữ liệu để lưu trữ tri thức, ta bắt đầu đi vào xây dựng thuật giải cho bài toán.

Để giải được bài toán ta cần phải xác định những luật nào sẽ dùng để đi được đến kết quả từ những giả thiết đã cho, và sử dụng thuật giải suy diễn tiến để giải bài toán.

Tư tưởng của thuật giải Suy diễn tiến là từ những giả thiết đã biết (know) ta áp dụng các tập luật để sinh ra thêm giả thiết mới và bổ sung vào know. Quá trình này cứ tiếp tục cho đến khi kết luận cần tìm đã nằm trong know hoặc không thể áp dụng được luật nào để sinh thêm giả thiết mới nữa và chương trình kết thúc.

Mô phỏng thuật giải :

Bước 1: Khởi tạo các mảng lưu trữ các luật dùng để tìm giá trị cho mỗi thuộc tính. (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ:

public string[] RuleFora;// Chứa các luật có thể dùng để tìm a public string[] RuleForb;// Chứa các luật có thể dùng để tìm b public string[] RuleForc;// Chứa các luật có thể dùng để tìm c public string[] RuleForA;// Chứa các luật có thể dùng để tìm A public string[] RuleForB;// Chứa các luật có thể dùng để tìm B public string[] RuleForC;// Chứa các luật có thể dùng để tìm C public string[] RuleForha;// Chứa các luật có thể dùng để tìm ha public string[] RuleForhb;// Chứa các luật có thể dùng để tìm hb public string[] RuleForhc;// Chứa các luật có thể dùng để tìm hc

public string[] RuleForChuVi;// Chứa các luật có thể dùng để tìm chu vi p public string[] RuleForDienTich;//Chứa các luật có thể dùng để tìm diện tích S

Bước 2: Tìm mục tiêu:

bool bCanContinue = true;//Có tiếp tục tìm hay không? bool bFindOutNewAttr = false;//Tìm được giả thuyết mới

while (bCanContinue == true && tamgiac.m_ArrAttribute[m_GoalIndex] == -1111) //lặp trong khi có thể tiếp tục tìm và chưa tìm được mục tiêu

bFindOutNewAttr = false;//Chưa tìm được giả thuyết mới khi bắt đầu tìm lại bool bCondition = false;//Điều kiện để dùng luật thích hợp tìm đối tượng //Tim a

bCondition = (tamgiac.m_ArrAttribute[0] == -1111 &&

tamgiac.m_ArrAttribute[m_GoalIndex] == -1111 && bFindOutNewAttr == false); //Điều kiện để duyệt các luật tìm a là a chưa có, chưa tìm được mục tiêu, và chưa tìm ra giải thuyết mới với những giả thuyết đang có.

for (Duyệt các luật để tìm a nếu thỏa các điều kiện tìm ở trên) {

if (Luật[i] có thể tìm được a với những giả thuyết đang có) then {

Gán giá trị của a vào giả thuyết;

Đánh dấu tìm được giả thuyết mới = true; Khi có một giả thuyết mới được tìm thấy thì sẽ quay lại đầu vòng while, để tìm các đối tượng với giả thuyết mới này.

Break;//thoát khỏi vòng lặp } } //Tim b //Tim c //Tim A //Tim B …………

//Áp dụng tương tự cho các luật khác.

//Nếu hết một vòng lặp while mà không tìm thấy giả thuyết nào mới thì ngừng thuật toán chuyển sang Bước 3. Vì không thể tìm ra mục tiêu hoặc các giả thuyết khác để tìm mục tiêu.

if (bFindOutNewAttr == false) bCanContinue = false; }

Bước 3: Kết luận:

+ Nếu chưa tìm được mục tiêu: bài toán không thể giải được + Nếu đã tìm được mục tiêu thì kết luận và đưa ra kết quả.

Một phần của tài liệu XÂY DỰNG HỆ GIẢI BÀI TOÁN THÔNG MINH VỀ HÌNH HỌC KHÔNG GIAN VỚI MÔ HÌNH COKB VÀ ỨNG DỤNG GIẢI BÀI TOÁN TAM GIÁC (Trang 38)