C# winform 動物識別專家系統
1、功能需求
本例項完成的是人工智慧作業--簡單動物識別專家系統。要求能輸入一個或者多個特徵推理出結果,能有簡單的介面,對知識庫的修改等。需要的基礎知識有C#,winform, 以及對文字的簡單處理,陣列結構用的是陣列和字典。
2、介面設計
程式介面有兩個Form,一個是主視窗如圖1,一個是修改知識庫的視窗如圖2,設計都非常簡單,在此不用詳細給出具體啦。
圖1 Main.Form
圖2 Update.Form
3、資料準備
因為只是個簡單的案例,資料不多,因此資料採用的文字的形式如圖3,每行是一條規則,中間以空格隔開,最後一個是結果。
圖3 知識庫
4、程式碼實現
我的思想是,以每行資料的特徵為key,結果為value,然後獲取輸入的特徵,去遍歷知識庫,如果輸入的特徵有幾個在全部在一行知識裡,那麼把這幾個特徵移除並把這行知識的value新增到輸入的features中,按這個步驟,直到遍歷完知識庫,得到最後的結果。程式碼如下:
檔案讀寫類:FileUtil.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsAppAnimalRegonize
{
class FileUtils
{
//讀取檔案
public static string read_data(string data_path)
{
string text = null;
//【1】建立檔案流
FileStream fs = new FileStream(data_path, FileMode.Open);
//【2】建立讀取器
StreamReader sr = new StreamReader(fs, Encoding.Default);
//【3】以流的方式讀取資料
text = sr.ReadToEnd();
//【4】關閉讀取器
sr.Close();
//【5】關閉檔案流
fs.Close();
return text;
}
//寫入檔案
public static void save_update(string data_path,string text)
{
FileStream fs = new FileStream(data_path, FileMode.Create);
StreamWriter sw = new StreamWriter(fs, Encoding.Default);
sw.Write(text.Trim());
sw.Close();
fs.Close();
}
}
}
修改知識類:FormUpdate.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsAppAnimalRegonize
{
public partial class FormUpdate : Form
{
private string data_path = Environment.CurrentDirectory + "\\rule.txt";
public FormUpdate()
{
Console.WriteLine(data_path);
InitializeComponent();
textBox_update.Text = FileUtils.read_data(data_path);
}
private void button_save_Click(object sender, EventArgs e)
{
FileUtils.save_update(data_path,textBox_update.Text);
this.Close();
}
}
}
主類:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsAppAnimalRegonize
{
//一行事實bean類
{
private List<string> ls = null;
public RowFact(List<string> ls)
{
this.ls = ls;
}
public void setLs(List<string> ls)
{
this.ls = ls;
}
public List<string> getLs()
{
return this.ls;
}
}
public partial class Form1 : Form
{
private string data_path = Environment.CurrentDirectory + "\\rule.txt";
public Form1()
{
InitializeComponent();
}
private void button_update_Click(object sender, EventArgs e)
{
FormUpdate formUpdate = new FormUpdate();
formUpdate.Show();
}
//解析知識庫
private Dictionary<RowFact, string> parse_text(string text)
{
var array_facts = text.Split(Environment.NewLine.ToCharArray());
var dic_result = new Dictionary<RowFact, string>();
for (int i = 0; i < array_facts.Length; i++)
{
var fact_items = array_facts[i].Split(" ".ToCharArray());
var row_fact_list = new List<string>();
for (int j = 0; j < fact_items.Length; j++)
{
if (j == fact_items.Length - 1)
{
var row_fact = new RowFact(row_fact_list);
dic_result.Add(row_fact,fact_items[j]);
}
else
{
row_fact_list.Add(fact_items[j]);
}
}
}
return dic_result;
}
//推理過程
private void reasoning(List<string> features,Dictionary<RowFact,string> dict)
{
foreach (KeyValuePair<RowFact, string> pair in dict)
{
if (list_contains_list( pair.Key.getLs(),features) )
{
foreach (var item in pair.Key.getLs())
if (features.Contains(item))
{
features.Remove(item);
textBox_process.AppendText(item +"->");
}
if (!features.Contains(pair.Value))
{
features.Add(pair.Value);
textBox_process.AppendText(pair.Value);
textBox_process.AppendText("\n");
}
}
}
var temp_item = features[features.Count - 1];
foreach (var item in dict.Values)
{
if (item == temp_item)
{
label_result.Text = item;
return;
}
}
label_result.Text = "推理不出來";
}
//規則庫中的一行規則的特徵是否滿足輸入的特徵中的幾條
private bool list_contains_list(List<string> list1, List<string> list2)
{
bool is_contains = true;
if (list1.Count>list2.Count)
{
foreach (var item in list2)
{
if (!list1.Contains(item))
{
is_contains = false;
return is_contains;
}
}
}
else
{
foreach (var item in list1)
{
if (!list2.Contains(item))
{
is_contains = false;
return is_contains;
}
}
}
return is_contains;
}
private void button_search_Click(object sender, EventArgs e)
{
var input_features = textBox_features.Text.Split(Environment.NewLine.ToCharArray());
reasoning(input_features.ToList<string>(), parse_text(FileUtils.read_data(data_path)));
}
}
}
5、結果
修改和推理都能正確進行。輸入例子如圖4,每行為一個特徵。
圖4 測試結果