1. Trang chủ
  2. » Luận Văn - Báo Cáo

Hệ cơ sở tri thức

19 620 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 295,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 Mô tả bài toánCho 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.

Trang 1

BÀI TẬP HỆ

CƠ SỞ TRI

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

Trang 2

Mục lục

Mục lục 2

Trang 3

 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

Trang 4

 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

Trang 5

 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

}

Trang 6

 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

}

Trang 7

 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

}

Trang 8

 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

}

Trang 9

 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

Trang 10

• Mô tả thuật toán:

Trang 11

• 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;

}

Trang 12

 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)

{

Ngày đăng: 09/06/2014, 09:36

TỪ KHÓA LIÊN QUAN

w