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

Hệ cơ sở tri thứ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 (289.82 KB, 19 trang )

BÀI TẬP HỆ
CƠ SỞ TRI
THỨC
28 THÁNG 11
2013
Cài đặt thuật toán suy diễn tiến bằng các cách tổ chức dữ liệu cho tập thỏa
bằng cách khác nhau như ngăn xếp, hàng đợi, tăng dần, giảm dần và sử
dụng giá trị đánh giá của hàm đánh giá dựa trên đồ thị RPG
GIẢI THUẬT SUY
DIỄN TIẾN
SINH VIÊN: HÀ VĂN TÂN
Mục lục
Mục lục 2
2 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Mô tả bài toán
Cho tập các luật , giả thiết và kết luận.
Yêu cầu: Xác định kết luận đua ra có đúng hay không với giả thiết và tập luật đã cho, nếu đúng thì
đưa ra vết suy diễn.
 Sơ đồ thuật toán
hàm get(THOA) được thực hiện theo từng cách tổ chức dũ liệu khác nhau
3 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Cài đặt chung
 Định nghĩa đối tượng luật
[code]
public class Luat
{
public Luat()//hàm Khởi tạo
{
Number = 0;


Left = new List<string>();
Right = new List<string>();
Value = -1;
}
public int Number { get; set; }// số thứ tự luật
public List<string> Left { get; set; }// các mệnh đề vế trái
public List<string> Right { get; set; }// các mệnh đề vế phải
public int Value { get; set; }// giá trị hàm đánh giá dựa vào đồ thị RPG
}
 Khai báo các đối tượng
public static List<Luat> ListLuat;// danh sách các luật
public static List<string> Gt; // tập mệnh đề giả thiết
public static List<string> Kl; // tập mệnh đề kết luận
public static List<Luat> RGt; // tập luật giả thiết
public static List<Luat> RKl; // tập luật kết luận
4 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Cài đặt thuật toán
 Tập thỏa được tổ chức bằng hàng đợi
