JS实现动物专家系统(人工智能作业)

功能:

① 有若干选择动物的特征的选择列表
② 表现判断动物时,使用了哪些规则
③ 表现数据库的变化
④ 显示规则的调用次序
⑤ 显示最后结果,包含动物能被识别和不能识别
⑥ 至少检查两个例子实现正向推理和反向推理的区别

界面方面时间太短,没有设计。
在一个学长的原始代码上优化
@小菜鸡1027 点这里查看原代码


/ 代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>人工智能动物专家系统</title>
  <script type="text/javascript">
		var themeList = ["反刍","有蹄","哺乳动物","眼向前方",
						"有爪","犬齿","吃肉","会下蛋",
						"不能飞","有羽毛","有蹄类","食肉类",
						"鸟类","有奶","毛发","擅飞",
						"黑白色","会游泳","长腿","长脖子",
						"黑条纹","暗斑点","黄褐色","会飞"];
		var result = {
			'[15]':'哺乳动物',
			'[14]':'哺乳动物',
			'[10]':'鸟类',
			'[8,24]':'鸟类',
			'[7]':'食肉类',
			'[4,5,6]':'食肉类',
			'[2,3]':'有蹄类',   //哺乳+眼向前方——>11 有蹄子 
			'[1,3]':'有蹄类',
			'[3,7,22,23]':'金钱豹',
			'[3,7,21,23]':'虎',
			'[2,19,20,22]':'长颈鹿',
			'[2,21]':'斑马',
			'[9,13,17,19,20]':'鸵鸟',
			'[9,13,17,18]':'企鹅',
			'[13,16]':'信天翁'  // 鸟类+擅飞——>信天翁  会下蛋+会飞——>鸟类 
			//会下蛋+会飞+擅飞——>信天翁 8,16,24  8+24->13
		}
		var resultObj = {
			r1:[15],
			r2:[14],
			r3:[10],
			r4:[8,24],
			r5:[7],
			r6:[4,5,6],
			r7:[2,3],
			r8:[1,3],
			r9:[3,7,22,23], 
			r10:[3,7,21,23],
			r11:[2,19,20,22], 
			r12:[2,21],
			r13:[9,13,17,19,20],
			r14:[9,13,17,18],
			r15:[13,16]
		}
		window.onload=function(){
			init();
		}
	
		// 初始化界面
		function init(){
			var str = "";
			for(var i=0;i<themeList.length;i++){
				str += (i+1)+"-"+themeList[i];
				if((i+1)%3 == 0 || (i+1) == themeList.length){
					str += '</br>'
				}else{
					str += '&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp'
				}
			}
			document.getElementById('themeList').innerHTML = str; 
		}
		
		// 判断一个数组是不是包含另一个数组 包含返回true
		
		function isContained(aa, bb) {
	if(!(aa instanceof Array) || !(bb instanceof Array) || ((aa.length < bb.length))) {
		return false;
	}
	//var aaStr = aa.toString();
    /*for(var i = 0; i < bb.length; i++) {
		if(aaStr.indexOf(bb[i]) < 0) return false;
	}*/
	for (var i = 0; i < bb.length; i++) {
		var flag = false;
		for(var j = 0; j < aa.length; j++){
			if(aa[j] == bb[i]){
				flag = true;
                break;
			}
		}
		if(flag == false){
			return flag;
		}
	}
	
	return true;
}
		
		// 返回value值对应的key 没有返回undefined
		function findKey (obj,value, compare = (a, b) => a === b){
			return Object.keys(obj).find(k => compare(obj[k], value));
		}
		
    // 正向查找
		function check(){
			var flag = 0;
			// 把输入框内容放入arr
			var arr = document.getElementById('condion').value;
			// 求,的下标 如果没有就代表没有输入或只输入了一个数字
			if(arr.indexOf(",") != -1){
				// 默认拆分所有匹配到的内容,拆分成一个数组
				arr = arr.split(","); 
			}
			
			// 对输入的数据库进行输出 例子:3,7,22,23
			// ---------------------------------------
			var init = document.getElementById("init");
			var meddia = document.getElementById("media");
			var st=''; //如果不初始化 就会有undefined
				// 不是单个的话就遍历
			if(typeof(arr)!='string'){
				//console.log(arr);
				for(var s of arr){
					//console.log(s);
					st += themeList[s-1]+"        ";
				}
			}	
				// 是单个的情况 并把当个的也变为数组
			else{
				st = themeList[arr-1];
				arr = [arr];
			}
			init.innerHTML = "</br><span>用户输入的初始事实: </span>"+st;
			// ---------------------------------------
			
			// 中间的规则,动态跟新数据库  8,16,24 信天翁
			// 例子:15,7,22,23 应该变成3,7,22,23	 金钱豹
			var haschange = 1; 
			var change = 0; // 如果没有可扩展的就改为0
			while(haschange){
				for(var i=1;i<16;i++){
					var ch = 'r'+i; 
					var resultObjStr = resultObj[ch];
					// 查找匹配的规则
						// console.log(arr);
						// console.log(resultObjStr);
					if(isContained(arr,resultObjStr)){ 
						
						// 匹配上了,将规则加入数据库 比如匹配上了resultObjStr的15毛发 那把3哺乳加入数据库
						// 找到对应result的 汉字
						// console.log(resultObjStr+'');// 15
						// console.log(result['['+resultObjStr+']']); // 哺乳动物
						// console.log(themeList.indexOf(result['['+resultObjStr+']'])+1); // 3
					  var adar =(themeList.indexOf(result['['+resultObjStr+']'])+1)+'';	
						// 输出使用的规则
						//console.log(themeList[resultObjStr-1]); // 毛发
						// 把resultObjStr 数字全部取出来 放入rear
						var rear='';
						for(var t of resultObjStr){
							rear += " "+themeList[t-1];
						}
						change = 1;
						meddia.innerHTML += "</br></br><span>使用的规则:</span>"+rear+" "+result['['+resultObjStr+']'];
						// 把找到的加入数据库 15,7,22,23,3
						if(adar!=0){
						// 代表没直接推出动物
							arr.push(adar); 
						}else{
							var re = document.getElementById("result");
							re.innerHTML = "找到的结论是:"+result['['+resultObjStr+']'];
							return ;
						}
						
						haschange = 0;
					}else{
						// 没有扩展
						change = 0;
					}
					
					// 输出动态数据库,继续循环,直到没有可扩展的规则 例子:15,7,22,23
					var ST='';
					if(typeof(arr)!='string'){
						for(var s of arr){
								ST += themeList[s-1]+"        ";
							}
							console.log(arr);
						}
						if(change == 1){
							// 当有扩展才输出当前动态数据库
							meddia.innerHTML+="</br></br><span>当前动态数据库:"+ST+"</span>";
						}
						
					// ---------------------------------------
					// break;
				}
				haschange = 0;
			}
			
			// ----------------------------------------

			// 9,13,17,19,20
			// 对15个规则进行对比 例子:15,7,22,23
			for(var i=9;i<16;i++){
				var ch = 'r'+i; 
				var resultObjStr = resultObj[ch];
				
				if(typeof(arr)!='string'){
					arr = arr.sort(sortNumber);
				}
				if(isContained(arr,resultObjStr)){
							// 输入的规则正好对应动物 还要改进
							var STR='';
								for(var s of arr){
									STR += themeList[s-1]+"        ";
								}
							meddia.innerHTML +="</br></br><span>使用的规则:</span>"+STR;
							//********************* 
					flag = 1;
					console.log(result['['+resultObj[ch].toString()+']']);
					document.getElementById('result').innerHTML = "找到的结论是:"+result['['+resultObj[ch].toString()+']']; 
					return;
				}
			}
			if(flag == 0){
				document.getElementById('result').innerHTML = '未识别到动物'; 
			}
		}
		
    function sortNumber(a,b){
			return a - b;
		}

	  // 将charr设置为全局变量 用来接收找到的数组
    var charr ='';

    // 反向查找
		function	reversech(){
				// 反向查找 
				var initarr='';

				// 1.输入动物名 result
				var arr = document.getElementById('condion').value;
				initarr = arr;
				var init = document.getElementById("init");
				var media = document.getElementById("media");
				init.innerHTML = "</br><span>用户输入的初始事实: </span>"+arr;

				// 2.从result找到动物对应的数组  放入arr
				arr = findKey(result,arr);
				// slice()——截取部分元素返回
				arr = arr.slice(1,arr.length-1);
				arr = arr.split(","); 
				//console.log(arr); // ["3", "7", "21", "23"]
				// 2.1输出虎推出的规则
				var rear='';
						for(var t of arr){
							rear += " "+themeList[t-1];
						}
				media.innerHTML += "</br></br><span>使用的规则:"+initarr+" "+rear+"</span>";

				// 3.数组数字减一对应的中文 themeList
				var hach = 1;
				for(let i=0;i<arr.length;i++){

					// 4.分别对中文在result中找对应的数字加入到原数组 例子:虎
					//console.log(themeList[arr[i]-1]); 
          arr = find(i,result,arr,hach); 
          // 6. 检查还有没有对应的
          var newresult = result;


          newresult['['+charr+']'] = '';
          charr = findKey(newresult,themeList[arr[i]-1]);
          console.log(charr+''); // [8,24]
          // var rear1='';
          // media.innerHTML += "</br></br><span>使用的规则: "+themeList[arr[i]-1]+" </span>";

          if (typeof(charr) != "undefined"){ 
            
            //console.log(themeList[arr[i]-1]);
            find(i,newresult,arr,hach);
          }
				}
		}

    function find(i,result,arr,hach) {
          charr = findKey(result,themeList[arr[i]-1]);
					if (typeof(charr) != "undefined"){
          //console.log(charr); // [10]
					charr = charr.slice(1,charr.length-1);
          //console.log(charr); // 1
					charr = charr.split(",");
					arr = arr.concat(charr);	
					// 4.1 输出扩展的规则
					console.log(arr); // ["3", "7", "21", "23", "15"]
          

				  hach = 1; // 代表有扩展
					}else if(i != 0){
						hach = 0; // 代表没扩展
					}	

					// 5.当有扩展输出新的数组 
					var ST='';
					if(hach==1){
						for(var s of arr){
								ST += themeList[s-1]+"        ";
							}
						media.innerHTML+="</br></br><span>当前动态数据库:"+ST+"</span>";
					}
          return arr;
    }
	</script>
