动物识别专家系统

版权声明:order by csdn qq_38851897 https://blog.csdn.net/qq_38851897/article/details/80009747

一、本系统通过HTML+JavaScript语言实现,通过HTML5+CSS3设计页面的基本结构,并且加入了一些动画效果,JavaScript脚本语言则执行逻辑结构和触发事件。前台界面主要包括四部分:条件添加按钮框,综合数据库区,规则事例区,和匹配结果及分析过程区。

主界面
主界面

二、字符组主要分为三个:

(1)fact事实组,包括所有条件以及结论。

(2)rule规则数组,第0位为结果,其他位为条件,条件为空时值为0。

(3)con选定数组,包括自己选定的推理条件。

逻辑上在每个条件按钮中加入触发器按钮,当点击条件按钮后,按钮样式改变并且将该事实的值传到已经定义的字符数组con中,再次点击条件按钮代表取消该选项,则恢复原样式并且将其移出con组中。

三、当条件选择完毕后,将已经选定的con组与规则库中的规则rule组进行比较,比较的结果分为四种情况:

(1)con选定组与rule规则组完全一致,但结果并不是已知结果的七种,而是中间结果,这是弹窗提示用户是否要继续添加条件或者直接输出结果,继续添加条件后需要再次点击搜索按钮进行查找。(例如由有羽毛规则推理出来是鸟,这时会提示是否继续,继续后继续添加条件善飞,会输出最终结果信天鹰)

(2)con选定组与rule规则组完全一致,且结果为已知结果的七种,这时直接输出结果。(例如输入善飞和是鸟类,会直接输出信天鹰)

扫描二维码关注公众号,回复: 4630794 查看本文章

(3)con选定组与rule规则组不完全匹配但rule包含con组,这时会在提示用户该条件不完整和该规则还需要哪些条件。(例如输入是鸟类,会提示条件不完整,并给出该条件可能组成的规则:鸟类+善飞=信天鹰 鸟类+不会飞+长腿+有黑白二色=鸵鸟)