private void HangDoi()
{
// bước khởi tạo
var isDone = false;// biến cờ để kiểm tra việc kết thúc thuật toán
var isFound = false;// biến cờ để kiểm tra đã tìm ra vết suy diễn
var thoa = new Queue<Luat>();//khởi tạo tập thỏa (cài đặt bằng hàng đợi)
var tg = new Queue<string>();//khởi tạo tập trung gian
var vet = new Queue<Luat>();//khởi tạo tập vết
var lR = WorkContext.ListLuat.ToList(); // khởi tạo tập luật
// bước 0: đẩy các tập mệnh đề giả thiết vào tập trung gian
foreach (var item in WorkContext.Gt)

{
tg.Enqueue(item);
}
// hiểm thị dữ liệu lên grid view
while (!isDone && !isFound)
{
// Duyệt tất cả các luật
//luật nào có tất cả các mệnh đề vế trái nằm trong tập trung gian và thêm vào tập thỏa
foreach (var luat in lR)
{
var isContain = luat.Left.All(l => tg.Any(s => s == l));
if (isContain && thoa.All(l => l != luat)) thoa.Enqueue(luat);
}
// hiểm thị dữ liệu lên grid view
// Kiểm tra tập thỏa khác rỗng nếu rỗng thì kết thúc thuật toán
if (thoa.Count > 0)
{
var r = thoa.Dequeue();// lấy 1 luật trong tập thỏa
vet.Enqueue(r); // đẩy luật vừa lấy ra vào tập vết
lR.Remove(r);// xóa luật vừa lấy ra khỏi tập luật R
// thêm tất cả các mệnh đề bên vế phải của luật được lấy ra vào tập trung gian
foreach (var lr in r.Right)
tg.Enqueue(lr);
// hiểm thị dữ liệu lên grid view
// kiểm tra điều kiện lặp tiếp
// kiểm tra xem tập mệnh đề kết luận có tồn tại trong mệnh đề trung gian không
// nếu tồn tại thì kết thúc vòng lăp và đưa ra vết suy diễn nhờ vào tập vết
// nếu không tồn tại thì kiểm tra tiếp xem đã duyệt qua tất cả các luật chưa
if (WorkContext.Kl.All(k => tg.Any(kt => kt == k)))
isFound = true;

if (lR.Count == 0)
isDone = true;
}
else
isDone = true;
}
// kết thúc thuật toán và kết luật bài toán
if (isFound)
//tìm được vết suy diễn
else
//không tìm thấy vết suy diễn
}
5 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được tổ chức bằng ngăn xế
private void NganXep()
{
// bước khởi tạo
var thoa = new Stack<Luat>();//khởi tạo tập thỏa (cài đặt bằng ngăn xếp)
var tg = new Queue<string>();//khởi tạo tập trung gian
var vet = new Queue<Luat>();//khởi tạo tập vết
var lR = WorkContext.ListLuat.ToList();// khởi tạo tập luật
var isDone = false;// biến cờ để kiểm tra việc kết thúc thuật toán
var isFound = false;// biến cờ để kiểm tra đã tìm ra vết suy diễn
// bước 0: đẩy các tập mệnh đề giả thiết vào tập trung gian
foreach (var item in WorkContext.Gt)
tg.Enqueue(item);
// hiểm thị dữ liệu lên grid view
while (!isDone && !isFound)
{

// Duyệt tất cả các luật
//luật nào có tất cả các mệnh đề vế trái nằm trong tập trung gian thêm vào tập thỏa
foreach (var luat in lR)
{
var isContain = luat.Left.All(l => tg.Any(s => s == l));
if (isContain && thoa.All(l => l != luat)) thoa.Push(luat);
}
// hiểm thị dữ liệu lên grid view
#region Kiểm tra tập thỏa khác rỗng nếu rỗng thì kết thúc thuật toán
if (thoa.Count > 0)
{
var r = thoa.Pop();// lấy 1 luật trong tập thỏa
vet.Enqueue(r);// đẩy luật vừa lấy ra vào tập vết
lR.Remove(r);// xóa luật vừa lấy ra khỏi tập luật R
// thêm tất cả các mệnh đề bên vế phải của luật được lấy ra vào tập trung gian
foreach (var lr in r.Right)
tg.Enqueue(lr);
// hiểm thị dữ liệu lên grid view
// kiểm tra điều kiện lặp tiếp
// kiểm tra xem tập mệnh đề kết luận có tồn tại trong mệnh đề trung gian không
//- nếu tồn tại thì kết thúc vòng lăp và đưa ra vết suy diễn nhờ vào tập vết
//- nếu không tồn tại thì kiểm tra tiếp xem đã duyệt qua tất cả các luật chưa
if (WorkContext.Kl.All(k => tg.Any(kt => kt == k)))
isFound = true;
if (lR.Count == 0)
isDone = true;
}
else
isDone = true;
}

// kết thúc thuật toán và kết luật bài toán
if (isFound)
// tìm được vết suy diễn
else
// không tìm thấy vết suy diễn
}
6 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được tổ chức là danh sách tăng dần theo thứ tự luật
private void TangDan()
{ // bước khởi tạo
var thoa = new List<Luat>();//khởi tạo tập thỏa (cài đặt bằng danh sách
tăng dần)
var tg = new Queue<string>();//khởi tạo tập trung gian
var vet = new Queue<Luat>();//khởi tạo tập vết
var lR = WorkContext.ListLuat.ToList();// khởi tạo tập luật
var isDone = false;// biến cờ để kiểm tra việc kết thúc thuật toán
var isFound = false;// biến cờ để kiểm tra đã tìm ra vết suy diễn
// bước 0: đẩy các tập mệnh đề giả thiết vào tập trung gian
foreach (var item in WorkContext.Gt)
tg.Enqueue(item);
// hiểm thị dữ liệu lên grid view
while (!isDone && !isFound)
{ // Duyệt tất cả các luật
//luật nào có tất cả các mệnh đề vế trái nằm trong tập trung gian thêm vào tập thỏa
foreach (var luat in lR)
{
var isContain = luat.Left.All(l => tg.Any(s => s == l));
if (isContain && thoa.All(l => l != luat)) thoa.Add(luat);
}

thoa = thoa.OrderBy(p => p.Number).ToList();//sắp xếp danh sách luật
tăng dần theo thứ tự luật
// hiểm thị dữ liệu lên grid view
// Kiểm tra tập thỏa khác rỗng nếu rỗng thì kết thúc thuật toán
if (thoa.Count > 0)
{
// lấy 1 luật trong tập thỏa
var r = thoa.FirstOrDefault();
thoa.Remove(r);// xóa luật vừa lấy ra khỏi tập thỏa
vet.Enqueue(r);// đẩy luật vừa lấy ra vào tập vết
lR.Remove(r);// xóa luật vừa lấy ra khỏi tập luật R
// thêm tất cả các mệnh đề bên vế phải của luật được lấy ra vào tập trung gian
foreach (var lr in r.Right)
tg.Enqueue(lr);
// hiểm thị dữ liệu lên grid view
// kiểm tra điều kiện lặp tiếp
// kiểm tra xem tập mệnh đề kết luận có tồn tại trong mệnh đề trung gian không
//- nếu tồn tại thì kết thúc vòng lăp và đưa ra vết suy diễn nhờ vào tập vết
//- nếu không tồn tại thì kiểm tra tiếp xem đã duyệt qua tất cả các luật chưa
if (WorkContext.Kl.All(k => tg.Any(kt => kt == k)))
isFound = true;
if (lR.Count == 0)
isDone = true;
}
else
isDone = true;
}
// kết thúc thuật toán và kết luật bài toán
if (isFound)
//tìm được vết suy diễn

}
else
// không tìm thấy vết suy diễn
}
7 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được tổ chức là danh sách giảm dần theo thứ tự luật
private void GiamDan()
{ // bước khởi tạo
var thoa = new List<Luat>();//khởi tạo tập thỏa (cài đặt bằng danh sách
giảm dần)
var tg = new Queue<string>();//khởi tạo tập trung gian
var vet = new Queue<Luat>();//khởi tạo tập vết
var lR = WorkContext.ListLuat.ToList();// khởi tạo tập luật
var isDone = false;// biến cờ để kiểm tra việc kết thúc thuật toán
var isFound = false;// biến cờ để kiểm tra đã tìm ra vết suy diễn
// bước 0: đẩy các tập mệnh đề giả thiết vào tập trung gian
foreach (var item in WorkContext.Gt)
tg.Enqueue(item);
// hiểm thị dữ liệu lên grid view
while (!isDone && !isFound)
{
// Duyệt tất cả các luật
//luật nào có tất cả các mệnh đề vế trái nằm trong tập trung gian thêm vào tập thỏa
foreach (var luat in lR)
{
var isContain = luat.Left.All(l => tg.Any(s => s == l));
if (isContain && thoa.All(l => l != luat)) thoa.Add(luat);
}
thoa = thoa.OrderByDescending(p => p.Number).ToList();//sắp xếp danh

sách luật giảm dần theo thứ tự luật
//hiểm thị dữ liệu lên grid view
// Kiểm tra tập thỏa khác rỗng nếu rỗng thì kết thúc thuật toán
if (thoa.Count > 0)
{
// lấy 1 luật trong tập thỏa
var r = thoa.FirstOrDefault();
thoa.Remove(r);// xóa luật vừa lấy ra khỏi tập thỏa
vet.Enqueue(r);// đẩy luật vừa lấy ra vào tập vết
lR.Remove(r);// xóa luật vừa lấy ra khỏi tập luật R
// thêm tất cả các mệnh đề bên vế phải của luật được lấy ra vào tập trung gian
foreach (var lr in r.Right)
tg.Enqueue(lr);
// hiểm thị dữ liệu lên grid view
// kiểm tra điều kiện lặp tiếp
// kiểm tra xem tập mệnh đề kết luận có tồn tại trong mệnh đề trung gian không
// - nếu tồn tại thì kết thúc vòng lăp và đưa ra vết suy diễn nhờ vào tập vết
//- nếu không tồn tại thì kiểm tra tiếp xem đã duyệt qua tất cả các luật chưa
if (WorkContext.Kl.All(k => tg.Any(kt => kt == k)))
isFound = true;
if (lR.Count == 0)
isDone = true;
}
else
isDone = true;
}
// kết thúc thuật toán và kết luật bài toán
if (isFound)
//tìm được vết suy diễn
else

