Cài đặt chương trình

Một phần của tài liệu BÁO CÁO BÀI TẬP LỚN THUỘC HỌC PHẦN: HỆ CHUYÊN GIA XÂY DỰNG HỆ CHUYÊN GIA DỰ ĐOÁN LƯỢNG THUỐC CẦN CẤP CHO BỆNH NHÂN DỰA TRÊN SUY DIỄN MỜ (Trang 46)

3. Mô tơ suy diễn

3.4. 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ả năng tương thích cao nhất cho các phiên bản kể cả khi cài đặt chương trình trên các máy tính khác mà không bị lỗi, nhóm đã quyết định sử dụng bản NetFramework 3.0 thay vì những bản mới hơn, việc này sẽ giúp chương trình được cà đặt dễ dàng hơn kể cả ở những máy có cấu hình thấp chỉ cần hỗ trợ NetFramework 3.0 trở lên.

3.4.2. Giao diện chương trình

Hình 3.1 Giao diện của chương trình

Tên điều khiển Loại điều khiển Text

txtTuoi Textbox

txtNhietDo Textbox

txtLuongThuoc Textbox

btnTinh Button Tính lượngthuốc

btnClear Button Xóa

3.4.3. Mã nguồn chương trình

3.4.3.1. Khai báo các biến lưu trữ hàm thuộc và tập luật

constint MIN_NHIET = 37; constint MIN_TUOI = 0; constint MAX_NHIET = 41;

constint MAX_TUOI = 80;

Dictionary<string, string[]> tap_mo = new Dictionary<string, string[]>(); Dictionary<string, float> tap_suy_dien = new Dictionary<string, float>(); Dictionary<string, float[]> tuoi = new Dictionary<string, float[]>(); Dictionary<string, float[]> nhiet = new Dictionary<string, float[]>(); Dictionary<string, float[]> thuoc = new Dictionary<string, float[]>(); Dictionary<string, string[]> luat = new Dictionary<string, string[]>(); Dictionary<string, float> doTuoi = new Dictionary<string, float>(); Dictionary<string, float> nhietDo = new Dictionary<string, float>(); 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) (Tuổi) SN(37, 38, 38, 39) SC(38, 39, 41, 41) (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);

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ẻ và Sốt = Nhẹ(SN) thì lượng thuốc = thấp(TT) 2.Nếu Tuổi = Trẻ và Sốt = Cao(SC) thì lượng thuốc = trung bình(TB) 3.Nếu Tuổi = Trung Niên(TN) và Sốt = Nhẹ thì lượng thuốc = trung bình 4.Nếu Tuổi = Trung niên và Sốt = Cao thì lượng thuốc = cao(TC)

5.Nếu Tuổi = Già và Sốt = Nhẹ thì lượng thuốc = trung bình 6.Nếu Tuổi = Già và Sốt = Cao thì 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

