当前位置:文档之家› 动物专家识别系统

动物专家识别系统

运行环境:Windows XP + VC6.0逻辑:代码:#include <string>#include <vector>#include <iostream>#include <iomanip>#include <fstream>#include <stdlib.h>using namespace std;struct CAUSE_TYPE{ //事实string cause; //事实字符串描述bool flag; //是否已经使用,防止输入的事实重复//其他省略};struct RULE_TYPE{ //结论string result; //结论字符串描述vector<CAUSE_TYPE*> cause; //判断依据的事实int count; //结论的前件有多少个吻合bool finded; //是否匹配好所有前件//其他省略};class AniDist{public:bool load(string str); //根据文件创建结论队列和它们的事实,str为文件路径(知识获取机构)void clear(); //将所有结论的possible清零,所有flag清空RULE_TYPE* find(vector<string> str); //推理过程(推理机)vector<string> split(string str); //将输入的事实字符串转换为队列,字符串以空格分割(用于人机接口)void print(RULE_TYPE* rul); //打印判断的信息void print_table(); //打印从文件中读取的的结论队列void clearmem(); //清理内存friend bool operator !(AniDist ad);private:bool isload;vector<RULE_TYPE*> queue; //结论队列链表CAUSE_TYPE* create_cause(string str); //根据输入的字符串创建单个事实RULE_TYPE* create_rule(string str); //根据输入的字符串创建单个结论void findreasion(RULE_TYPE* rul); //(解释机构)};/*判断知识库有否问题*/bool operator !(AniDist ad){return !ad.isload;}//以下为类函数实现//以下是用于创建结论队列的函数/*//根据输入的字符串创建单个事实*/CAUSE_TYPE* AniDist::create_cause(string str){CAUSE_TYPE *tmp = new CAUSE_TYPE;tmp->cause = str;tmp->flag = false;return tmp;}/*//根据输入的字符串创建单个结论*/RULE_TYPE* AniDist::create_rule(string str){RULE_TYPE *tmp = new RULE_TYPE;tmp->result=str;tmp->count = 0;tmp->finded=false;return tmp;}/*//根据文件创建结论队列和它们的事实,str为文件路径*/bool AniDist::load(string str){isload = false;fstream fp; //从文件读取string readstr="";fp.open(str.c_str(),ios::in);if(!fp) return false;while(getline(fp,readstr)){if(readstr[0]=='#'){readstr.erase(readstr.begin());RULE_TYPE *tmp=NULL;tmp = create_rule(readstr);queue.push_back(tmp);}else{CAUSE_TYPE *tmp=NULL;tmp = create_cause(readstr);if (tmp == NULL) {exit(-1); }if(queue.size()!=0) queue[queue.size()-1]->cause.push_back(tmp);}}fp.close();isload = true;return true;}//以下是用于比对用的函数/*//将所有结论的possible清零,所有flag清空*/void AniDist::clear(){vector<RULE_TYPE*>::iterator itrR = queue.begin();vector<CAUSE_TYPE*>::iterator itrC;while(itrR!=queue.end()){itrC=(*itrR)->cause.begin();while(itrC!=(*itrR)->cause.end()){(*itrC)->flag=false;itrC++;}(*itrR)->count=0;(*itrR)->finded = false;itrR++;}}/*//根据输入的事实比对事实,注意第二中情况*/RULE_TYPE* AniDist::find(vector<string> strs){RULE_TYPE* result=NULL; //存放最终结论for (int i = 0; i != strs.size();i++){vector<RULE_TYPE*>::iterator itrR = queue.begin();vector<CAUSE_TYPE*>::iterator itrC;while (itrR != queue.end()){if ((*itrR)->finded) { itrR++; continue; }itrC = (*itrR)->cause.begin();while (itrC != (*itrR)->cause.end()){//前件与事实吻合if ((*itrC)->cause == strs[i] && (!(*itrC)->flag)){(*itrR)->count++;(*itrC)->flag = true;}itrC++;}//判断结论的前件是否都满足,如果满足,就加入strs进行判断if ((*itrR)->count == (*itrR)->cause.size()){(*itrR)->finded = true;result = (*itrR);strs.push_back((*itrR)->result);}itrR++;}}return result;}/*解释为何*/void AniDist::findreasion(RULE_TYPE* rul){vector<CAUSE_TYPE*>::iterator itrC = rul->cause.begin();//进行递归查找,效率低,可通过更改数据结构来改进while (itrC != rul->cause.end()){vector<RULE_TYPE*>::iterator itrR = queue.begin();while (itrR != queue.end()){if((*itrR)->finded){if ((*itrR)->result == (*itrC)->cause) findreasion((*itrR));}itrR++;}itrC++;}//输出结果itrC = rul->cause.begin();cout << "{ ";while (itrC != rul->cause.end()){cout << (*itrC)->cause << " ";itrC++;}cout << " } -> " << rul->result << endl;}/*//将输入的事实字符串转换为队列,字符串以空格分割*/vector<string> AniDist::split(string str){vector<string> strs;string::size_type pos=0;string::size_type prepos = 0;while (pos != string::npos){pos = str.find_first_of(' ', prepos);string tmp = str.substr(prepos, (pos-prepos));strs.push_back(tmp);prepos = pos+1;}return strs;}/*//打印判断的信息*/void AniDist::print(RULE_TYPE* rul){cout << "找到的结论是<" << rul->result<<'>'<<endl;findreasion(rul);}/*//打印从文件中读取的的结论队列*/void AniDist::print_table(){vector<RULE_TYPE*>::iterator itrR = queue.begin();vector<CAUSE_TYPE*>::iterator itrC;while(itrR!=queue.end()){cout<<setw(10)<<left<<(*itrR)->result<<" :\t";itrC=(*itrR)->cause.begin();while(itrC!=(*itrR)->cause.end()){cout<<setw(5)<<(*itrC)->cause<<'\t';itrC++;}itrR++;cout<<endl;}cout << endl;}/*//清理内存*/void AniDist::clearmem(){vector<RULE_TYPE*>::iterator itrR = queue.begin();vector<CAUSE_TYPE*>::iterator itrC;while(itrR!=queue.end()){itrC=(*itrR)->cause.begin();while(itrC!=(*itrR)->cause.end()){delete (*itrC);itrC++;}delete (*itrR);itrR++;}}int main(){AniDist ad;ad.load("data.txt");if (!ad) { cout << "知识库出错!" << endl; exit(-1); }ad.print_table();string instr = "";vector<string> strs;while (true){cout << "请输入事实,空格隔开:";getline(cin,instr);if (instr=="quit") break;strs = ad.split(instr);RULE_TYPE *re = ad.find(strs);if (re == NULL){ cout << "没有找到结论!" << endl; continue; }ad.print(re);ad.clear();}ad.clearmem();return 0;}数据(data.txt): #哺乳动物有奶胎生#鸟类翅膀羽毛#鸟类会飞下蛋#肉食动物吃肉#老虎哺乳动物条纹肉食动物#鸵鸟善跑鸟类#鸽子鸟类识路#家猫哺乳动物善爬条纹#豹猫哺乳动物善爬斑点纹运行结果:。

相关主题