MỤC LỤC
MỤC LỤC 1
I. BIỄU DIỄN TRI THỨC SỬ DỤNG MẠNG NGỮ NGHĨA 2
1. Khái niệm 2
2. Ưu điểm và nhược điểm của mạng ngữ nghĩa 4
3. Một ví dụ tiêu biểu 5
II. GIẢI BÀI TOÁN TAM GIÁC 5
1. Bài Toán 5
2. Cài đặt 12
19 trang |
Chia sẻ: maiphuongtl | Lượt xem: 2510 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Đề tài Áp dụng mạng ngữ nghĩa giải bài toán tam giác, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
Khoa Công Nghệ Thông Tin
MÔN HỌC
TRÍ TUỆ NHÂN TẠO
BÀI TẬP LỚN:
ÁP DỤNG MẠNG NGỮ NGHĨA GIẢI BÀI TOÁN TAM GIÁC
Giảng viên : Trần Hùng Cường
Nhóm sinh viên : Nhóm 14
Nguyễn Thị Ánh
Vương Thị Ngọc Mai
Lớp : KHMT1 K2
Hà Nội 10-3-2010MỤC LỤC
I. BIỄU DIỄN TRI THỨC SỬ DỤNG MẠNG NGỮ NGHĨA
1. Khái niệm
Mạng ngữ nghĩa là một phương pháp biểu diễn tri thức đầu tiên và cũng là phương pháp dễ hiểu nhất đối với chúng ta. Phương pháp này sẽ biểu diễn tri thức dưới dạng một đồ thị, trong đó đỉnh là các đối tượng (khái niệm) còn các cung cho biết mối quan hệ giữa các đối tượng (khái niệm) này.
Chẳng hạn : giữa các khái niệm chích chòe, chim, hót, cánh, tổ có một số mối quan hệ như sau :
Chích chòe là một loài chim.
Chim biết hót
Chim có cánh
Chim sống trong tổ
Các mối quan hệ này sẽ được biểu diễn trực quan bằng một đồ thị như sau :
Do mạng ngữ nghĩa là một loại đồ thị cho nên nó thừa hưởng được tất cả những mặt mạnh của công cụ này. Nghĩa là ta có thể dùng những thuật toán của đồ thị trên mạng ngữ nghĩa như thuật toán tìm liên thông, tìm đường đi ngắn nhất, để thực hiện các cơ chế suy luận. Điểm đặc biệt của mạng ngữ nghĩa so với đồ thị thông thường chính là việc gán một ý nghĩa (có, làm, là, biết, ...) cho các cung. Trong đồ thị tiêu chuẩn, việc có một cung nối giữa hai đỉnh chỉ cho biết có sự liên hệ giữa hai đỉnh đó và tất cả các cung trong đồ thị đều biểu diễn cho cùng một loại liên hệ. Trong mạng ngữ nghĩa, cung nối giữa hai đỉnh còn cho biết giữa hai khái niệm tương ứng có sự liên hệ như thế nào. Việc gán ngữ nghĩa vào các cung của đồ thị đã giúp giảm bớt được số lượng đồ thị cần phải dùng để biễu diễn các mối liên hệ giữa các khái niệm. Chẳng hạn như trong ví dụ trên, nếu sử dụng đồ thị thông thường, ta phải dùng đến 4 loại đồ thị cho 4 mối liên hệ : một đồ thị để biểu diễn mối liên hệ "là", một đồ thị cho mối liên hệ "làm", một cho "biết" và một cho "có".
Một điểm khá thú vị của mạng ngữ nghĩa là tính kế thừa. Bởi vì ngay từ trong khái niệm, mạng ngữ nghĩa đã hàm ý sự phân cấp (như các mối liên hệ "là") nên có nhiều đỉnh trong mạng mặc nhiên sẽ có những thuộc tính của những đỉnh khác. Chẳng hạn theo mạng ngữ nghĩa ở trên, ta có thể dễ dàng trả lời "có" cho câu hỏi : "Chích chòe có làm tổ không?". Ta có thể khẳng định được điều này vì đỉnh "chích chòe" có liên kết "là" với đỉnh "chim" và đỉnh "chim" lại liên kết "biết" với đỉnh "làm tổ" nên suy ra đỉnh "chích chòe" cũng có liên kết loại "biết" với đỉnh "làm tổ". (Nếu để ý, bạn sẽ nhận ra được kiểu "suy luận" mà ta vừa thực hiện bắt nguồn từ thuật toán "loang" hay "tìm liên thông" trên đồ thị!). Chính đặc tính kế thừa của mạng ngữ nghĩa đã cho phép ta có thể thực hiện được rất nhiều phép suy diễn từ những thông tin sẵn có trên mạng.
Tuy mạng ngữ nghĩa là một kiểu biểu diễn trực quan đối với con người nhưng khi đưa vào máy tính, các đối tượng và mối liên hệ giữa chúng thường được biểu diễn dưới dạng những phát biểu động từ (như vị từ). Hơn nữa, các thao tác tìm kiếm trên mạng ngữ nghĩa thường khó khăn (đặc biệt đối với những mạng có kích thước lớn). Do đó, mô hình mạng ngữ nghĩa được dùng chủ yếu để phân tích vấn đề. Sau đó, nó sẽ được chuyển đổi sang dạng luật hoặc frame để thi hành hoặc mạng ngữ nghĩa sẽ được dùng kết hợp với một số phương pháp biểu diễn khác.
2. Ưu điểm và nhược điểm của mạng ngữ nghĩa
Ưu điểm
Mạng ngữ nghĩa rất linh động, ta có thể dễ dàng thêm vào mạng các đỉnh hoặc cung mới để bổ sung các tri thức cần thiết.
Mạng ngữ nghĩa có tính trực quan cao nên rất dễ hiểu.
Mạng ngữ nghĩa cho phép các đỉnh có thể thừa kế các tính chất từ các đỉnh khác thông qua các cung loại "là", từ đó, có thể tạo ra các liên kết "ngầm" giữa những đỉnh không có liên kết trực tiếp với nhau.
Mạng ngữ nghĩa hoạt động khá tự nhiên theo cách thức con người ghi nhận thông tin.
Nhược điểm
Cho đến nay, vẫn chưa có một chuẩn nào quy định các giới hạn cho các đỉnh và cung của mạng. Nghĩa là bạn có thể gán ghép bất kỳ khái niệm nào cho đỉnh hoặc cung!
Tính thừa kế (vốn là một ưu điểm) trên mạng sẽ có thể dẫn đến nguy cơ mâu thuẫn trong tri thức. Chẳng hạn, nếu bổ sung thêm nút "Gà" vào mạng như hình sau thì ta có thể kết luận rằng "Gà" biết "bay"!. Sở dĩ có điều này là vì có sự không rõ ràng trong ngữ nghĩa gán cho một nút của mạng. Bạn đọc có thể phản đối quan điểm vì cho rằng, việc sinh ra mâu thuẫn là do ta thiết kế mạng dở chứ không phải do khuyết điểm của mạng!. Tuy nhiên, xin lưu ý rằng, tính thừa kế sinh ra rất nhiều mối liên "ngầm" nên khả năng nảy sinh ra một mối liên hệ không hợp lệ là rất lớn!
Hầu như không thể biển diễn các tri thức dạng thủ tục bằng mạng ngữ nghĩa vì các khái niệm về thời gian và trình tự không được thể hiện tường minh trên mạng ngữ nghĩa.
3. Một ví dụ tiêu biểu
Dù là một phương pháp tương đối cũ và có những yếu điểm nhưng mạng ngữ nghĩavẫn có những ứng dụng vô cùng độc đáo. Hai loại ứng dụng tiêu biểu của mạng ngữ nghĩa là ứng dụng xử lý ngôn ngữ tự nhiên và ứng dụng giải bài toán tự động.
Ví dụ 1 : Trong ứng dụng xử lý ngôn ngữ tự nhiên, mạng ngữ nghĩa có thể giúp máy tính phân tích được cấu trúc của câu để từ đó có thể phần nào "hiểu" được ý nghĩa của câu. Chẳng hạn, câu "Châu đang đọc một cuốn sách dày và cười khoái trá" có thể được biểu diễn bằng một mạng ngữ nghĩa như sau :
II. GIẢI BÀI TOÁN TAM GIÁC
1. Bài Toán :“Cho hai góc a, b và chiều dài cạnh a của tam giác. Tính chiều dài đường cao hC".
Với mỗi bài tập này, việc bạn cần làm là lấy giấy bút ra tìm cách tính, sau khi đã xác định các bước tính toán, bạn chuyển nó thành chương trình. Nếu có 10 bài, bạn phải làm lại việc tính toán rồi lập trình 10 lần. Nếu có 100 bài, bạn phải làm 100 lần. Và tin buồn cho bạn là số lượng bài toán thuộc loại này là rất nhiều! Bởi vì một tam giác có tất cả 22 yếu tố khác nhau!. Không lẽ mỗi lần gặp một bài toán mới, bạn đều phải lập trình lại? Liệu có một chương trình tổng quát có thể tự động giải được tất cả (vài ngàn!) những bài toán tam giác thuộc loại này không? Câu trả lời là CÓ ! Và ngạc nhiên hơn nữa, chương trình này lại khá đơn giản. Bài toán này sẽ được giải bằng mạng ngữ nghĩa.
Có 22 yếu tố liên quan đến cạnh và góc của tam giác. Để xác định một tam giác hay để xây dựng một 1 tam giác ta cần có 3 yếu tố trong đó phải có yếu tố cạnh. Như vậy có khoảng C322 -1 (khoảng vài ngàn) cách để xây dựng hay xác định một tam giác. Theo thống kê, có khoảng 200 công thức liên quan đến cạnh và góc 1 tam giác.
Để giải bài toán này bằng công cụ mạng ngữ nghĩa, ta phải sử dụng khoảng 200 đỉnh để chứa công thức và khoảng 22 đỉnh để chứa các yếu tố của tam giác. Mạng ngữ nghĩa cho bài toán này có cấu trúc như sau :
Đỉnh của đồ thị bao gồm hai loại :
· Đỉnh chứa công thức (ký hiệu bằng hình chữ nhật)
· Đỉnh chứa yếu tố của tam giác (ký hiệu bằng hình tròn)
Cung : chỉ nối từ đỉnh hình tròn đến đỉnh hình chữ nhật cho biết yếu tố tam giác xuất hiện trong công thức nào (không có trường hợp cung nối giữa hai đỉnh hình tròn hoặc cung nối giữa hai đỉnh hình chữ nhật).
* Lưu ý : trong một công thức liên hệ giữa n yếu tố của tam giác, ta giả định rằng nếu đã biết giá trị của n-1 yếu tố thì sẽ tính được giá trị của yếu tố còn lại. Chẳng hạn như trong công thức tổng 3 góc của tam giác bằng 1800 thì khi biết được hai góc, ta sẽ tính được góc còn lại.
Cơ chế suy diễn thực hiện theo thuật toán "loang" đơn giản sau :
B1 : Kích hoạt những đỉnh hình tròn đã cho ban đầu (những yếu tố đã có giá trị)
B2 : Lặp lại bước sau cho đến khi kích hoạt được tất cả những đỉnh ứng với những yếu tố cần tính hoặc không thể kích hoạt được bất kỳ đỉnh nào nữa.
Nếu một đỉnh hình chữ nhật có cung nối với n đỉnh hình tròn mà n-1 đỉnh hình tròn đã được kích hoạt thì kích hoạt đỉnh hình tròn còn lại (và tính giá trị đỉnh còn lại này thông qua công thức ở đỉnh hình chữ nhật).
Giả sử ta có mạng ngữ nghĩa để giải bài toán tam giác như hình sau
.Các bước thi hành của thuật toán như sau :
Bắt đầu : đỉnh a, b, a của đồ thị được kích hoạt.
Công thức (1) được kích hoạt (vì a, b được kích hoạt). Từ công thức (1) tính được góc δ . Đỉnh δ được kích hoạt.
Công thức (2) được kích hoạt (vì a, b, a được kích hoạt). Từ công thức (2) tính cạnh b.
Công thức (3) được kích hoạt (vì 3 đỉnh b, d , b được kích hoạt). Từ công thức (3) tính được cạnh c. Đỉnh c được kích hoạt.
Công thức (4) được kích hoạt (vì 3 đỉnh a, b, c được kích hoạt) . Từ công thức (3) tính được diện tích S. Đỉnh S được kích hoạt.
Công thức (5) được kích hoạt (vì 2 đỉnh S, c được kích hoạt). Từ công thức (5) tính được hC. Đỉnh hC được kích hoạt.
Giá trị hC đã được tính. Thuật toán kết thúc.
Về mặt chương trình, ta có thể cài đặt mạng ngữ nghĩa giải bài toán tam giác bằng một mảng hai chiều A trong đó :
Cột : ứng với công thức. Mỗi cột ứng với một công thức tam giác khác nhau (đỉnh hình chữ nhật).
Dòng : ứng với yếu tố tam giác. Mỗi dòng ứng với một yếu tố tam giác khác nhau (đỉnh hình tròn).
Phần tử A[i, j] = -1 nghĩa là trong công thức ứng với cột j có yếu tố tam giác ứng với cột i. Ngược lại A[i,j] = 0.
Để thực hiện thao tác "kích hoạt" một đỉnh hình tròn, ta đặt giá trị của toàn dòng ứng với yếu tố tam giác bằng 1.
Để kiểm tra xem một công thức đã có đủ n-1 yếu tố hay chưa (nghĩa là kiểm tra điều kiện "đỉnh hình chữ nhật có cung nối với n đỉnh hình tròn mà n-1 đỉnh hình tròn đã được kích hoạt"), ta chỉ việc lấy hiệu giữa tổng số ô có giá trị bằng 1 và tổng số ô có giá trị -1 trên cột ứng với công thức cần kiểm tra. Nếu kết quả bằng n, thì công thức đã có đủ n-1 yếu tố.
Trở lại mạng ngữ nghĩa đã cho. Quá trình thi hành kích hoạt được diễn ra như sau :
Mảng biểu diễn mạng ngữ nghĩa ban đầu
(1)
(2)
(3)
(4)
(5)
a
-1
-1
0
0
0
b
-1
-1
-1
0
0
d
-1
0
-1
0
0
a
0
-1
0
-1
0
b
0
-1
-1
-1
0
c
0
0
-1
-1
-1
S
0
0
0
-1
-1
hC
0
0
0
0
-1
Khởi đầu : đỉnh a, b, a của đồ thị được kích hoạt.
(1)
(2)
(3)
(4)
(5)
a
1
1
0
0
0
b
1
1
1
0
0
d
-1
0
-1
0
0
a
0
1
0
1
0
b
0
-1
-1
-1
0
c
0
0
-1
-1
-1
S
0
0
0
-1
-1
hC
0
0
0
0
-1
Trên cột (1), hiệu (1+1 - (-1)) = 3 nên dòng δ sẽ được kích hoạt.
(1)
(2)
(3)
(4)
(5)
a
1
1
0
0
0
b
1
1
1
0
0
d
1
0
1
0
0
a
0
1
0
1
0
b
0
-1
-1
-1
0
c
0
0
-1
-1
-1
S
0
0
0
-1
-1
hC
0
0
0
0
-1
Trên cột (2), hiệu (1+1+1 - (-1)) = 4 nên dòng b sẽ được kích hoạt.
(1)
(2)
(3)
(4)
(5)
a
1
1
0
0
0
b
1
1
1
0
0
d
1
0
1
0
0
a
0
1
0
-1
0
b
0
1
1
1
0
c
0
0
-1
-1
-1
S
0
0
0
-1
-1
hC
0
0
0
0
-1
Trên cột (3), hiệu (1+1+1 - (-1)) = 4 nên dòng c được kích hoạt.
(1)
(2)
(3)
(4)
(5)
a
1
1
0
0
0
b
1
1
1
0
0
d
1
0
1
0
0
a
0
1
0
1
0
b
0
1
1
1
0
c
0
0
1
1
1
S
0
0
0
-1
-1
hC
0
0
0
0
-1
Trên cột (4), hiệu (1+1+1 - (-1)) = 4 nên dòng S được kích hoạt.
(1)
(2)
(3)
(4)
(5)
a
1
1
0
0
0
b
1
1
1
0
0
d
1
0
1
0
0
a
0
1
0
1
0
b
0
1
1
1
0
c
0
0
1
1
1
S
0
0
0
1
1
hC
0
0
0
0
-1
Trên cột (5), hiệu (1+1 - (-1)) = 3 nên dòng hC được kích hoạt.
Khả năng của hệ thống này không chỉ dừng lại ở việc tính ra giá trị các yếu tố cần thiết, với một chút sửa đổi, chương trình này còn có thể đưa ra cách giải hình thức của bài toán và thậm chí còn có thể chọn được cách giải hình thức tối ưu (tối ưu hiểu theo nghĩa là cách giải sử dụng những công thức đơn giản nhất). Sở dĩ có thể nói như vậy vì cách suy luận của ta trong bài toán này là tìm kiếm theo chiều rộng. Do đó, khi đạt đến kết quả, ta có thể có rất nhiều cách khác nhau. Để có thể chọn được giải pháp tối ưu, bạn cần phải định nghĩa được độ "phức tạp" của một công thức. Một trong những tiêu chuẩn thường được dùng là số lượng phép nhân, chia, cộng, trừ, rút căn, tính sin, cos, ... được áp dụng trong công thức. Các phép tính sin, cos và rút căn có độ phức tạp cao nhất, kế đến là nhân chia và cuối cùng là cộng trừ. Cuối cùng bạn có thể cải tiến lại phương pháp suy luận bằng cách vận dụng thuật toán A* với ước lượng h=0 để có thể chọn ra được "đường đi" tối ưu. Ta chọn ước lượng h=0 vì hai lý do sau (1) không gian bài toán nhỏ nên ta không cần phải giới hạn độ rộng tìm kiếm (2) xây dựng một ước lượng như vậy là tương đối khó khăn, đặc biệt là làm sao để hệ thống không đánh giá quá cao h.
2. Cài đặt :
#include
#include
#include
#include
#include
int n,m,j;int x[20][20];
void nhapmt(int x[][20],int n,int m)
{ for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{cout<<"x["<<i<<","<<j<<"]=";
cin>>x[i][j];
}
}
void inmt(int x[][20],int n,int m)
{ for(int i=1;i<=n;i++)
{for(int j=1;j<=m;j++)
cout<<setw(4)<<x[i][j];
cout<<endl;
}
} // kich hoat dong ma cac bien da co gia tri ban dau
void kh_1(int x[][20],int i,int m)
{
for(int j=1;j<=m;j++)
{
if(x[i][j]==-1)
x[i][j]=1;
}
}
// dem gia tri =1 trong cot
int dem_1(int x[][20],int n,int j)
{
int dem=0;
for(int i=1;i<=n;i++)
{
if(x[i][j]==1)
dem=dem++;
}
return dem;
}
//dem gia tri khac 0 trong cot
int dem_k0(int x[][20],int n,int j)
{
int dem=0;
for(int i=1;i<=n;i++)
{
if(x[i][j]!=0)
dem=dem++;
}
return dem;
}
//kich hoat cac phan tu dong i
void kh_2(int x[][20],int i,int m)
{
for(int j=1;j<=m;j++)
if(x[i][j]==-1)
x[i][j]=1;
}
// tim dong duoc kich hoat
int dong_kh(int x[][20],int n,int j)
{
int vt;
for( int i=1;i<=n;i++)
if(x[i][j]==-1)
vt=i;
return vt;
}
// thuat toan mang ngu nghia
// neu cot j ma tong tai dem_1 +1== dem_k0
// kich hoat dong ma co gia tri=-1 trong cot j
void MangNN(int x[][20],int n,int m)
{
kh_1(x,1,m);
kh_1(x,2,m);
kh_1(x,4,m);
for(int j=1;j<=m;j++)
if(dem_1(x,n,j)+1 == dem_k0(x,n,j) )
kh_2(x,dong_kh(x,n,j),m);
}
float giatri (float anfa,float beta,float a)
{ float denta,b,c,s,hc;
anfa=1.5708,beta=0.6446,a=5;
b=(a*sin(beta))/sin(anfa);
denta = 3.1416 - anfa-beta;
c=(b*sin(denta))/sin(beta);
float p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
hc=(s/c)*2;
return hc;
}
// dua ra ket qua
void ketqua(int x[][20],int n,int j)
{ float anfa,beta,a;
//gia tri can tinh nam trong cong thuc thu j
//nhap gia tri j
cout<<"\n nhap so cong thuc co chua gia tri can tinh :";
cin>>j;
if(dem_1(x,n,j)==dem_k0(x,n,j))
{
cout<<"\n co tinh duoc gia tri theo cac cong thuc";
cout<<"chieu cao hc = "<<giatri(anfa,beta,a);
}
else
{
cout<<"\n khong tinh duoc gia tri theo cac cong thuc";
cout<<"\n vi nhung bien lien quan khong the tinh duoc theo cong thuc";
}
}
void main()
{
clrscr();
int n=8,m=5,a[20][20],j;
// float anfa=1.5708,beta=0.6446,a=5;
cout<<"nhap gia tri ma tran \n";
nhapmt(x,n,m);
cout<<"ma tran ban dau la \n";
inmt(x,n,m);
MangNN(x,n,m);
cout<<"ma tran ket qua la\n";
inmt(x,n,m);
ketqua(x,n,j);
getch();
}