publicpartialclassForm1 : Form {

public Form1() {

InitializeComponent();

< Khai báo các biến lưu trữ hàm thuộc và tập luật>

< Hàm khởi tạo>

privatefloat hamthuoc(float x, float[] mang) {

float a = mang[0]; float b = mang[1]; float c = mang[2]; float d = mang[3]; if (x <= c && x >= b) return 1; elseif (x <= b && x >= a) { if (b - a != 0) return ((x - a) / (b - a)); elsereturn 1; } elseif (x <= d && x >= c) { if (d - c != 0) return (d - x) / (d - c); elsereturn 1; } elsereturn 0; }

privatefloat timm(float t, float u, float v) {

float z = Math.Abs(t - u); if (z != 0) return v * z; elsereturn 0;

}

privatefloat timtu(float h, float m1, float m2, float t, float u) {

return (h / 6) * (3 * m2 * m2 - 3 * m1 * m1 + u * u - t * t + 3 * m2 * u + 3 * m1 * t);

}

privatefloat timmau(float h, float m1, float m2, float t, float u) {

return (h / 2) * (2 * m2 - 2 * m1 + t + u); }

void timtumau(float[] mang, float x) {

float b = mang[1]; 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);

}

Hàm kiểm tra đầu vào tuổi và nhiệt độ.

Nếu tuổi và nhiệt độ nhỏ hơn 0 thì dữ liệu vào không hợp lệ.

Nếu nhiệt độ bệnh nhân nhỏ hơn nhiệt độ của cơ thể bình thường thì bệnh nhân không bị sốt.

Nếu tuổi bệnh nhân quá nhỏ hơn so với độ tuổi tiêu chuẩn để uống thuốc thì bệnh nhân quá trẻ, không thể chuẩn đoán.

Nếu tuổi bệnh nhân quá lớn hơn so với độ tuổi tiêu chuẩn để uống thuốc thì bệnh nhân quá tuổi, không thể chuẩn đoán.

Nếu nhiệt độ bệnh nhân quá cao so với nhiệt độ lớn nhất có thể chuẩn đoán thì sẽ không có dữ liệu.

privateBoolean KiemTraDauVao(float tuoi_in, float nhiet_do_in, object

sender, EventArgs e) {

if (nhiet_do_in < 0 || tuoi_in < 0) {

MessageBox.Show("Tuổi và nhiệt độ phải là số thực dương."); returnfalse;

}

elseif (nhiet_do_in < MIN_NHIET) {

MessageBox.Show("Bệnh nhân không bị sốt, không cần uống thuốc."); returnfalse;

}

elseif (tuoi_in < MIN_TUOI) {

MessageBox.Show("Bệnh nhân quá trẻ, không thể chuẩn đoán."); returnfalse;

}

elseif (tuoi_in > MAX_TUOI) {

MessageBox.Show("Bệnh nhân đã quá tuổi để chuẩn đoán, không có dữ liệu.");

returnfalse; }

elseif (nhiet_do_in > MAX_NHIET) {

MessageBox.Show("Nhiệt độ quá cao, không có dữ liệu."); returnfalse;

}

returntrue; }

Hàm xoá mới các dữ liệu nhập vào ở ô textbox.

privatevoid btnCLear_Click(object sender, EventArgs e) {

txtTuoi.Text = ""; txtNhietDo.Text = ""; txtLuongThuoc.Text = ""; }

Hàm tính lượng thuốc cho bệnh nhân.

Kiểm tra biến đầu vào hợp lệ ta sẽ tiến hành tính ham thuoc ta khai báo các biến nhe, cao, tre, tn, gia rồi thêm vào hàm nhietDo và doTuoi

Tiếp theo khởi tạo biến dem và chạy vòng lặp với điều kiện

contro.MoveNext() so sánh các biến ở trên với min = 2 để tìm ra số min và khi min lớn hơn 0 biến dem++ lặp cho đến kia kết thúc.

Nếu biến dem bằng 0 sẽ trả về kết quả không đủ dữ liệu để chuẩn đoán, ngược lại ta căn cứ vào tập luật để tính tử số và mẫu số.

Nếu mẫu số bằng 0 hoặc tử số bằng 0 thì bệnh không cần phải uống thuốc, ngược lại ta chia tứ số cho mẫu số rồi căn cứ tập luật để đưa ra thuốc cho bệnh nhân.

privatevoid 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()) {

string[] noi_dung = luat[contro.Key.ToString()]; float min = 2;

if (min > doTuoi[noi_dung[0]] && doTuoi[noi_dung[0]] >= 0) {

min = doTuoi[noi_dung[0]]; }

{ min = nhietDo[noi_dung[1]]; } if (min > 0) { dem++; tap_suy_dien.Add(contro.Key.ToString(), min); } } if (dem == 0) {

MessageBox.Show("Dữ liệu hiện 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)

{

MessageBox.Show("Bệnh nhân không cần phải uống thuốc."); }

elseif (tu_so == 0) {

MessageBox.Show("Bệnh nhân không cần phải uống thuốc."); }

{

txtLuongThuoc.Text = (tu_so / mau_so).ToString(); }

} } else

{

MessageBox.Show("Tuổi và nhiệt độ không phù hợp."); }

}

catch (FormatException) {

MessageBox.Show("Tuổi và nhiệt độ phải là số thực dương."); }

catch (Exception a) {

MessageBox.Show("Nhập sai định dạng hoặc có lỗi!" + a); }

} }

3.4.4. Chạy chương trình

KẾT LUẬN

Việc đưa ra một liều lượng thuốc tham khảo phù hợp với thể trạng bệnh nhân là mục tiêu chương trình hướng đến, để từ đó ta có thể tham khảo hoặc lấy thêm ý kiến từ chuyên gia để giúp việc điều trị đạt hiệu quả cao nhất.

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 và Kỹ thuật.

[2] Bùi Công Cường (2001), N.D. Phước, Hệ mờ, Mạng Nơron và ứng dụng (Tuyển tập các bài giảng), NXB Khoa học và 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.

Một phần của tài liệu BÁO CÁO BÀI TẬP LỚN THUỘC HỌC PHẦN: HỆ CHUYÊN GIA XÂY DỰNG HỆ CHUYÊN GIA DỰ ĐOÁN LƯỢNG THUỐC CẦN CẤP CHO BỆNH NHÂN DỰA TRÊN SUY DIỄN MỜ (Trang 46)

Tải bản đầy đủ (DOCX)

(57 trang)
w