// không tìm thấy vết suy diễn
}
8 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được sắp xếp tăng dần theo giá trị của hàm đánh giá dựa vào đồ thị RPG
 Cài đặt thuật toán tìm tập giả thiết và kết luận
private void XacDinhLuatGtKl()
{
WorkContext.RGt.Clear();
WorkContext.RKl.Clear();
foreach (var lawTemp in WorkContext.ListLuat)
{
//kiểm tra xem luật hiện tại có tất cả mệnh đề vế trái nằm trong tập mện giả thiết
luận không
var checkGt = lawTemp.Left.All(p => WorkContext.Gt.Contains(p));
//kiểm tra xem luật hiện tại có tất cả mệnh đề vế phải nằm trong tập mện đề kết luận
không
var checkKl = lawTemp.Right.All(p => WorkContext.Kl.Contains(p));
if (checkGt)
WorkContext.RGt.Add(lawTemp);
if (checkKl)
WorkContext.RKl.Add(lawTemp);
}
}
 Cài đặt thuật toán đánh giá luật
• Ý tưởng:
♦ Dùng thuật toán đệ quy để xác định giá trị của luật
9 | P a g e
SINH VIÊN: HÀ VĂN TÂN
• Mô tả thuật toán:

10 | P a g e
SINH VIÊN: HÀ VĂN TÂN
• Cài đặt
private int XacDinhGiaTri(Luat luat)
{
//kiểm tra nếu luật đưa được kiểm tra có vế
//các mệnh đề vế phải nằm trong tập mệnh đề kết luận
//thì trả về giá trị của luật là 0
if (WorkContext.RKl.Contains(luat))
return 0;
var value = -1; //biến lưu trữ giá trị trả về (quy ước [-1] là giá trị vô
cùng)
//duyệt tất cả các luật loại trừ luật được đưa vào kiểm tra
foreach (var luat1 in WorkContext.ListLuat)
{
if (luat != luat1)
{
var valueTemp = -1;//khai báo một biến tạm để lưu trữ giá trị của
luật luat1
//kiểm tra nếu tất cả mệnh vế phải của luat xem có nằm trong vế
trái của luật này không
if (luat.Right.All(p => luat1.Left.Contains(p)))
{
//nếu đúng
valueTemp = 1;// gán giá trị của biến valueTemp = 1
var val = XacDinhGiaTri(luat1);//gọi đệ quy để đánh giá giá
trị của luật này
if (val != -1)//kiểm tra nếu giá trị của luật này
// nếu khác giá trị vô cùng thì cộng thêm giá trị này vào
biến valueTemp

valueTemp += val;
else
//nếu bằng -1 thì gán giá trị của biến valueTemp = -1
valueTemp = -1;
}
//kiểm tra xem giá trị valueTemp =-1 không
if (valueTemp != -1)
//nếu khác -1 thì kiểm tra biến giá trị value xem có khác -1
không
if (value != -1)
//nếu khác kiểm tra xem giá trị biến valueTemp có nhỏ hơn
biến giá trị value không
if (valueTemp < value)
//nếu nhỏ hơn thì gán giá trị biến value bằng giá trị
của biến valueTemp
value = valueTemp;
else
//nếu bằng thì gán giá trị biến value bằng giá trị của
biến valueTemp
value = valueTemp;
}
}
//kết thúc vòng lặp trả về giá trị của biến value
return value;
}
11 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Cài đặt thuật toán sũy diễn dựa vào đò thị RPG
private void Rpg()
{

// bước khởi tạo
var thoa = new List<Luat>();//khởi tạo tập thỏa (cài đặt bằng danh
sách tăng dần theo giá trị đánh giá)
var tg = new Queue<string>();//khởi tạo tập trung gian
var vet = new Queue<Luat>();//khởi tạo tập vết
var lR = WorkContext.ListLuat.ToList();// khởi tạo tập luật
var isDone = false;// biến cờ để kiểm tra việc kết thúc thuật toán
var isFound = false;// biến cờ để kiểm tra đã tìm ra vết suy diễn
// bước 0: đẩy các tập mệnh đề giả thiết vào tập trung gian
foreach (var item in WorkContext.Gt)
tg.Enqueue(item);
}
// hiểm thị dữ liệu lên grid view
while (!isDone && !isFound)
{
// Duyệt tất cả các luật
//luật nào có tất cả các mệnh đề vế trái nằm trong tập trung gian thì đưa vào tập thỏa
foreach (var luat in lR)
{
var isContain = luat.Left.All(l => tg.Any(s => s == l));
if (isContain && thoa.All(l => l != luat))
{
// chọn vị trí để chèn luật vào tập thỏa sao cho tập
// thỏa được sắp sếp tăng dần theo giá trị đánh giá
if (luat.Value == -1)
if (thoa.Count > 0)
thoa.Insert(thoa.Count - 1, luat);
else
thoa.Insert(0, luat);
else

{
if (thoa.Count > 0)
{
var index = 0;
for (int i = thoa.Count - 1; i >= 0; i )
{
if (thoa[i].Value >= luat.Value)
index = i;
else if (thoa[i].Value == -1)
index = i;
}
thoa.Insert(index, luat);
}
else
thoa.Insert(0, luat);
}
}
}
// hiểm thị dữ liệu lên grid view
// Kiểm tra tập thỏa khác rỗng nếu rỗng thì kết thúc thuật toán
if (thoa.Count > 0)
{
//lấy 1 luật trong tập thỏa
12 | P a g e
SINH VIÊN: HÀ VĂN TÂN
var r = thoa.FirstOrDefault();
thoa.Remove(r); xóa luật vừa lấy ra khỏi tập thỏa
vet.Enqueue(r);// đẩy luật vừa lấy ra vào tập vết
lR.Remove(r);// xóa luật vừa lấy ra khỏi tập luật R
// thêm tất cả các mệnh đề bên vế phải của luật được lấy ra vào tập trung gian

foreach (var lr in r.Right)
tg.Enqueue(lr);
// hiểm thị dữ liệu lên grid view
// kiểm tra điều kiện lặp tiếp
// kiểm tra xem tập mệnh đề kết luận có tồn tại trong mệnh đề trung gian không
//- nếu tồn tại thì kết thúc vòng lăp và đưa ra vết suy diễn nhờ vào tập vết
//- nếu không tồn tại thì kiểm tra tiếp xem đã duyệt qua tất cả các luật chưa
if (WorkContext.Kl.All(k => tg.Any(kt => kt == k)))
isFound = true;
if (lR.Count == 0)
isDone = true;
}
else
isDone = true;
}
//kết thúc thuật toán và kết luật bài toán
if (isFound)
// tìm được vết suy diễn
else
// không tìm thấy vết suy diễn
}
13 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Chạy thử thuật toán
Với tập luật sau:
r1. a^b -> c
r2. a^c -> d
r3. b^c -> e
r4. a^e -> m
r5. a^b -> n

