1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÀI TẬP LỚN Môn: Hệ Chuyên Gia Đề Tài: Xây dựng hệ chuyên gia sử dụng suy diễn mờ và ứng dụng trong điều khiển máy giặt.

56 18 0

Đ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 56
Dung lượng 1,23 MB

Nội dung

BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN  BÀI TẬP LỚN Môn: Hệ Chuyên Gia Đề Tài: Xây dựng hệ chuyên gia sử dụng suy diễn mờ ứng dụng điều khiển máy giặt Giảng viên HD: Th.S Trần Hùng Cường Lớp: ĐH CNTT4-K12 Thực hiện: Nguyễn Cảnh Nguyên Hà nội: ngày 10 tháng 11 năm 2020 Mục lục LỜI MỞ ĐẦU Hệ chuyên gia (Expert System)-một lĩnh vực ứng dụng trí tuệ nhân tạo, cụ thể hệ chuyên gia sử dụng tri thức chuyên gia để giải vấn đề (bài toán) khác thuộc lĩnh vực Trí tuệ nhân tạo nói chung hệ chuyên gia nói riêng ngày phát triển để dáp ứng nhu cầu người Một sống đại lượng liệu lớn hơn, yêu phương pháp xử lý phức tạp hơn, mà nhân lực người có giới hạn, hệ chun gia cho thấy khả Là chương trình máy tính lại có khả giải tốn chuyên gia người Mục tiêu ban đầu xây dựng hệ chuyên gia để hỗ trợ mà ta khơng có chun gia bên cạnh, nhờ sở tri thức mà hệ chuyên gia sử dụng tri thức chuyên gia chuẩn hóa cài đặt, mà nhờ giải tốn cần phải tham khảo ý kiến từ chuyên gia người Dù chưa có khả thay hồn tồn cho chuyên gia nhiều lĩnh vực có sở tri thức đủ tin cậy, có khả suy diễn chứng thực chuyên gia hệ chuyên gia nguồn tham khảo tốt hỗ trợ đắc lực cho người sống Với toán dự điều khiển máy giặt, toán thực tiễn phù hợp cho sinh viên áp dụng điều học vào thực tế Điều khiển máy giặt tốt giúp người dùng tối ưu lượng nước – thứ khan tương lai mà giặt đồ hiệu Dựa thông số đầu vào mà em xây dựng thành công hệ chuyên gia điều khiển máy giặt dựa vào thông số cụ thể độ bẩn quần áo, chất liệu vải, lượng quần áo cần giặt Trong trình thực đề tài cịn có nhiều thiếu sót, mong thầy tiếp tục góp ý giúp em hồn thiện tốt Em xin chân thành cảm ơn Chương 1: Tổng quan Hệ chuyên gia Tổng quan Hệ chuyên gia 1.1 Hệ chuyên gia gì? Hệ chuyên gia hệ thống chương trình máy tính chứa thơng tin, tri thức q trình suy luận lĩnh vực cụ thể để giải vấn đề khó tốn địi hỏi chuyên gia người Nói cách khác hệ chuyên gia dựa tri thức chuyên gia người giỏi lĩnh vực định Tri thức (knowledge) hệ chuyên gia thu thập chuẩn hóa dựa tri thức, hiểu biết chuyên gia ngành Mức độ hiệu hệ chuyên gia phụ thuộc vào kích thước chất lượng sở tri thức mà hệ có Một hệ chuyên gia đặc trưng cho lĩnh vực vấn đề cụ thể, y học, tài chính, khoa học hay cơng nghệ, vv…, mà khơng phải cho lĩnh vực vấn đề Ví dụ: hệ chuyên gia lĩnh vực y học để phát bệnh lây nhiễm có nhiều tri thức số triệu chứng lây bệnh, lĩnh vực tri thức y học bao gồm bệnh, triệu chứng chữa trị Hoạt động hệ chuyên gia dựa tri thức minh họa sau: Hệ thống giao tiếpCơ sở tri thức Người dùng Máy suy diễn 1.2 Đặc trưng ưu điểm hệ chun gia • Hệ chun gia có đặc trưng bản: - Hiệu cao: Khả trả lời với mức độ tinh thông cao so với chuyên gia (người) lĩnh vực - Thời gian trả lời thỏa đáng: Thời gian trả lời hợp lý, nhanh so với chuyên gia (người) để đến định - Độ tin cậy cao: Không thể xảy cố giảm sút độ tin cậy sử dụng - Dễ hiểu: Hệ chuyên gia giải thích bước suy luận cách dễ hiểu quán • Những ưu điểm hệ chuyên gia: - Phổ cập: Là sản phẩm chuyên gia, phát triển không ngừng với hiệu sử dụng phủ nhận - Giảm giá thành - Giảm rủi ro: Giúp người tránh rủi ro môi trường nguy hiểm - Tính thường trực: Bất kể lúc khai thác sử dụng Trong người mệt mỏi, nghỉ ngơi hay vắng mặt - Đa lĩnh vực: Chuyên gia nhiều lĩnh vực khác khai thác đồng thời thời gian sử dụng - Độ tin cậy - Khả giảng giải: Câu trả lời với mức độ tinh thông giảng giải rõ - ràng, chi tiết, dễ hiểu Khả trả lời nhanh Tính ổn định, suy luận có lý đầy đủ lúc nơi Trợ giúp thông minh người hướng dẫn Có thể truy cập sở liệu thông minh 1.3 Các lĩnh vực ứng dụng hệ chuyên gia Tính đến thời điểm này, hàng trăm hệ chuyên gia xây dựng báo cáo thường xuyên tạp chí, sách báo hội thảo khoa học Ngồi hệ chuyên gia sử dụng công ty, tổ chức quân mà không cơng bố lí bảo mật Dưới số lĩnh vực ứng dụng diện rộng hệ chun gia: Lĩnh vực Cấu hình Chẩn đốn Truyền đạt Ứng dụng diện rộng Tập hợp thích đáng thành phần hệ thống theo cách riêng Lập luận dựa chứng quan sát Dạy học kiểu thơng minh cho sinh viên hỏi Giải thích Kiểm tra Lập kế hoạch Dự đốn Chữa trị Điều khiển 1.4 Giải thích liệu thu nhận So sánh liệu thu lượm với chuyên môn để đánh giá hiệu Lập kế hoạch sản xuất theo yêu cầu Dự đoán hậu từ tình xảy Chỉ định cách thụ lý vấn đề Điều khiển trình, địi hỏi diễn giải, chẩn đốn, kiểm tra, lập kế hoạch, dự đoán chữa trị Cấu trúc hệ chuyên gia Một hệ chuyên gia kiểu mẫu gồm thành phần sau : • Giao diện người, máy: Thực giao tiếp hệ chuyên gia người sử dụng Nhận thông tin từ người dùng (các câu hỏi, yêu cầu lĩnh vực) đưa lời khuyên, câu trả lời, giải thích lĩnh vực • Bộ giải thích: Giải thích hoạt động hệ có u cầu người sử dụng • Bộ thu nạp tri thức: Làm nhiệm vụ thu nhận tri thức từ chuyên gia người, từ kỹ sư tri thức người sử dụng thông qua câu hỏi yêu cầu họ, sau lưu trữ vào sở tri thức • Cơ sở tri thức: Lưu trữ, biểu diễn tri thức lĩnh vực mà hệ đảm nhận, làm sở cho hoạt động hệ Cơ sở tri thức bao gồm kiện luật • Mơ tơ suy diễn: Làm nhiệm vụ sử lý điều khiển tri thức biểu diễn sở tri thức nhằm đáp ứng câu hỏi, yêu cầu người sử dụng (*) Để thực công việc thành phần cấu trúc hệ chuyên gia phải có hệ điều khiển quản lý việc tạo lập, tích lũy tri thức cho lĩnh vực hệ đảm nhận gọi “Hệ quản trị sở tri thức” Hệ quản trị sở tri thức thực chất quản lý điều khiển công việc Bộ thu nạp tri thức, Bộ giải thích, Mơ tơ suy diễn Nó phải đảm bảo yêu cầu : - Giảm dư thừa tri thức, liệu - Tính quán phi mâu thuẫn tri thức - Tính toàn vẹn an toàn - Giải vấn đề cạnh tranh - Chuyển đổi tri thức - Ngôn ngữ xử lý tri thức 1.5 Một số mô hình kiến trúc hệ chun gia 1.5.1 Mơ hình J.L.Ermine 1.5.2 1.5.2 1.5.2 1.5.2 1.5.2 1.5.2 Mơ hình C.Ernest 1.5.3 Mơ hình E.V.Popov Cơ sở tri thức 2.1 Phân biệt tri thức liệu Chúng ta dựa vào số đặc trưng sau để phân biệt qui ước tri thức liệu: • Khả tự giải thích nội dung: Dữ liệu đưa vào máy tính khơng tự giải thích nổi, đơi cịn mã hóa cho ngắn gọn để dễ cài đặt máy Chỉ có người lập trình hiểu nội dung, ý nghĩa liệu, tri thức tự giải thích nội dung với người sử dụng • Tính cấu trúc: Một đặc tính hoạt động nhận thức người giới xung quanh khả phân tích cấu trúc đối tượng Tri thức đưa vào máy cần có khả tạo phân cấp khái niệm mối quan hệ chúng • Tính liên hệ: Ngồi quan hệ cấu trúc tri thức (khái niệm, trình, tượng, kiện) đơn vị tri thức cịn có nhiều mối liên hệ khác (khơng gian, thời gian, nhân quả…) Một số nghiên cứu số liên hệ kiện xấp xỉ 200 lần Một sở tri thức kết hợp với số liên hệ mơ tả biểu diễn hầu hết vấn đề mà quan tâm • Tính chủ động: Như thấy, liệu có vai trị bị động phụ thuộc vào khai thác chương trình cụ thể Trong xã hội loài người hoạt động đâu lĩnh vực người bị điều khiển tri thức (vốn hiểu biết) Nhờ có tri thức mà người hình thành mục tiêu hành vi để thực mục tiêu Q trình ln kèm với bổ sung tri thức khắc phục mâu thuẫn tri thức để đến hoàn thiện dần sở tri thức người Đối với tri thức biểu diễn máy vậy, chúng chủ động hướng người sử dụng biết khai thác tri thức Đó q trình kích hoạt tri thức thể hệ chuyên gia xây dựng sở tri thức biểu diễn mức cao có khả tiếp nhận, tinh chế, tự hồn thiện q trình hoạt động hệ Tính chủ động tri thức cịn thể sinh động thông qua ngôn ngữ lập trình trí tuệ nhân tạo Lisp, Prolog…ở khơng cịn có phân biệt rõ ràng liệu thủ tục 2.2 Phân loại tri thức Tri thức tồn dạng bản: - Tri thức định lượng - Tri thức định tính Tri thức định lượng thường gắn với loại kinh nghiệm khác Ở xét tri thức định tính Tri thức định tính chia thành loại: - Tri thức mô tả - Tri thức thủ tục - Tri thức điều khiển 2.2.1 Tri thức mô tả Cho thông tin kiện, tượng hay q trình mà khơng đưa thơng tin cấu trúc bên phương pháp sử dụng bên tri thức Ví dụ: Khẳng định “Việt Nam đất nước tươi đẹp” Đây khẳng định bất biến, khơng phụ thuộc vào tình huống, khơng gian thời gian Các tri thức phụ thuộc không gian thời gian địi hỏi mơ hình biểu diễn 10 H = 0.5 Luật r3: 42 H = 0.25 43 Luật r4: 44 Vậy lượng nước cần dùng cho 2.5kg đồ 37.5% độ bẩn 60.321 (l) nước Thiết kế số giải thuật Thiết kế sử dụng giải thuật– áp dụng tập mờ hình thang với biểu diễn số: - Giải thuật tìm hàm thuộc: Đầu vào: tập mờ A = {a, b, c, d} Thông tin đối tượng x Đầu ra: Giá trị hàm thuộc float hamthuoc() { if( x < a || x > d) return 0; else if((b!=c && x = b) || (b == c && x == b)) return 1; else if( x = a) { if(b-a) return (x - a)/(b-a); else return -2;//-2 bị loại đưa vào hàm main } else if( x = c) { if(d-c)return (d - x)/(d-c); else return -2; } else return -2; } - Giải thuật tìm tử số, mẫu số luật tham gia: Đầu vào: lượng thuốc A={a, b, c, d} tương ứng với luật H = = x (giá trị hàm thuộc luật) Đầu ra: TU va MAU float timm (t, u, v) { z = abs(t-u); if(z) return v*z; else return 0; 45 } float timtu(h, m1, m2, t, u){ return (h/6)*(3*m2*m2 – 3*m1*m1 + u*u - t*t + 3*m2*u + 3*m1*a); } float timmau(h, m1, m2, t, u){ return (h/2)*(2*m2 – 2*m1 + t + u); } void timtumau() { ka = timm(a, b, x); m1= a + ka; kb = timm(c, d, x); m2= d - kb; TU = timtu(x, m1, m2, ka, kb); MAU = timmau(x, m1, m2, ka, kb); } 3.3 Cài đặt chương trình 3.4.1 Mơi trường cài đặt • • • • Ngơn ngữ cài đặt : C# Hệ điều hành : Windows 10 Nền tảng : NetFramework 3.0 Công cụ sử dụng : Visual Studio 2017 Để đảm bảo khả tương thích cao cho phiên kể cài đặt chương trình máy tính khác mà khơng bị lỗi, nhóm định sử dụng NetFramework 3.0 thay hơn, việc giúp chương trình cà đặt dễ dàng kể máy có cấu hình thấp cần hỗ trợ NetFramework 3.0 trở lên 46 3.4.2 Giao diện chương trình Tên điều khiển Loại điều khiển txtKhoiluong Textbox txtDoban Textbox txtLuongnuoc Textbox btnTinh Button btnClear Button Text Tính lượng nước Xóa 3.4.3 Mã nguồn chương trình 3.4.3.1 Khai báo biến lưu trữ hàm thuộc tập luật const int MIN_NHIET = 37; const int MIN_TUOI = 0; const int MAX_NHIET = 41; const int MAX_TUOI = 80; 47 Dictionary tap_mo = new Dictionary(); Dictionary tap_suy_dien = new Dictionary(); Dictionary tuoi = new Dictionary(); Dictionary nhiet = new Dictionary(); Dictionary thuoc = new Dictionary(); Dictionary luat = new Dictionary(); Dictionary doTuoi = new Dictionary(); Dictionary nhietDo = new Dictionary(); ArrayList tu = new ArrayList(); ArrayList mau = new ArrayList(); 3.4.3.2 Hàm khởi tạo public Form1() { InitializeComponent(); string[] age = { "TRE", "TN", "GIA" }; string[] temp = { "SN", "SC" }; string[] medicin = { "TT", "TB", "TC" }; tap_mo.Add("tuoi", age); tap_mo.Add("nhietdo", temp); tap_mo.Add("thuoc", medicin); /* Trẻ(0, 20, 20, 40) TN(20, 40, 40, 60) Già(40, 60, 60, 80) SN(37, 38, 38, 39) SC(38, 39, 41, 41) (Tuổi) (Nhiệt độ) TT(0, 20, 40, 60) TB(40, 60, 80, 100) TC(80, 100, 120, 120) (Đơn vị thuốc) */ float[] tuoiTre = { 0, 20, 20, 40 }; float[] trungNien = { 20, 40, 40, 60 }; float[] tuoiGia = { 40, 60, 60, 80 }; tuoi.Add("TRE", tuoiTre); tuoi.Add("TN", trungNien); tuoi.Add("TG", tuoiGia); float[] sotNhe = { 37, 38, 38, 39 }; float[] sotCao = { 38, 39, 41, 41 }; nhiet.Add("SN", sotNhe); nhiet.Add("SC", sotCao); 48 float[] thuocThap = { 0, 20, 40, 60 }; float[] thuocTB = { 40, 60, 80, 100 }; float[] thuocCao = { 80, 100, 120, 120 }; thuoc.Add("TT", thuocThap); thuoc.Add("TB", thuocTB); thuoc.Add("TC", thuocCao); /* 1.Nếu Tuổi = Trẻ Sốt = Nhẹ(SN) lượng thuốc = thấp(TT) 2.Nếu Tuổi = Trẻ Sốt = Cao(SC) lượng thuốc = trung bình(TB) 3.Nếu Tuổi = Trung Niên(TN) Sốt = Nhẹ lượng thuốc = trung bình 4.Nếu Tuổi = Trung niên Sốt = Cao lượng thuốc = cao(TC) 5.Nếu Tuổi = Già Sốt = Nhẹ lượng thuốc = trung bình 6.Nếu Tuổi = Già Sốt = Cao lượng thuốc = cao */ string[] r1 = { "TRE", "SN", "TT" }; string[] r2 = { "TRE", "SC", "TB" }; string[] r3 = { "TN", "SN", "TB" }; string[] r4 = { "TN", "SC", "TC" }; string[] r5 = { "TG", "SN", "TB" }; string[] r6 = { "TG", "SC", "TC" }; luat.Add("r1", r1); luat.Add("r2", r2); luat.Add("r3", r3); luat.Add("r4", r4); luat.Add("r5", r5); luat.Add("r6", r6); } 3.4.3 Mã nguồn chương trình public partial class Form1 : Form { public Form1() { InitializeComponent(); < Khai báo biến lưu trữ hàm thuộc tập luật > < Hàm khởi tạo> private float hamthuoc(float x, float[] mang) { float a = mang[0]; 49 float b = mang[1]; float c = mang[2]; float d = mang[3]; if (x = b) return 1; else if (x = a) { if (b - a != 0) return ((x - a) / (b - a)); else return 1; } else if (x = c) { if (d - c != 0) return (d - x) / (d - c); else return 1; } else return 0; } private float timm(float t, float u, float v) { float z = Math.Abs(t - u); if (z != 0) return v * z; else return 0; } private float timtu(float h, float m1, float m2, float t, float u) { return (h / 6) * (3 * m2 * m2 - * m1 * m1 + u * u - t * t + * m2 * u + * m1 * t); } private float timmau(float h, float m1, float m2, float t, float u) { return (h / 2) * (2 * m2 - * m1 + t + u); } void timtumau(float[] mang, float x) { float a = mang[0]; float b = mang[1]; 50 float c = mang[2]; float d = mang[3]; float ka = timm(a, b, x); float m1 = a + ka; float kb = timm(c, d, x); float m2 = d - kb; float TU = timtu(x, m1, m2, ka, kb); tu.Add(TU); float MAU = timmau(x, m1, m2, ka, kb); mau.Add(MAU); } private Boolean KiemTraDauVao(float tuoi_in, float nhiet_do_in, object sender, EventArgs e) { if (nhiet_do_in < || tuoi_in < 0) { MessageBox.Show("Tuổi nhiệt độ phải số thực dương."); return false; } else if (nhiet_do_in < MIN_NHIET) { MessageBox.Show("Bệnh nhân không bị sốt, không cần uống thuốc."); return false; } else if (tuoi_in < MIN_TUOI) { MessageBox.Show("Bệnh nhân trẻ, chuẩn đoán."); return false; } else if (tuoi_in > MAX_TUOI) { MessageBox.Show("Bệnh nhân tuổi để chuẩn đoán, khơng có liệu."); return false; } else if (nhiet_do_in > MAX_NHIET) { MessageBox.Show("Nhiệt độ q cao, khơng có liệu."); 51 return false; } return true; } private void btnCLear_Click(object sender, EventArgs e) { txtTuoi.Text = ""; txtNhietDo.Text = ""; txtLuongThuoc.Text = ""; } private void btnTinh_Click(object sender, EventArgs e) { float tuoi_input, nhietdo_input; try { tuoi_input = float.Parse(txtTuoi.Text.ToString()); nhietdo_input = float.Parse(txtNhietDo.Text.ToString()); if (KiemTraDauVao(tuoi_input, nhietdo_input, sender, e)) { nhietDo.Clear(); doTuoi.Clear(); //tinh ham thuoc float nhe = hamthuoc(nhietdo_input, nhiet["SN"]); if (nhe >= 0) nhietDo.Add("SN", nhe); float cao = hamthuoc(nhietdo_input, nhiet["SC"]); if (cao >= 0) nhietDo.Add("SC", cao); float tre = hamthuoc(tuoi_input, tuoi["TRE"]); if (tre >= 0) doTuoi.Add("TRE", tre); float tn = hamthuoc(tuoi_input, tuoi["TN"]); if (tn >= 0) doTuoi.Add("TN", tn); float gia = hamthuoc(tuoi_input, tuoi["TG"]); if (tn >= 0) doTuoi.Add("TG", gia); IDictionaryEnumerator contro = luat.GetEnumerator(); tap_suy_dien.Clear(); int dem = 0; while (contro.MoveNext()) 52 { string[] noi_dung = luat[contro.Key.ToString()]; float = 2; if (min > doTuoi[noi_dung[0]] && doTuoi[noi_dung[0]] >= 0) { = doTuoi[noi_dung[0]]; } if (min > nhietDo[noi_dung[1]] && nhietDo[noi_dung[1]] >= 0) { = nhietDo[noi_dung[1]]; } if (min > 0) { dem++; tap_suy_dien.Add(contro.Key.ToString(), min); } } if (dem == 0) { MessageBox.Show("Dữ liệu có khơng đủ để suy diễn."); } else { tu.Clear(); mau.Clear(); contro = tap_suy_dien.GetEnumerator(); while (contro.MoveNext()) { string luat_dung = contro.Key.ToString(); float ham_thuoc_luat = tap_suy_dien[luat_dung]; string[] noi_dung = luat[luat_dung]; string thuoc_gi = noi_dung[2]; timtumau(thuoc[thuoc_gi], ham_thuoc_luat); } float tu_so = 0, mau_so = 0; foreach (float i in tu) { tu_so += i; } foreach (float i in mau) { mau_so += i; } if (mau_so == 0) 53 { MessageBox.Show("Bệnh nhân không cần phải uống thuốc."); } else if (tu_so == 0) { MessageBox.Show("Bệnh nhân không cần phải uống thuốc."); } else { txtLuongThuoc.Text = (tu_so / mau_so).ToString(); } } } else { MessageBox.Show("Tuổi nhiệt độ không phù hợp."); } } catch (FormatException) { MessageBox.Show("Tuổi nhiệt độ phải số thực dương."); } catch (Exception a) { MessageBox.Show("Nhập sai định dạng có lỗi!" + a); } } } 3.4.4 Chạy chương trình 54 KẾT LUẬN Việc đưa liều lượng nước đầu với khối lượng độ bẩn có mục tiêu chương trình hướng đến, để từ ta tự động hóa điều khiện máy giặt giúp người tiện nghi 55 TÀI LIỆU THAM KHẢO Tiếng Việt [1] Trường Đại học Công nghiệp Hà Nội (2015), Giáo trình Hệ chuyên gia, NXB Khoa học Kỹ thuật [2] Bùi Công Cường (2001), N.D Phước, Hệ mờ, Mạng Nơron ứng dụng (Tuyển tập giảng), NXB Khoa học Kỹ thuật Tiếng Anh [3] I.H Kuo, et al, “An improved method for forecasting enrollments based on fuzzy time series and particle swarm optimization”, Expert systems with applications, 36 (2009) 6108–6117 [4] K Huarng , “Effective length of interval to improve forecasting in fuzzy time series”, Fuzzy set and Systems, (2001) vol 123, pp 387-394 [5] U Yolcu et Al, “A new approach for determining the length of intervals for fuzzy time series”, Applied Soft Computing , (2009) vol 9, pp 647-651 56 ... trình máy tính lại có khả giải toán chuyên gia người Mục tiêu ban đầu xây dựng hệ chuyên gia để hỗ trợ mà ta khơng có chun gia bên cạnh, nhờ sở tri thức mà hệ chuyên gia sử dụng tri thức chuyên gia. .. Tổng quan Hệ chuyên gia Tổng quan Hệ chuyên gia 1.1 Hệ chuyên gia gì? Hệ chuyên gia hệ thống chương trình máy tính chứa thơng tin, tri thức trình suy luận lĩnh vực cụ thể để giải vấn đề khó tốn... lớn? ??,)đặc trưng hàm thuộc j A i µ B j Khi j R quan hệ mờ từ tập mờ đầu vào X = X1 × X2 × × Xn tới tập mờ đầu Y 2.5 Động suy diễn Đây phận logic đưa định sử dụng hệ mờ để thực ánh xạ từ tập mờ

Ngày đăng: 12/02/2022, 11:57

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w