BÁO CÁO BÀI TẬP LỚN HỆ CHUYÊN GIA ĐỀ TÀI: Cài đặt thuật toán suy diễn lùi chuẩn đoán hỏng hóc của máy tính Hỏng máy tính luôn là vấn đề gặp phải đối với người sử dụng máy tính. Đôi khi có những lỗi mà chúng ta có thể phát hiện ra bằng trưc quan hoặc bằng âm thanh do máy phát ra.
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP LỚN HỆ CHUYÊN GIA
ĐỀ TÀI: Cài đặt thuật toán suy diễn lùi chuẩn đoán hỏng hóc của máy tính
Gv hướng dẫn: Thầy Trần Hùng CườngSinh viên thực hiện:
1 Lê Văn Thanh
2 Hoàng Minh Thanh
3 Hoàng Văn Quang
4 Phạm Đình Ba
5 Nguyễn Thắng Lớp: KHMT2 – K2
Hà Nội – 15/08/2010
Trang 2Lời nói đầu
Hỏng máy tính luôn là vấn đề gặp phải đối với người sử dụng máy tính Đôi khi có những lỗi mà chúng ta có thể phát hiện ra bằng trưc quan hoặc bằng âm thanh do máy phát ra.Nhằm phát hiện ra những lỗi đơn giản của máy tính cũng như củng cố kiến thức về hệ chuyên gia chúng em đã chọn đề tài: “Cài đặt thuật toán suy diễn lùi chuẩn đoán hỏng hóc của máy tính”
Chương trình còn nhiều thiếu sót, chúng em mong nhận được sự đóng góp của thầy và các bạn để chúng em hoàn thiện chương trình hơn
Tổng quan về hệ chuyên gia
Hệ chuyên gia là gì?
Hệ chuyên gia là một chương trình máy tính biểu diễn và lập luận dựa trên tri thức trong
1 chủ để làm việc cụ thể nào đó, với cách nhằm giải quyết vấn đề hoặc đưa ra lời khuyên.Cấu trúc của hệ chuyên gia
Hệ chuyên gia = Cơ sở tri thức + Mô tơ suy diễn
Suy diễn lùi là gì?
Suy diễn lùi : là quá trình suy luận ngược xuất phát từ một số sự kiện ban đầu, ta tìm
kiếm các sự kiện đã "sinh" ra sự kiện này
Một ví dụ thường gặp trong thực tế là xuất phát từ các tình trạng của máy tính, chẩn đoán xem máy tính đã bị hỏng hóc ở đâu
Trang 3• Không sử dụng được máy tính
• Điện vào máy tính "có" hay "không"
Tập các luật :
R1 Nếu (cáp màn hình "lỏng") thì không sử dụng được máy tính
R2.Nếu (ô cứng “hỏng”) thì không sử dụng được máy tính
R3 Nếu (điện vào máy là "có") và (âm thanh đọc ổ cứng là "không") thì (ổ cứng
"hỏng")
R4 Nếu (điện vào máy là “có”) và (đèn ổ cứng là “tắt”) thì (ổ cứng “hỏng”)
R5 Nếu (điện vào máy là "có") và (tình trạng đèn màn hình là "chớp đỏ") thì (cáp màn hình "lỏng")
Xây dựng luật
a: là cáp màn hình lỏng => c: không sử dụng được máy tính
b: ổ cứng hỏng => c :không sử dụng được máy tính.d: điện vào máy là có & e: âm thanh đọc ổ cứng là không => f: ổ cứng hỏng
d điện vào máy là có & g: đèn ổ cứng là tắt =>f :ổ cứng hỏng
d điện vào máy là có & h: đèn màn hình là chớp đỏ =>k: cáp màn hình lỏngr1:a=>c
Trang 4Như vậy là để xác định được nguyên nhân gây ra hỏng hóc là do ổ cứng hỏng hay cáp màn hình lỏng, hệ thống phải lần lượt đi vào các nhánh để kiểm tra các điều kiện như điện vào máy "có", âm thanh ổ cứng "không"…Tại một bước, nếu giá trị cần xác định không thể được suy ra từ bất kỳ một luật nào, hệ thống sẽ yêu cầu người dùng trực tiếp nhập vào Chẳng hạn như để biết máy tính có điện không, hệ thống sẽ hiện ra màn hình
câu hỏi "Bạn kiểm tra xem có điện vào máy tính không (kiểm tra đèn nguồn)? (C/K)" Để
thực hiện được cơ chế suy luận lùi, người ta thường sử dụng ngăn xếp (để ghi nhận lại những nhánh chưa kiểm tra)
Chuong trinh minh hoa co che suy dien lui
#include "stdio.h"
Trang 5#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define FileNut "SDLNut.txt"
#define FileLuat "SDLLuat.txt"
typedef enum Loai {NutLa,TrungGian,KetLuan};
typedef struct tagLuat
{
char TenLuat[10];
Trang 6tagLuat() // Ham khoi tao
// Dinh nghia cac ham
void DocNutTuFile(char* FileName)
Trang 8// Ham nay tim vi tri cua nut co ten (Ten) trong mang NutTen[]int TimVitriNut(char *Ten)
Trang 9while (iFnd<jFnd-1 && stInput[iFnd] == ' ')
iFnd++; // Bo qua cac khoang trang
if (stInput[iFnd] == '^')
Trang 10TapLuat[i].VT[2*nCount] = NODE_AND;
}else
if (stInput[iFnd] == '|'){
TapLuat[i].VT[2*nCount] = NODE_OR;
}else
if (stInput[iFnd] == '~')
bNot = -1;
else{
j = iFnd;
while (j<jFnd && stInput[j] != ' ' && stInput[j] != '|'
&& stInput[j] != '^' && stInput[j] != '~' && stInput[j] != '=')
stTen[j-iFnd] = stInput[j++];
stTen[j-iFnd] = '\0';
TapLuat[i].VT[2*nCount+1] = bNot*TimVitriNut(stTen);
bNot = 1;
nCount ++;
iFnd = j-1;
}
Trang 11iFnd ++;
}
// Xu ly ve phaiiFnd = jFnd+1;
Trang 12int bNot; // =1 khi khang dinh, =-1 khi phu dinh
if (bFound == 0) // Neu tim khong gap o ve trai > Day la nut KetLuan
NutLoai[TapLuat[i].VP] = KetLuan;
else
Trang 13NutLoai[TapLuat[i].VP] = TrungGian;
}
}
/////////////////////////////////////////////////////////////////////
// Hoi nguoi dung gia tri cua nut thu VitriNut
void HoiNguoiDung(int VitriNut)
Trang 14void TinhGiaTriCuaNutKetLuan(int SoHieuNut){
Trang 15// Tim luat co ket luan la SoHieuNut
for (int i=0; i<SoLuat; i++)
Trang 16// Neu nut chua co gia tri nay la NutLa > Hoi nguoi dung
if (NutLoai[bNot*r.VT[2*j+1]] == NutLa)
HoiNguoiDung(bNot*r.VT[2*j+1]);else // Day la nut TrungGian
TinhGiaTriCuaNutKetLuan(bNot*r.VT[2*j+1]);
}}
// Den day, Cac nut o ve trai deu co gia tri > Tinh gia tri cua ve phai dua vao luat r
Trang 17giatri = AND(giatri, x);else
giatri = OR(giatri,x);
}GTNut[r.VP] = giatri;
}}
printf("\n DANH SACH CAC NUT \n");
printf("\nTEN NUT Y NGHIA\n");
for (int i=1; i<=SoNut; i++)
printf("\n%4s %s", NutTen[i], NutYNghia[i]);
printf("\n\n\n An ENTER de quay ve man hinh chinh");getch();
}
/////////////////////////////////////////////////////////////////////
// Tu luat > tao chuoi luat
Trang 18void TaoChuoiLuat(int SoHieuLuat, char ChuoiLuat[])
strcat(ChuoiLuat, "~");
bNot = -1;
}
strcat(ChuoiLuat, NutTen[(bNot*TapLuat[SoHieuLuat].VT[2*j+1])]);
}
strcat(ChuoiLuat, " => ");
Trang 19strcat(ChuoiLuat, NutTen[TapLuat[SoHieuLuat].VP]);ChuoiLuat[strlen(ChuoiLuat)] = '\0';
Trang 20// Xu ly qua trinh suy dien lui
TinhGiaTriCuaNutKetLuan(i);
}printf("\n Ket qua qua trinh suy dien lui:\n");
for (i=1; i<=SoNut; i++)
if (NutLoai[i] == KetLuan){
printf("\n Nut ket luan %s (%s) co gia tri la: %d", NutTen[i], NutYNghia[i], GTNut[i]);
}
printf("\n\n\n An ENTER de quay ve man hinh chinh");
Trang 21printf ("\n BANG GIA TRI CUA CAC NUT\n\n");
for (int i=1; i<=SoNut; i++)
Trang 22printf("\nCHUONG TRINH MINH HOA CO CHE SUY DIEN LUI\n\n");printf("\n 1 XEM TAP NUT");
printf("\n 2 XEM TAP LUAT");
printf("\n 3 CHAY CHUONG TRINH");
printf("\n 4 XEM GIA TRI CUA CAC NUT");
Trang 23}}while (1);