</head>
<body> 
  <h1>知识库</h1>
  <div id="themeList">
  </div>
  </br>
  输入已知知识的序号(输入序号,序号用英文逗号隔开)
  <input id="condion" type="text" value="" />
  <button type="button" id="first" onclick="check()">正向查找 </button>
  <button type="button" id="second" onclick="reversech()">反向查找 </button>
  </br>
  <div id="init">
  </div>
  </br>
  <div id="media">
  </div>
  </br>
  <div id="result">
  </div>
</body> 
</html>

运行结果截图:

金钱豹对应的规则是:3,7,22,23
信天翁对应的规则是:13,16
毛发能推出哺乳动物 15—>3
正向推导 直接得到动物:

①13,16 (对应 鸟类、擅飞)

在这里插入图片描述

②15 (对应 毛发)

在这里插入图片描述

③3,7,22,23 (对应 哺乳动物、吃肉、暗斑点、黄褐色)

在这里插入图片描述

需要扩展才能得到动物:
①8,16,24 (对应 会下蛋、擅飞、会飞) 8+24—>13 13+16—>信天翁

在这里插入图片描述

②15,7,22,23 (对应 毛发、吃肉、暗斑点、黄褐色) 15—>3 3+7+22+23—>虎

在这里插入图片描述

反向推到
①信天翁

在这里插入图片描述

②金钱豹

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值