//具体每一条规则的判断函数
function match(a) {
	var i = 1,
		j = 0;
	var sum2 = 0;
	var flag = 0;
	var c = new Array(6);
	c[0] = 0;
	//把此规则非零的值赋给新的数组C
	if(used == 1) {
		for(i = 1; i <= 5; i++) {
			if(rule[a][i] != 0) {
				sum2++;
				c[i] = rule[a][i];
			}
			}
		for(i = 0; ne[i] < 100; i++) {
		//判断C数组中是否含有Con数组的值
			if(c.find(function(value) {
				if(value == ne[i]) {
					return true;
				}
			})) {} else //不包含直接退出循环
			return false;
			}
				return true;
			}
		for(i = 1; i <= 5; i++) {
			if(rule[a][i] != 0) {
				sum2++;
				c[i] = rule[a][i];
			}
		}
		//验证已选的CON函数是否符合rule规则
		for(i = 0; i < count; i++) {
			//判断C数组中是否含有Con数组的值
			if(c.find(function(value) {
				if(value == con[i]) {
				return true;
				}
			})) {
		} else //不包含直接退出循环
			return false;
	}
	//完全匹配
	if(count == sum2) {
		if(rule[a][0] < 25) {
			ne[0] = rule[a][0];
			return 3;
		}
		return true;
	}
	//非完全匹配
	else {
		return 2;
	}
}
//推断函数
function inference() {
	var end = ""; //最后输出的结果
	var flag = 0; //判断匹配类型
	var sum = 0; //判断符合条件的个数
	//对每一个规则进行遍历
	for(var i = 1; i <= rulenum; i++) {
		//完全匹配时
		if(match(i) == true) {
			flag = 1;
			end = fact[rule[i][0]]
			//把结果是怎样得来的条件输出 1+2=3
			document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[rule[i][0]];
			document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "<br>" + '符合R' + i + "规则  ";
			for(var j = 1; j <= 5; j++) {
				if(rule[i][j] != 0) {
					if(j == 1) {
						document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
					} else
						document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
				}
			}
			document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '=' + fact[rule[i][0]] + '<br>';
			break;
			}
		//相对匹配时
		if(match(i) == 2) {
			sum++;
			flag = 2;
			//第一次时输出
			if(sum == 1)
				document.getElementById('al').innerHTML = "条件不完整,根据已知条件:可能为以下公式,请继续选择条件<br>"
			//把结果是怎样得来的条件输出 1+2=3
			for(var j = 1; j <= 5; j++) {
				if(rule[i][j] != 0) {
				if(j == 1) {
					document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
					} else
					document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
				}
			}
			document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '=' + fact[rule[i][0]] + '<br>';
		}
		if(match(i) == 3) {
			used = 1;
			sum++;
			flag = 3;
			//第一次时输出
			if(sum == 1) {
				document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[rule[i][0]];
				document.getElementById('al').innerHTML = '暂时符合R' + i + ":";
				for(var j = 1; j <= 5; j++) {
					if(rule[i][j] != 0) {
					if(j == 1) {
						document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
					} else
						document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
					}
				}
				document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "=" + fact[rule[i][0]] + "<br>"
			}
			//把结果是怎样得来的条件输出 1+2=3
			var pre = rule[i][0];
			document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "目前为" + fact[pre] + "<br>结果可能为";
			for(var k = 9; k <= 15; k++) {
				for(var j = 1; j <= 5; j++) {
					if(pre == rule[k][j]) {
						document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + " " + fact[rule[k][0]];
						break;
					}
				}
			}
			if(confirm('推理结果为中间结果,您是否要继续添加条件') == false) {
				document.getElementById('result').innerHTML = fact[pre];
				document.getElementById('result').style.top = "65px";
				document.getElementById('al').innerHTML = '符合R' + i + ":";
				for(var j = 1; j <= 5; j++) {
					if(rule[i][j] != 0) {
						if(j == 1) {
							document.getElementById('al').innerHTML 
= document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
						} else
							document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
					}
				}
				document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "=" + fact[rule[i][0]] + "<br>"
			};
			count = 1;
			break;
		}
	}
	//不匹配
	if(flag == 0) {
		document.getElementById('al2').style.display = 'block';
		document.getElementById('result').innerHTML = '未知动物';
	}
	//完全匹配
	else if(flag == 1) {
		document.getElementById('al').style.display = 'block';
		document.getElementById('result').innerHTML = end;
		document.getElementById('result').style.top = "65px";
	}
	//相对匹配
	else if(flag == 2) {
		document.getElementById('al').style.display = 'block';
	} else if(flag == 3) {
		document.getElementById('al').style.display = 'block';
		}
	return 0;
}
function clickev(id) {
	//当没有这个ID值时,把id加入到CON数组中
	if(used == 1) {
		ne[1] = id;
		document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[id];
		document.getElementById(id).style.background = 'skyBlue';
		document.getElementById(id).style.color = 'white';
	} else {
		if(con.indexOf(id) == -1) {
			if(count >= 5) {
				alert('最多选择五个标签');
				return false;
			}
			document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[id];
			con[count] = id;
			count++;
			document.getElementById(id).style.background = 'skyBlue';
			document.getElementById(id).style.color = 'white';
		}
		//存在时 则为取消操作 删除掉此ID值
		else {
			con.splice(con.indexOf(id), 1);
			var word = document.getElementById('conclusion').innerHTML;
			word = word.replace(fact[id], "");
			document.getElementById('conclusion').innerHTML = word;
			document.getElementById(id).style.background = 'white';
			document.getElementById(id).style.color = 'black';
			count--;
		}
	}
}
//点击搜索后的开始推断的函数
function start() {
	document.getElementById('al').style.display = "none";
	document.getElementById('pro').style.width = '100%';
	inference();
}
//重置函数
function reset() {
	//将所有东西归零
	for(var id = 1; id < 25; id++) {
		con.splice(con.indexOf(id), 1);
		document.getElementById('al').innerHTML = "";
		document.getElementById(id).style.background = 'white';
		document.getElementById(id).style.color = 'black';
		document.getElementById('al').style.display = 'none';
		document.getElementById('al2').style.display = 'none';
		document.getElementById('pro').style.width = '0%';
		document.getElementById('result').innerHTML = "";
		document.getElementById('result').style.top = "-250px";

		document.getElementById('conclusion').innerHTML = "综合事实库:<br>";
	}
	count = 0;
}

(4)con选定组和rule规则组完全不匹配,这时提示用户规则库中无该规则,为未知动物。

四、当每次点击搜索匹配成功后,在提示框中都会提示该规则使用的条件和推理过程,在综合数据库中也会添加选择的条件选项。提供点击函数(clicked),重置函数(reset)以及执行推理函数(start),分别在点击条件、点击重置、点击搜索时使用。使页面的操作变得更加顺畅,选择错条件时可以再次点击该条件取消条件。

猜你喜欢

转载自blog.csdn.net/qq_38851897/article/details/80009747