r6. n^e -> m
Thì kết quả như sau
 Đồ thị RPG:
 Đánh giá luật:
 Xác định tập luật giả thiết và tập luật kết luận
• Tập luật giả thiết: r
1
,r
5
• Tập luật kết luận: r
4
,r
6

 Xác định giá trị của từng luật
Ví dụ xác định luật r
1:
Bước 1: kiểm tra xem r
1
có thuộc tập luật kết luận không nếu có thì trả về giá trị la 0
Bước 2: duyệt tất cả các luật còn lại với những luật có vế trái chứa vế phải của r
1
thì gọi đệ
quy để xác định giá trị của các luật đó rồi đem so sánh chúng với nhau giá trị của luật nào nhỏ
hơn thi ta lấy giá trị đó cộng với 1 thì ta có giá trị của r
1
nếu không có luật nào thỏa mãn thì
trả về giá trị của r
1
la vô cùng

Ta thấy chỉ có r
2
,r
3
thỏa mãn điều kiện để duyệt.
- dùng chính hàm trên để xác đinh giá trị r
2
tương tụ r
1
nên ta thấy giá trị của r
2
bằng vô
cùng.
- dùng chính hàm trên để xác đinh giá trị r
3
tương tự r
1
ta thấy r
4
,r
6
thỏa mãn, ta lại dung
thuật toán đó để kiểm tra hai luật này kết quả đề trả về 0 vì 2 luật này đều thuộc tập
luật kết luận, do 2 giá trị là bằng nhau va bằng 0 nên ta lấy 0 +1 là giá trị của r
3
- so sánh giá trị r
2
và r
3
ta thấy r

3
có giá trị nhỏ hơn nên ta lấy giá trị của r
3
+ 1,
- vậy giá trị của r
1
là 2
với các luật còn lại xác đinh tương tự ta được
14 | P a g e
SINH VIÊN: HÀ VĂN TÂN
r
2
= -1(giá trị vô cùng)
r
3
= 1
r
4
= 0
r
5
= 1
r
6
= 0
15 | P a g e
SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được tổ chức bằng hàng đợi
 Tập thỏa được tổ chức bằng ngăn xếp
16 | P a g e

SINH VIÊN: HÀ VĂN TÂN
 Tập thỏa được tổ chức là danh sách tăng dần theo thứ tự luật
 Tập thỏa được tổ chức là danh sách giảm dần theo thứ tự luật
 Tập thỏa được sắp xếp tăng dần theo giá trị của hàm đánh giá dựa vào đồ thị RPG
17 | P a g e
SINH VIÊN: HÀ VĂN TÂN
18 | P a g e
SINH VIÊN: HÀ VĂN TÂN
______END______
19 | P a g e

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×