Đầu tiên, chúng ta tạo tạo một mạng Bayes với giao diện đồ hoạ của Netica. Bạn không cần phải viết một dòng code nào cả. Các thao tác đều là kéo thả.
Sau khi tìm được các đường candidate path chúng ta tính được xác suất có mặt của các đỉnh trong mạng, đó chính là các “bằng chứng” cho mạng Bayes. Công việc đặt ra là cập nhật lại các xác suất cho các node của mạng. Sau đây là một đoạn giả mã thực hiện công việc đó bằng ngôn ngữ C#:
// Khởi tạo ban đầu.
Netica.Application app = new Netica.Application(); app.Visible = true;
Streamer file = app.NewStream(<tên của file chứa mạng>, null); BNet net = app.ReadBNet(file, "");
while (<vẫn còn bằng chứng>) {
Tìm node tương ứng, giả sửđó là biến n. BNode n;
- 49 - float[] a = new float[2];
// Tạo bằng chứng. n.finding().enterLikelihood(a); } // Dịch mạng, cập nhật các xác suất. net.compile(); // Thao tác với các xác suất vừa tính được. NodeList list = net.getNodes();
for (int i = 0; i < list.size(); i++) { Node node = list.getNode(i); float[] a = node.getBeliefs();
// Bạn có thể làm gì đó, ví dụ in ra file hoặc cập nhật cơ sở dữ liệu. }
// Kết thúc. env.finalize();
Chú ý rằng để có thể biên dịch được đoạn mã trên trong môi trường .NET ứng dụng của chúng ta cần tham chiếu đến Assembly của Netica.
Một chú ý nữa là các bằng chứng ở đây thuộc kiểu likelihood. Trong trường hợp này, chúng ta nhận thông tin không chắc chắn về giá trị của một số node cụ thể. Nó có thể
từ một bộđo không hoàn hảo, hoặc từ một người nào đó người mà không phải luôn luôn
đúng. Giả sử chúng ta có một cái cảm biến để đo nhiệt độ, và khi nhiệt độ cao thì nó sẽ
bật sáng. Thực tế chúng ta thấy rằng khi nhiệt độ thấp, cảm biến không bao giờ sáng; khi nhiệt độ trung bình nó sáng 10% trong các lần như thế; và khi nhiệt độ cao nó luôn luôn sáng. Nếu trong một thời điểm cụ thể, chúng ta quan sát cảm biến đang sáng, và muốn nhập vào các bằng chứng cho node Temperature, thì chúng ta ta sử dụng bằng chứng likelihood. Một bằng chứng likelihood bao gồm một giá trị xác suất cho mỗi trạng thái của node. Đối với ví dụ của chúng ta, bằng chứng likelihood sẽ là (0, 0.1, 1). Một hiểu nhầm phổ biến là nghĩ rằng bằng chứng likelihood là xác suất của trạng thái được cho bởi
- 50 -
quan sát (trong trường hợp đó tổng các giá trị sẽ bằng 1, nhưng tổng các bằng chứng likelihood không yêu cầu bằng 1).
Phụ Lục 3 : Một số module thuật toán
2.1 Module thuật toán Dijkstra
static void Dijkstra(int s, int t, ref int lenght, int[] candidatePath) {
int i, k = s, kc, nuthientai, min, kcachmoi;
int[] tapcacnut = new int[VerticesMax]; // tap cac nut da xet
int[] kcach = new int[VerticesMax]; /* mang luu chieu dai duong di ngan nhat tu nut s den cac nut khac */
//khoi dong mang tapcacnut[] va kcach[]
for (i = 0; i < nodeCount; i++) {
tapcacnut[i] = FALSE; kcach[i] = INFINITE; }
// dua nut s vao tap nut da xet
tapcacnut[s] = TRUE; kcach[s] = 0;
nuthientai = s;
/* vong lap thuc hien cac buoc 1, 2,..cho den khi dua duoc nut t vao tap nut da xet */
while (nuthientai != t) {
min = INFINITE; kc = kcach[nuthientai];
/* kc chieu dai duong di ngan nhat tu nut s
den nuthientai */
for (i = 0; i < nodeCount; i++) if (tapcacnut[i] == FALSE) {
kcachmoi = kc + weight[nuthientai, i]; if (kcachmoi < kcach[i])
{
kcach[i] = kcachmoi;
candidatePath[i] = nuthientai;
/* gan nuthientai la nut truoc nut i tren lo trinh */
} if (kcach[i] < min) { min = kcach[i]; k = i; } }
// Dua nut k vao tap nut da xet
nuthientai = k;
- 51 -
}
lenght = kcach[t]; }
2.2 Module tìm đường candidate path
public static void GetCandidatePath(int[] outCandidatePath, ref int verticesMount, string pathFile, int attribute,int startVertex,int terminalVertex)
{
int lenght = 0; int count = -1; int s, t, i;
int[] candidatePath = new int[VerticesMax]; string path;
s = startVertex; t = terminalVertex; if (attribute == 0)
path = RootPath + MasterLevelPath + "\\" + pathFile; else if (attribute == 1)
path = RootPath + DifficultyLevelPath + "\\" + pathFile; else if (attribute == 2)
path = RootPath + RequitedTimePath + "\\" + pathFile; else if (attribute == 3)
path = RootPath + InteractiveStylePath + "\\" + pathFile; else
path = RootPath + ForSkillPath + "\\" + pathFile;
// search candidate path
Initialize(); Initializewt(path);
for (int ii = 0; ii < VerticesMax; ii++) candidatePath[ii] = 0; Dijkstra(s, t, ref lenght, candidatePath);
count = -1;//dem so dinh trong learning candidate path
i = t; while (i != s) { count++; outCandidatePath[count] = i; i = candidatePath[i]; } count++; outCandidatePath[count] = s; verticesMount = count + 1; }
- 52 -
2.3 Module tính toán mạng xác suất để tìm đường learning path sau khi đã có các
đường candidate path
//---Caculate Learning Path---
try {
Netica.Application app = new Netica.Application(); app.Visible = true;
string net_file_name = RootPath + CPTPath;
Streamer file = app.NewStream(net_file_name, null); BNet net = app.ReadBNet(file, "");
net.Compile();
double[] evi = new double[2]; double tempt;
for (int ii = 0; ii < nodeCount ; ii++) {
if ((ii != s) && (ii != t)) {
tempt = (double)nbt[ii] / Count; evi[0] = tempt;
evi[1] = 1 - tempt;
BNode node = net.Node("N" + ii.ToString()); node.EnterLikelihood(evi);
} }
//for start and terminal vertex
evi[0] = 1; evi[1] = 0;
BNode nodeStart = net.Node("N" + s.ToString()); nodeStart.EnterLikelihood(evi);
BNode nodeTerminal = net.Node("N" + t.ToString()); nodeTerminal.EnterLikelihood(evi);
rp_dataProvider thresholdProvider = new rp_dataProvider(); thresholdProvider.SetCommandTex("pr_select_threshold");
thresholdProvider.SetCommandType(CommandType.StoredProcedure); thresholdProvider.AddParameter("@CourseID", 3);
SqlDataReader thresholdReader = thresholdProvider.GetSqlDataReader(); verticesCount = -1;
double temp;
for (int ii = 0; ii < nodeCount; ii++) {
BNode node = net.Node("N" + ii.ToString()); thresholdReader.Read();
temp = thresholdReader.GetDouble(0); Console.WriteLine(temp);
if (temp < (double)node.GetBelief("true")) {
verticesCount++;
- 53 - } } verticesCount++; thresholdProvider.Close(); // write to file learningWriter.Write(username +": "); for (int ii = 0; ii < verticesCount -1; ii++) { learningWriter.Write(learningPath[ii]+"-->"); } learningWriter.Write(learningPath[verticesCount - 1]); learningWriter.WriteLine(); //net.Delete();
//if (!app.UserControl) app.Quit();
}
catch (System.Runtime.InteropServices.COMException e) {
Console.WriteLine("Netica Demo: Error " + (e.ErrorCode & 0x7FFF) + ": " + e.Message);