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 1BÀ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 2Mụ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)
{