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.
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... 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... 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();//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();//khởi tạo tập trung gian var vet = new Queue();//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 . 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,. 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. 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();