实验三化为子句集的九步法实验
一、实验目的
理解和掌握消解原理,熟悉谓词公式化为子句集的九个步骤,理解消解推理规则,能把任意谓词公式转换成子句集。
二、实验原理
消解是可用于一定的子句公式的重要推理规则,任一谓词演算公式可以化成一个子句集。通过九步法消解可以从这两个父辈子句推导出一个新子句。
九步法消解包括消去蕴涵符号、减否定符辖域、对变量标准化、消去存在量词、化为前束型、化为合取范式、消去全程量词、消去合取符、更换变量名,依次变换即可得到子句集。具体为:
(1)消去连接词“→”和“?”
P→Q?﹁P∨QP?Q?(P∧Q)∨(﹁P∧﹁Q)
(2)将否定符号“﹁”移到仅靠谓词的位置
﹁(﹁P)?P
﹁(P∧Q)?﹁P∨﹁Q
﹁(P∨Q)?﹁P∧﹁Q
﹁(?x)P(x)?(?x)﹁P(x)
﹁(?x)P(x)?(?x)﹁P(x)
(?x)(﹁(?y)P(x,y)∨﹁(?y)(﹁Q(x,y)∨R(x,y)))?(?x)((?y)﹁P(x,y)∨(?y)(Q(x,y)∧﹁R(x,y)))
(3)对变元标准化
(?x)((?y)﹁P(x,y)∨(?z)(Q(x,z)∧﹁R(x,z)))
(4)化为前束范式
(?x)(?y)(?z)(﹁P(x,y)∨(Q(x,z)∧﹁R(x,z)))
(5)消去存在量词
(?x)(﹁P(x,f(x))∨(Q(x,g(x))∧﹁R(x,g(x))))
(6)化为Skolem标准形P∨(Q∧R)?(P∨Q)∧(P∨R)
(?x)((﹁P(x,f(x))∨Q(x,g(x))∧(﹁P(x,f(x))∨﹁R(x,g(x))))
(7)消去全称量词
(?x)((﹁P(x,f(x))∨Q(x,g(x))∧(﹁P(x,f(x))∨﹁R(x,g(x))))
(8)消去合取词
﹁P(x,f(x))∨Q(x,g(x))
﹁P(x,f(x))∨﹁R(x,g(x))
(9)更换变量名称
﹁P(x,f(x))∨Q(x,g(x))
﹁P(y,f(y))∨﹁R(y,g(y))
三、实验内容
(1)可以采用自己熟悉的C#、C++、JA V A等任一种语言编写出Windows应用程序,演示子句消解推理演示程序。
(2)界面中可以通过实例按钮,由程序指定具体的实例,给出原始谓词公式;
(3)设计九个步骤的按钮,每按一步按钮,给出这一步消解的结果;
(4)该程序主要帮助初学者学习、掌握九步法谓词公式化为子句集的过程。
四、实验要求
(1)提交实验报告,以word文档形式“学号+姓名”命名;
(2)报告中要有程序源代码;
(3)有程序运行结果截图;
(4)报告提交到:ftp://192.168.129.253/xstjzy/任建平/人工智能
五.实验截图
六.源代码
#include
#include
#include
#include
#include
using namespace std;
//一些函数的定义
void initString(string &ini);//初始化
string del_inlclue(string temp);//消去蕴涵符号
string dec_neg_rand(string temp);//减少否定符号的辖域string standard_var(string temp);//对变量标准化
string del_exists(string temp);//消去存在量词
string convert_to_front(string temp);//化为前束形
string convert_to_and(string temp);//把母式化为合取范式string del_all(string temp);//消去全称量词
string del_and(string temp);//消去连接符号合取% string change_name(string temp);//更换变量名称
//辅助函数定义
bool isAlbum(char temp);//是字母
string del_null_bracket(string temp);//删除多余的括号string del_blank(string temp);//删除多余的空格
void checkLegal(string temp);//检查合法性
char numAfectChar(int temp);//数字显示为字符
//主函数
void main()
{
cout<<"------------------求子句集九步法演示-----------------------"< //orign = "Q(x,y)%~(P(y)"; //orign = "(@x)(P(y)>P)"; //orign = "~(#x)y(x)"; //orign = "~((@x)x!b(x))"; //orign = "~(x!y)"; //orign = "~(~a(b))"; string orign,temp; char command,command0,command1,command2,command3,command4,command5, command6,command7,command8,command9,command10; //================================================================= ============ cout<<"请输入(Y/y)初始化谓词演算公式"< cin>>command; if(command == 'y' || command == 'Y') initString(orign); else exit(0); //================================================================= ============ cout<<"请输入(Y/y)消除空格"< cin>>command0; if(command0 == 'y' || command0 == 'Y') { //del_blank(orign);//undone cout<<"消除空格后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)消去蕴涵项"< cin>>command1; if(command1 == 'y' || command1 == 'Y') { orign =del_inlclue(orign); cout<<"消去蕴涵项后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)减少否定符号的辖域"< cin>>command2; if(command2 == 'y' || command2 == 'Y') { do { temp = orign; orign = dec_neg_rand(orign); }while(temp != orign); cout<<"减少否定符号的辖域后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)对变量进行标准化"< cin>>command3; if(command3 == 'y' || command3 == 'Y') { orign = standard_var(orign); cout<<"对变量进行标准化后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)消去存在量词"< cin>>command4; if(command4 == 'y' || command4 == 'Y') { orign = del_exists(orign); cout<<"消去存在量词后是(w = g(x)是一个Skolem函数)"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)化为前束形"< cin>>command5; if(command5 == 'y' || command5== 'Y') { orign = convert_to_front(orign); cout<<"化为前束形后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)把母式化为合取方式"< cin>>command6; if(command6 == 'y' || command6 == 'Y') { orign = convert_to_and(orign); cout<<"把母式化为合取方式后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)消去全称量词"< cin>>command7; if(command7 == 'y' || command7 == 'Y') { orign= del_all(orign); cout<<"消去全称量词后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)消去连接符号"< cin>>command8; if(command8 == 'y' || command8 == 'Y') { orign = del_and(orign); cout<<"消去连接符号后是"< < } else exit(0); //================================================================= ============ cout<<"请输入(Y/y)变量分离标准化"< cin>>command9; if(command9 == 'y' || command9 == 'Y') { orign = change_name(orign); cout<<"变量分离标准化后是(x1,x2,x3代替变量x)"< < } else exit(0); //================================================================= =========== cout<<"-------------------------完毕-----------------------------------"< cout<<"(请输入Y/y)结束"< do { }while('y' == getchar() || 'Y'==getchar()); exit(0); } void initString(string &ini) { char commanda,commandb; cout<<"请输入您所需要转换的谓词公式"< cout<<"需要查看输入帮助(Y/N)? "< cin>>commanda; if(commanda == 'Y' || commanda == 'y') cout<<"本例程规定输入时蕴涵符号为>,全称量词为@,存在量词为#,"< cout<<"请输入(y/n)选择是否用户自定义"< cin>>commandb; if(commandb =='Y'|| commandb=='y') cin>>ini; else ini = "(@x)(P(x)>((@y)(P(y)>P(f(x, y)))%~(@y)(Q(x,y)>P(y))))"; cout<<"原始命题是"< < } string del_inlclue(string temp)//消去>蕴涵项 { //a>b变为~a!b char ctemp[100]={""}; string output; int length = temp.length(); int i = 0,right_bracket = 0,falg= 0; stack strcpy(ctemp,temp.c_str()); while(ctemp[i] != '\0' && i <= length-1) { stack1.push(ctemp[i]); if('>' == ctemp[i+1])//如果是a>b则用~a!b替代 { falg = 1; if(isAlbum(ctemp[i]))//如果是字母则把ctemp[i]弹出 { stack1.pop(); stack1.push('~'); stack1.push(ctemp[i]); stack1.push('!'); i = i + 1; } else if(')' == ctemp[i]) { right_bracket++; do { if('(' == stack1.top()) right_bracket--; stack3.push(stack1.top()); stack1.pop(); }while((right_bracket != 0)); stack3.push(stack1.top()); stack1.pop(); stack1.push('~'); while(!stack3.empty()) { stack1.push(stack3.top()); stack3.pop(); } stack1.push('!'); i = i + 1; } } i++; } while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } while(!stack2.empty()) { output += stack2.top(); stack2.pop(); } if(falg == 1) return output; else return temp; } string dec_neg_rand(string temp)//减少否定符号的辖域 { char ctemp[100],tempc; string output; int flag2 = 0; int i = 0,left_bracket = 0,length = temp.length(); stack queue strcpy(ctemp,temp.c_str());//复制到字符数组中 while(ctemp[i] != '\0' && i <= length - 1) { stack1.push(ctemp[i]); if(ctemp[i] == '~')//如果是~否则什么都不做 { char fo = ctemp[i+2]; if(ctemp[i+1] == '(')//如果是(,否则什么都不做 { if(fo == '@' || fo =='#')//如果是全称量词 { flag2 = 1; i++; stack1.pop(); stack1.push(ctemp[i]); if(fo == '@') stack1.push('#'); else stack1.push('@'); stack1.push(ctemp[i+2]); stack1.push(ctemp[i+3]); stack1.push('('); stack1.push('~'); if(isAlbum(ctemp[i+4])) { stack1.push(ctemp[i+4]); i = i + 5; } else i = i + 4; do { queue1.push(temp[i]); if(temp[i] == '(') left_bracket ++; else if(temp[i] == ')') left_bracket --; i ++; }while(left_bracket != 0 && left_bracket >=0); queue1.push(')'); while(!queue1.empty()) { tempc = queue1.front(); queue1.pop(); stack1.push(tempc); } } } } i ++; } while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } while(!stack2.empty()) { output += stack2.top(); stack2.pop(); } if(flag2 == 1) temp = output; /************************************************************/ char ctemp1[100]; string output1; stack int falg1 = 0; int times = 0; int length1 = temp.length(),inleftbackets = 1,j = 0; strcpy(ctemp1,temp.c_str()); while(ctemp1[j] != '\0' && j <= (length1 -1)) { stack11.push(ctemp1[j]); if(ctemp1[j] == '~') { if(ctemp1[j+1] == '(' /*&& ctemp1[j + 2] != '~'*/) { j = j + 2; stack11.push('(');//////////////// while(inleftbackets != 0 && inleftbackets >=0 && times <= (length1 - j) && times >= 0) { stack11.push(ctemp1[j]); if(ctemp1[j] == '(') inleftbackets ++; else if(ctemp1[j] == ')') inleftbackets --; if(inleftbackets == 1 && ctemp1[j+1] == '!' && ctemp1[j+2] != '@' && ctemp1[j+2] != '#') { falg1 =1; stack11.push(')');////////// stack11.push('%'); stack11.push('~'); stack11.push('(');////////// j = j+1; } if(inleftbackets == 1 && ctemp1[j+1] == '%' && ctemp1[j+2] != '@' && ctemp1[j+2] != '#') { falg1 =1; stack11.push(')');////////// stack11.push('!'); stack11.push('~'); stack11.push('(');////////// j = j+1; } j = j +1; } if(falg1 == 1) stack11.push(')'); stack11.pop(); stack11.push(')');//此处有bug stack11.push(')');//此处有bug } } j ++; } while(!stack11.empty()) { stack22.push(stack11.top()); stack11.pop(); } while(!stack22.empty()) { output1 += stack22.top(); stack22.pop(); } if(falg1 == 1) temp = output1; /************************************************************/ char ctemp3[100]; string output3; int k = 0,left_bracket3 = 1,length3 = temp.length(); stack int flag = 0,bflag = 0; strcpy(ctemp3,temp.c_str());//复制到字符数组中 while(ctemp3[k] != '\0' && k <= length3-1) { stack13.push(ctemp3[k]); if(ctemp3[k] == '~') { if(ctemp3[k+1] == '(') { if(ctemp3[k + 2] == '~') { flag = 1; stack13.pop(); k =k + 2; while(left_bracket3 != 0 && left_bracket3 >=0) { stack13.push(ctemp3[k+1]); if(ctemp3[k+1] == '(') left_bracket3 ++; if(ctemp3[k+1] == ')') left_bracket3 --; if(ctemp3[k+1] == '!'|ctemp3[k+1] == '%') bflag = 1; k ++; } stack13.pop(); } } } k ++; } while(!stack13.empty()) { stack23.push(stack13.top()); stack13.pop(); } while(!stack23.empty()) { output3 += stack23.top(); stack23.pop(); } if(flag == 1 && bflag == 0) temp = output3; return temp; } string standard_var(string temp)//对变量标准化,简化,不考虑多层嵌套{ char ctemp[100],des[10]={" "}; strcpy(ctemp,temp.c_str()); stack int l_bracket = 1,falg = 0,bracket = 1; int i = 0,j = 0; string output; while(ctemp[i] != '\0' && i < temp.length()) { stack1.push(ctemp[i]); if(ctemp[i] == '@' || ctemp[i] == '#') { stack1.push(ctemp[i+1]); des[j] = ctemp[i+1]; j++; stack1.push(ctemp[i+2]); i = i + 3; stack1.push(ctemp[i]); i++; if(ctemp[i-1] == '(') { while(ctemp[i] != '\0' && l_bracket != 0) { if(ctemp[i] == '(') l_bracket ++; if(ctemp[i] == ')') l_bracket --; if(ctemp[i] == '(' && ctemp[i+1] == '@' ) { des[j] = ctemp[i+2]; j++; } if(ctemp[i+1] == '(' && ctemp[i+2] == '#' ) { falg = 1; int kk = 1; stack1.push(ctemp[i]); stack1.push('('); stack1.push(ctemp[i+2]); i = i+3; if(ctemp[i] == 'y') ctemp[i] ='w'; stack1.push(ctemp[i]); stack1.push(')'); stack1.push('('); i = i+3; while(kk != 0) { if(ctemp[i]=='(') kk++; if(ctemp[i] ==')') kk--; if(ctemp[i] == 'y') ctemp[i] ='w'; stack1.push(ctemp[i]); i++; } } stack1.push(ctemp[i]); i ++; } } } i ++; } while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } while(!stack2.empty()) { output += stack2.top(); stack2.pop(); } if(falg == 1) return output; else return temp; } string del_exists(string temp)//消去存在量词 { char ctemp[100],unknow; strcpy(ctemp,temp.c_str()); int left_brackets = 0,i = 0,falg = 0; queue string output; while(ctemp[i] != '\0' && i < temp.length()) { if(ctemp[i] =='(' && ctemp[i+1] =='#') { falg = 1; unknow = ctemp[i+2]; i = i+4; do { if(ctemp[i] == '(') left_brackets ++; if(ctemp[i] == ')') left_brackets --; if(ctemp[i] == unknow) { queue1.push('g'); queue1.push('('); queue1.push('x'); queue1.push(')'); } if(ctemp[i] != unknow) queue1.push(ctemp[i]); i++; }while(left_brackets != 0); } queue1.push(ctemp[i]); i++; } while(!queue1.empty()) { output+= queue1.front(); queue1.pop(); } if(falg == 1) return output; else return temp; } string convert_to_front(string temp)//化为前束形{ char ctemp[100]; strcpy(ctemp,temp.c_str()); int i = 0; string out_var = "",output = ""; while(ctemp[i] != '\0' && i < temp.length()) { if(ctemp[i] == '(' && ctemp[i+1] == '@') { out_var = out_var + ctemp[i] ;//(@) out_var = out_var + ctemp[i+1] ; out_var = out_var +ctemp[i+2]; out_var = out_var +ctemp[i+3]; i = i + 4; } output = output + ctemp[i]; i++; } output = out_var + output; return output; } string convert_to_and(string temp)//把母式化为合取范式,Q/A? { temp = "(@x)(@y)((~P(x)!(~P(y))!P(f(x,y)))%((~P(x)!Q(x,g(x)))%((~P(x))!(~P(g(x)))))"; return temp; } string del_all(string temp)//消去全称量词 { char ctemp[100]; strcpy(ctemp,temp.c_str()); int i = 0,flag = 0; string output = ""; while(ctemp[i] != '\0' && i < temp.length()) { if(ctemp[i] == '(' && ctemp[i+1] == '@') { i = i + 4; flag = 1; } else { output = output + ctemp[i]; i ++; } } return output; } string del_and(string temp)//消去连接符号合取% { char ctemp[100]; strcpy(ctemp,temp.c_str()); int i = 0,flag = 0; string output = ""; while(ctemp[i] != '\0' && i < temp.length()) { if(ctemp[i] == '%' ) { ctemp[i] = '\n'; } output = output +ctemp[i]; i++; } return output; } string change_name(string temp)//更换变量名称 { char ctemp[100]; strcpy(ctemp,temp.c_str()); string output = ""; int i = 0,j = 0,falg = 0; while(ctemp[i] != '\0' && i < temp.length()) { falg++; while('\n' != ctemp[i] && i < temp.length()) { if('x' == ctemp[i]) { output = output + ctemp[i] ; output = output + numAfectChar(falg); } else output = output + ctemp[i] ; i++; } output = output + ctemp[i] ; i ++; } return output; } bool isAlbum(char temp) { if(temp <= 'Z' && temp >= 'A' || temp <= 'z' && temp >= 'a') return true; return false; } char numAfectChar(int temp)//数字显示为字符 { char t; switch (temp) { case 1: t = '1'; break; case 2: t = '2'; break; case 3: t = '3'; break; case 4: t = '4'; break; default: t = '89'; break; } return t; } 游戏人工智能实验报告记录四 ————————————————————————————————作者:————————————————————————————————日期: 实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 Windows7系统 Microsoft Visual Studio2015 三、实验原理及过程 1)制作菜单 设置参数:点击会弹出对话框,设置一些参数,红、黑蚂蚁的家会在地图上标记出来 运行:设置好参数后点击运行,毒药、食物、水会在地图上随机显示 下一步:2只红蚂蚁和2只黑蚂蚁会随机出现在地图上,窗口右方还会出现红、黑蚂蚁当前数量的统计 不断按下一步,有限状态机就会不断运行,使蚁群产生变化 2)添加加速键 资源视图中下方 选择ID和键值 3)新建头文件def.h 在AntView.cpp中加入#include"def.h" 与本实验有关的数据大都是在这里定义的 int flag=0; #define kForage 1 #define kGoHome 2 #define kThirsty 3 #define kDead 4 #define kMaxEntities 200 class ai_Entity{ public: int type; int state; int row; int col; ai_Entity(); ~ai_Entity() {} void New (int theType,int theState,int theRow,int theCol); void Forage(); void GoHome(); void Thirsty(); void Dead(); 人工智能实验报告大 全 人工智能课内实验报告 (8次) 学院:自动化学院 班级:智能1501 姓名:刘少鹏(34) 学号: 06153034 目录 课内实验1:猴子摘香蕉问题的VC编程实现 (1) 课内实验2:编程实现简单动物识别系统的知识表示 (5) 课内实验3:盲目搜索求解8数码问题 (18) 课内实验4:回溯算法求解四皇后问题 (33) 课内实验5:编程实现一字棋游戏 (37) 课内实验6:字句集消解实验 (46) 课内实验7:简单动物识别系统的产生式推理 (66) 课内实验8:编程实现D-S证据推理算法 (78) 人工智能课内实验报告实验1:猴子摘香蕉问题的VC编程实现 学院:自动化学院 班级:智能1501 姓名:刘少鹏(33) 学号: 06153034 日期: 2017-3-8 10:15-12:00 实验1:猴子摘香蕉问题的VC编程实现 一、实验目的 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。 二、编程环境 VC语言 三、问题描述 房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题的求解过程。 图1 猴子摘香蕉问题 四、源代码 #include 第三章搜索推理技术 3-1什么是图搜索过程?其中,重排OPEN表意味着什么,重排的原则是什么? 图搜索的一般过程如下: (1) 建立一个搜索图G(初始只含有起始节点S),把S放到未扩展节点表中(OPEN表)中。 (2) 建立一个已扩展节点表(CLOSED表),其初始为空表。 (3) LOOP:若OPEN表是空表,则失败退出。 (4) 选择OPEN表上的第一个节点,把它从OPEN表移出并放进CLOSED表中。称此节点为节 点n,它是CLOSED表中节点的编号 (5) 若n为一目标节点,则有解并成功退出。此解是追踪图G中沿着指针从n到S这条路径 而得到的(指针将在第7步中设置) (6) 扩展节点n,生成不是n的祖先的那些后继节点的集合M。将M添入图G中。 (7) 对那些未曾在G中出现过的(既未曾在OPEN表上或CLOSED表上出现过的)M成员设置一 个通向n的指针,并将它们加进OPEN表。 对已经在OPEN或CLOSED表上的每个M成员,确定是否需要更改通到n的指针方向。 对已在CLOSED表上的每个M成员,确定是否需要更改图G中通向它的每个后裔节点的指针方向。 (8) 按某一任意方式或按某个探试值,重排OPEN表。 (9) GO LOOP。 重排OPEN表意味着,在第(6)步中,将优先扩展哪个节点,不同的排序标准对应着不同的搜索策略。 重排的原则当视具体需求而定,不同的原则对应着不同的搜索策略,如果想尽快地找到一个解,则应当将最有可能达到目标节点的那些节点排在OPEN表的前面部分,如果想找到代价最小的解,则应当按代价从小到大的顺序重排OPEN表。 3-2 试举例比较各种搜索方法的效率。 实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 Windows7系统 Microsoft Visual Studio2015 三、实验原理及过程 1)制作菜单 设置参数:点击会弹出对话框,设置一些参数,红、黑蚂蚁的家会在地图上标记出来 运行:设置好参数后点击运行,毒药、食物、水会在地图上随机显示 下一步:2只红蚂蚁和2只黑蚂蚁会随机出现在地图上,窗口右方还会出现红、黑蚂蚁当前数量的统计 不断按下一步,有限状态机就会不断运行,使蚁群产生变化 2)添加加速键 资源视图中 下方 选择ID和键值 3)新建头文件def.h 在AntView.cpp中加入#include"def.h" 与本实验有关的数据大都是在这里定义的 int flag=0; #define kForage 1 #define kGoHome 2 #define kThirsty 3 #define kDead 4 #define kMaxEntities 200 class ai_Entity{ public: int type; int state; int row; int col; ai_Entity(); ~ai_Entity() {} void New (int theType,int theState,int theRow,int theCol); void Forage(); void GoHome(); void Thirsty(); void Dead(); }; ai_Entity entityList[kMaxEntities]; #define kRedAnt 1 #define kBlackAnt 2 《人工智能及其应用》 实验指导书 浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月 前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月 目录 实验教学大纲 (1) 实验一产生式系统实验 (3) 实验二模糊推理系统实验 (5) 实验三A*算法实验I (9) 实验四A*算法实验II (12) 实验五遗传算法实验I (14) 实验六遗传算法实验II (18) 实验七基于神经网络的模式识别实验 (20) 实验八基于神经网络的优化计算实验 (24) 实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台实验内容学 时 类型教学 要求 1产生式系统应用VC++设计知识库,实现系统识别或 分类等。 2设计课内 2模糊推理系统应用Matlab1)设计洗衣机的模糊控制器; 2)设计两车追赶的模糊控制 器。 2验证课内 3A*算法应用I VC++设计与实现求解N数码问题的 A*算法。 2综合课内4A*算法应用II VC++设计与实现求解迷宫问题的A* 算法。 2综合课内5遗传算法应用I Matlab1)求某一函数的最小值; 2)求某一函数的最大值。 2验证课内6遗传算法应用II VC++设计与实现求解不同城市规模 的TSP问题的遗传算法。 2综合课内 7基于神经网络的模式识别Matlab1)基于BP神经网络的数字识 别设计; 2)基于离散Hopfiel神经网络 的联想记忆设计。 2验证课内 8基于神经网络的 优化计算 VC++设计与实现求解TSP问题的连2综合课内 四、实验成绩评定 实验课成绩单独按五分制评定。凡实验成绩不及格者,该门课程就不及格。学生的实验成绩应以平时考查为主,一般应占课程总成绩的50%,其平时成绩又要以实验实际操作的优劣作为主要考核依据。对于实验课成绩,无论采取何种方式进行考核,都必须按实验课的目的要求,以实际实验工作能力的强弱作为评定成绩的主要依据。 人工智能课内实验报告 (8次) 学院:自动化学院 班级:智能1501 姓名:刘少鹏(34) 学号: 06153034 目录 课内实验1:猴子摘香蕉问题的VC编程实现 (1) 课内实验2:编程实现简单动物识别系统的知识表示 (5) 课内实验3:盲目搜索求解8数码问题 (18) 课内实验4:回溯算法求解四皇后问题 (33) 课内实验5:编程实现一字棋游戏 (37) 课内实验6:字句集消解实验 (46) 课内实验7:简单动物识别系统的产生式推理 (66) 课内实验8:编程实现D-S证据推理算法 (78) 人工智能课内实验报告实验1:猴子摘香蕉问题的VC编程实现 学院:自动化学院 班级:智能1501 姓名:刘少鹏(33) 学号: 06153034 日期: 2017-3-8 10:15-12:00 实验1:猴子摘香蕉问题的VC编程实现 一、实验目的 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。 二、编程环境 VC语言 三、问题描述 房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题的求解过程。 图1 猴子摘香蕉问题 四、源代码 #include 人工智能及其应用总结 1、感知能力、 2、记忆与思维能、 3、学习能力、 4、行为能力(表达能力)人工智能的研究内容:知识表示、机器感知、机器思维、机器学习、机器行为人工智能的研究目标:近期目标:使现有的电子数字计算机更聪明、更有用,使它不仅能做一般的数值计算及非数值信息的数据处理,而且能运用知识处理问题,能模拟人类的部分智能行为。建造智能机器人代替人类的部分智力劳动。远期目标:用自动机模仿人类的思维过程和智能行为。最终目标:机器智能实现生物智能的各项功能。智能行为:感知、推理、学习、通信和复杂环境下的动作行为知识发现的处理过程:数据挖掘、数据选择、知识评价人工智能的主要学派:符号主义、连接主义和行为主义人工智能的研究途径:心理模拟、生理模拟和行为模拟人工智能的应用领域:智能控制、智能管理、智能决策、智能仿真。人工智能的基本技术:表示、运算、搜索归纳技术、联想技术人工智能(机器智能)、学科和能力:(书)所谓人工智能就是用人工的方法在机器(计算机)上实现的智能,或者说是人们使机器具有类似于人的智能。从学科角度来看:人工智能是计算机科学中涉及研究、设计和应用智能机器的一个分支。它的近期主要目标在于研究用机器来模仿和执行人脑的某些智能功能,并开发相关理论和技术。从能力角度来看:人工智能是智能机器所执行的通常与人类智能有关的功能。对认知 行为进行研究:心理活动的最高层级是思维策略,中间一层是初级信息处理,最低层级是生理过程,与此相应的是计算机程序、语言和硬件。研究认知过程的主要任务是探求高层次思维决策与初级信息处理的关系,并用计算机程序来模拟人的思维策略水平,而用计算机语言模拟人的初级信息处理过程。人工智能新的研究热点:新的研究热点:分布式人工智能与Agent,计算智能与进化计算,数据挖掘与知识发现 (超市市场商品数据分析),人工生命第二章:知识表示方法知识的一般概念:知识是人们在改造客观世界的实践中积累起来的认识和经验知识表示:是研究用机器表示知识的可行性、有效性的一般方法,是一种数据结构与控制结构的统一体,既考虑知识的存储又考虑知识的使用。知识表示的要求:表示能力、可利用性、可实现性、可组织性、可维护性、自然性、可理解性状态空间法的三要素:状态、算符、状态空间方法问题求解技术:问题的表示和求解的方法二种不确定性:关于证据的不确定性和关于结论的不确定性原子公式:由若干谓词符号和项组成问题的状态空间包含三种说明的集合:初始状态集合S、操作符集合以及目标状态集合“我听音乐或者绘画”的谓词表示的析取式LISTEN(I,MUSIC)VDRAW(I,PAINTING)句子变换成子句形式:(x){P(x)→P(x)} (ANY x) { P(x)P(x) } (ANY x) {~P(x) 实验报告 1.对CLIPS和其运行及推理机制进行介绍 CLIPS是一个基于前向推理语言,用标准C语言编写。它具有高移植性、高扩展性、 强大的知识表达能力和编程方式以及低成本等特点。 CLIPS由两部分组成:知识库、推理机。它的基本语法是: (defmodule< module-n ame >[< comme nt >]) CLIPS的基本结构: (1).知识库由事实库(初始事实+初始对象实例)和规则库组成。 事实库: 表示已知的数据或信息,用deftemplat,deffact定义初始事实表FACTLIS,由关系名、后跟 零个或多个槽以及它们的相关值组成,其格式如下: 模板: (deftemplate 第二章知识表示方法 2-1 状态空间法、问题归约法、谓词逻辑法和语义网络法的要点是什么?它们有何本质上的联系及异同点? 答:状态空间法:基于解答空间的问题表示和求解方法,它是以状态和算符为基础来表示和求解问题的。一般用状态空间法来表示下述方法:从某个初始状态开始,每次加一个操作符,递增的建立起操作符的试验序列,直到达到目标状态为止。 问题规约法:已知问题的描述,通过一系列变换把此问题最终变成一个子问题集合:这些子问题的解可以直接得到,从而解决了初始问题。问题规约的实质:从目标(要解决的问题)出发逆向推理,建立子问题以及子问题的子问题,直至最后把出示问题规约为一个平凡的本原问题集合。 谓词逻辑法:采用谓词合式公式和一阶谓词算法。要解决的问题变为一个有待证明的问题,然后采用消解定理和消解反演莱证明一个新语句是从已知的正确语句导出的,从而证明这个新语句也是正确的。 语义网络法:是一种结构化表示方法,它由节点和弧线或链组成。节点用于表示物体、概念和状态,弧线用于表示节点间的关系。语义网络的解答是一个经过推理和匹配而得到的具有明确结果的新的语义网络。语义网络可用于表示多元关系,扩展后可以表示更复杂的问题 2-2 设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去? 用S i(nC, nY) 表示第i次渡河后,河对岸的状态,nC表示传教士的数目,nY表示野人的数目,由于总人数的确定的,河对岸的状态确定了,河这边的状态也即确定了。考虑到题目的限制条件,要同时保证,河两岸的传教士数目不少于野人数目,故在整个渡河的过程中,允许出现的状态为以下3种情况: 1. nC=0 2. nC=3 3. nC=nY>=0 (当nC不等于0或3) 用d i(dC, dY)表示渡河过程中,对岸状态的变化,dC表示,第i次渡河后,对岸传教士数目的变化,dY表示,第i次渡河后,对岸野人数目的变化。当i为偶数时,dC,dY同时为非负数,表示船驶向对岸,i为奇数时,dC, dY同时为非正数,表示船驶回岸边。 《人工智能及其应用》实验指导书 《人工智能及其应用》 实验指导书 浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月 前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月 目录 实验教学大纲 (1) 实验一产生式系统实验 (4) 实验二模糊推理系统实验 (6) 实验三 A*算法实验I (11) 实验四 A*算法实验II (14) 实验五遗传算法实验I (16) 实验六遗传算法实验II (21) 实验七基于神经网络的模式识别实验 (24) 实验八基于神经网络的优化计算实验 (28) 实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台 实验内容学 时 类型教学 要求 1 产生式系统应 用VC++ 设计知识库,实现系统识 别或分类等。 2 设计课内 2 模糊推理系统 应用Matlab 1)设计洗衣机的模糊控制 器; 2)设计两车追赶的模糊控 制器。 2 验证课内 3 A*算法应用I VC++ 设计与实现求解N数码问 题的A*算法。 2 综合课内4 A*算法应用II VC++ 设计与实现求解迷宫问题 的A*算法。 2 综合课内 5 遗传算法应用 I Matlab 1)求某一函数的最小值; 2)求某一函数的最大值。 2 验证课内 6 遗传算法应用 II VC++ 设计与实现求解不同城市 规模的TSP问题的遗传算 法。 2 综合课内 7 基于神经网络 的模式识别Matlab 1)基于BP神经网络的数 字识别设计; 2)基于离散Hopfiel神经 网络的联想记忆设计。 2 验证课内 8 基于神经网络 的优化计算VC++ 设计与实现求解TSP问题 的连续Hopfield神经网 络。 2 综合课内 四、实验成绩评定 人工智能课程项目报告 姓名: 班级:二班 一、实验背景 在新的时代背景下,人工智能这一重要的计算机学科分支,焕发出了他强大的生命力。不仅仅为了完成课程设计,作为计算机专业的学生, 了解他,学习他我认为都是很有必要的。 二、实验目的 识别手写字体0~9 三、实验原理 用K-最近邻算法对数据进行分类。逻辑回归算法(仅分类0和1)四、实验内容 使用knn算法: 1.创建一个1024列矩阵载入训练集每一行存一个训练集 2. 把测试集中的一个文件转化为一个1024列的矩阵。 3.使用knnClassify()进行测试 4.依据k的值,得出结果 使用逻辑回归: 1.创建一个1024列矩阵载入训练集每一行存一个训练集 2. 把测试集中的一个文件转化为一个1024列的矩阵。 3. 使用上式求参数。步长0.07,迭代10次 4.使用参数以及逻辑回归函数对测试数据处理,根据结果判断测试数 据类型。 五、实验结果与分析 5.1 实验环境与工具 Window7旗舰版+ python2.7.10 + numpy(库)+ notepad++(编辑) Python这一语言的发展是非常迅速的,既然他支持在window下运行就不必去搞虚拟机。 5.2 实验数据集与参数设置 Knn算法: 训练数据1934个,测试数据有946个。 数据包括数字0-9的手写体。每个数字大约有200个样本。 每个样本保持在一个txt文件中。手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下图所 示 建立一个kNN.py脚本文件,文件里面包含三个函数,一个用来生成将每个样本的txt文件转换为对应的一个向量:img2vector(filename):,一个用 来加载整个数据库loadDataSet():,最后就是实现测试。 《人工智能及其应用》 实验指导书 浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月 前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月 目录 实验教学大纲 (1) 实验一产生式系统实验 (4) 实验二模糊推理系统实验 (7) 实验三A*算法实验I (13) 实验四A*算法实验II (17) 实验五遗传算法实验I (19) 实验六遗传算法实验II (26) 实验七基于神经网络的模式识别实验 (29) 实验八基于神经网络的优化计算实验 (35) 实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台实验内容学 时 类型教学 要求 1 产生式系统应用VC++ 设计知识库,实现系统识别或 分类等。 2 设计课内 2 模糊推理系统应 用Matla b 1)设计洗衣机的模糊控制器; 2)设计两车追赶的模糊控制 器。 2 验证课内 3 A*算法应用I VC++ 设计与实现求解N数码问题的 A*算法。 2 综合课内 4 A*算法应用II VC++ 设计与实现求解迷宫问题的A* 算法。 2 综合课内 5 遗传算法应用I Matla b 1)求某一函数的最小值; 2)求某一函数的最大值。 2 验证课内 6 遗传算法应用II VC++ 设计与实现求解不同城市规模 的TSP问题的遗传算法。 2 综合课内7 基于神经网络的Matla1)基于BP神经网络的数字识 2 验证课内 《一人工智能方向实习一》 实习报告 专业:计算机科学与技术 班级:12419013 学号: 姓名: 江苏科技大学计算机学院 2016年3月 实验一数据聚类分析 一、实验目的 编程实现数据聚类的算法。 二、实验内容 k-means聚类算法。 三、实验原理方法和手段 k-means算法接受参数k ;然后将事先输入的 n个数据对象划分为 k个聚类以便使得 所获得的聚类满足:同一聚类中的对象相似度较高 四、实验条件 Matlab2014b 五、实验步骤 (1)初始化k个聚类中心。 (2)计算数据集各数据到中心的距离,选取到中心距离最短的为该数据所属类别。 (3)计算(2)分类后,k个类别的中心(即求聚类平均距离) (4)继续执行(2)(3)直到k个聚类中心不再变化(或者数据集所属类别不再变化) 六、实验代码 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % mai n.m % k-mea ns algorithm % @author matcloud %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; close all ; load fisheriris ; X = [meas(:,3) meas(:,4)]; figure; plot(X(:,1),X(:,2), 'ko' ,'MarkerSize' ,4); title( 'fisheriris dataset' , 'FontSize' ,18, 'Color' , 'red'); [idx,ctrs] = kmea ns(X,3); figure; subplot(1,2,1); plot(X(idx==1,1),X(idx==1,2), 'ro' , 'MarkerSize' ,4); hold on; ****大学 人工智能基础课程实验报告 (2011-2012学年第一学期) 启发式搜索王浩算法 班级: *********** 学号: ********** 姓名: ****** 指导教师: ****** 成绩: 2012年 1 月 10 日 实验一 启发式搜索算法 1. 实验内容: 使用启发式搜索算法求解8数码问题。 ⑴ 编制程序实现求解8数码问题A *算法,采用估价函数 ()()()() w n f n d n p n ??=+???, 其中:()d n 是搜索树中结点n 的深度;()w n 为结点n 的数据库中错放的棋子个数;()p n 为结点n 的数据库中每个棋子与其目标位置之间的距离总和。 ⑵ 分析上述⑴中两种估价函数求解8数码问题的效率差别,给出一个是()p n 的上界的()h n 的定义,并测试使用该估价函数是否使算法失去可采纳性。 2. 实验目的 熟练掌握启发式搜索A *算法及其可采纳性。 3. 实验原理 使用启发式信息知道搜索过程,可以在较大的程度上提高搜索算法的时间效率和空间效率; 启发式搜索的效率在于启发式函数的优劣,在启发式函数构造不好的情况下,甚至在存在解的情形下也可能导致解丢失的现象或者找不到最优解,所以构造一个优秀的启发式函数是前提条件。 4.实验内容 1.问题描述 在一个3*3的九宫格 里有1至8 八个数以及一个空格随机摆放在格子中,如下图: 初始状态 目标状态 现需将图一转化为图二的目标状态,调整的规则为:每次只能将空格与其相邻的一个数字进行交换。实质是要求给出一个合法的移动步骤,实现从初始状态到目标状态的转变。 2.算法分析 (1)解存在性的讨论 对于任意的一个初始状态,是否有解可通过线性代数的有关理论证明。按数组存储后,算出初始状态的逆序数和目标状态的逆序数,若两者的奇偶性一致,则表明有解。 (2)估价函数的确定 实验一:知识表示方法 一、实验目的 状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。 二、问题描述 有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。 三、基本要求 输入:牧师人数(即野人人数):n;小船一次最多载人量:c。 输出:若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。用三元组(X1, X2, X3)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态->中间状态->目标状态。 例:当输入n=2,c=2时,输出:221->110->211->010->021->000 其中:X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。 要求:写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如: Please input n: 2 Please input c: 2 Successed or Failed?: Successed Optimal Procedure: 221->110->211->010->021->000 四、实验组织运行要求 本实验采用集中授课形式,每个同学独立完成上述实验要求。 五、实验条件 每人一台计算机独立完成实验。 六、实验代码 Main.cpp #include 《人工智能及其应用》 教学讲义 第一章人工智能概论 第一章人工智能概论 一、人工智能的基本概念 人工智能(Artificial Intelligence,简称AI)这一术语是1956年在美国的Dartmouth大学召开的世界第一次AI会议上由麻省理工学院的青年数学教师John McCarthy提议而使用的。AI这一学科至今已有50多年的历史,在国际上已确认AI是当代高科技的核心之一。 AI是一个广义词,各有说法,很难给出准确的定义或一般性的定义。其基本含义是: AI是用机器(计算机或智能机)来模仿人类的智能行为。 AI也叫机器智能,是研究如何使机器具有认识问题与解决问题的能力,研究如何使机器具有感知功能(如视、听、嗅)、思维功能(如分析、综合、计算、推理、联想、判断、规划、决策)、行为功能(如说、写、画)及学习、记忆等功能。 所以,如果一个计算机系统具有某种学习能力,能够对有关问题给出正确的答案,而使用的方法与人类相似,还能解释系统的智能活动,那么,这种计算机系统便认为具有某种智能。 人工智能用计算机技术的概念和方法对智能进行研究,因此,它从根本上提供了一个全新的理论基础。作为一门学科,人工智能的目的是了解使智能得以实现的原理;作为一门技术,它的最终目的是设计出完全与人类智能相媲美的智能计算机系统。 到目前为止,计算机作为一种最有效的信息处理工具,人们已片刻离不开它。但是,与人脑相比,计算机的智能在许多方面还不及婴幼儿。如果计算机具有一定的智能,能够模拟人类的智能活动,成为人脑的延伸,那么计算机对人类的贡献和作用将产生不可估量的影响,人类将步入智能机器人的时代。 尽管科学家们尚未达到这个目的,但在使计算机更加智能化方面已经取得了很大的进展,许多AI 计算机系统在不少领域实际上已超出了高水平的人类技艺,如计算机可以下出极高水平的象棋,用来诊断某种疾病,用来发现数学概念。 AI是使技术适应于人类的钥匙,是自动化技术向智能技术方向发展的关键,也是揭示人类智能和人脑奥秘的有力工具。 二、人工智能的研究内容 要了解人工智能的研究内容,必须先搞清楚什么是人类的智能。“智能”词源来自拉丁语Legere,字面意思是采集、收集和汇集,并由此进行选择。而Intellegere意思是从中进行选择,进而理解、领悟和认识。 因此,人工智能的研究内容应包括三个方面: 1.知识表达(Knowledge Representation): ——研究如何在机器中表示知识,使知识形式化、模型化,用以建立合适的符号逻辑系统。 2.知识获取(Knowledge Acquisition): ——研究机器如何从各种知识源获取知识。 3.知识处理(Knowledge Inference)或问题求解(Peoblem Solving): ——运用存贮于机器中的知识进行相应知识处理,并推出结论。 人工智能实验报告 学号: 姓名: 实验名称:遗传算法 实验日期:2016.1.5 【实验名称】遗传算法 【实验目的】 掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。【实验原理】 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。 遗传算法程度流程图为: 【实验内容】 题目:已知f(x)=x*sin(x)+1,x ∈[0,2π],求f(x)的最大值和最小值。 数据结构: struct poptype { double gene[length];//染色体 double realnumber;//对应的实数x double fitness;//适应度 double rfitness;//相对适应度 double cfitness;//累计适应度 }; struct poptype population[popsize+1];//最后一位存放max/min struct poptype newpopulation[popsize+1];// 染色体编码: [0,2]x π∈,变量长度为2 π,取小数点后6位,由于2262322*102;π<< 因此,染色体由23位字节的二进制矢量表示,则X 与二进制串()2之间的映射如下: () 222221 2 010 b b ......b 2'i i i b x =?? =?= ???∑;23 2'21x x π=- 适应度函数: 由于要求f(x)的最值,所以适应度函数即可为f(x)。但为了确保在轮赌法选择过中,每个个体都有被选中的可能性,因此需要将所有适应度调整为大于0的值。因此,设计求最大值的适应度函数如下: max ()5sin 6; eval f x x x =+=+ 将最小问题转化为求-f(x)的最大值,同理,设计最小值的适应度函数如下: min ()5sin 4;eval f x x x =-+=-+ 种群大小: 本实验默认为50,再进行种群初始化。 实验参数: 主要有迭代数,交叉概率,变异概率这三个参数。一般交叉概率在0.6-0.9范围内,变异概率在0.01-0.1范围内。可以通过手动输入进行调试。 主要代码如下: void initialize()//种群初始化 { srand(time(NULL)); 人工智能实验报告 实验名称:模糊方法实现电热箱的闭环控制实验 模糊逻辑控制(Fuzzy Logic Control)简称模糊控制(Fuzzy Control),是以模糊集合论、模糊语言变量和模糊逻辑推理为基础的一种计算机数字控制技术。1965年,美国的L.A.Zadeh 创立了模糊集合论;1973年他给出了模糊逻辑控制的定义和相关的定理。1974年,英国的E.H.Mamdani首先用模糊控制语句组成模糊控制器,并把它应用于锅炉和蒸汽机的控制,在实验室获得成功。这一开拓性的工作标志着模糊控制论的诞生。 模糊控制实质上是一种非线性控制,从属于智能控制的范畴。模糊控制的一大特点是既具有系统化的理论,又有着大量实际应用背景。模糊控制的发展最初在西方遇到了较大的阻力;然而在东方尤其是在日本,却得到了迅速而广泛的推广应用。近20多年来,模糊控制不论从理论上还是技术上都有了长足的进步,成为自动控制领域中一个非常活跃而又硕果累累的分支。其典型应用的例子涉及生产和生活的许多方面,例如在家用电器设备中有模糊洗衣机、空调、微波炉、吸尘器、照相机和摄录机等;在工业控制领域中有水净化处理、发酵过程、化学反应釜、水泥窑炉等的模糊控制;在专用系统和其它方面有地铁靠站停车、汽车驾驶、电梯、自动扶梯、蒸汽引擎以及机器人的模糊控制等。 模糊控制是以模糊集合论、模糊语言变量和模糊逻辑推理为基础的微机数字控制。它能模拟人的思维,构成一种非线性控制,以满足复杂的、不确定的过程控制的需要,是一种典型的智能控制。模糊控制系统类似于常规的微机控制系统,如下图所示: 图1 模糊控制系统的构成图 一、实验目的 1. 学习由已知对象建立一个双入单出模糊控制器; 2. 掌握利用模糊控制器实现温度控制的方法。 二、实验原理及内容 模糊控制器最常用的都是二维的,其输入变量有两个(X1,X2),输出变量只有一个(Y)。在实际控制系统中,X1一般取为误差信号,X2一般取误差的变化,由于同时考虑到误差和误差变化的影响,所以才能保证系统稳定,不致于产生振荡。模糊控制系统的方框图如下图所示: 暨南大学人工智能实验报告 题目:动物识别系统 院系:信科院计算机系 一、目的与要求 1.掌握人工智能的知识表示技术,能用产生式表示法表示知识,并实现一个用于识别的专家系统。 2.推理策略采用正向推理和反向推理两种。 事实可看成是断言一个语言变量的值或是多个语言变量间的关系的陈述句,语言变量的值或语言变量间的关系可以是一个词。不一定是数字。一般使用三元组(对象,属性,值)或(关系,对象1,对象2)来表示事实,其中对象就是语言变量,若考虑不确定性就成了四元组表示(增加可信度)。这种 表示的机器内部实现就是一个表。 如事实“老李年龄是35岁”,便写成(Lee,age,35) 事实“老李、老张是朋友”,可写成(friend,Lee,Zhang)2.规则的表示: 、 是精确的,而产生式的匹配可以是不确定的,原因是产生式的前提条件和结论都可以是不确定的,因此其匹配也可以是不确定的。 3.产生式系统的结构: 3. 3.3推理机 推理机是一个解释程序,控制协同规则库与数据库,负责整个产生式系统的运行,决定问题求解过程的推理路线,实现对问题的求解。 推理机主要包括下面一些工作内容: (1)按一定策略从规则库中选择规则与数据库的已知事实进行匹配。匹配的过程中会产生三种情况。第一种匹配成功,则此条规则将被列入被激活候选集;第二种匹配失败,即输入条件与已知条件矛盾;第三种匹配无结果,即该条规则前件的已知条件中完全与输入事实无关,则将规则列入待测试规则集,将在下一轮匹配中再次使用。因为有可能推理中间结果符合其前件的已知 正向推理是从已知事实出发,通过规则库求的结论,也称为自底向上,或称为数据驱动方式。 正向推理过程的具体步骤是:游戏人工智能实验报告记录四
人工智能实验报告大全
《人工智能及其应用》(蔡自兴)课后习题答案第3章
游戏人工智能实验报告四
《人工智能及其应用》实验指导书Word版
人工智能实验报告大全
人工智能及其应用总结
人工智能实验报告
人工智能及其应用(蔡自兴)课后答案
《人工智能及其应用》实验指导书上课讲义
人工智能实验报告
《人工智能及其应用》实验指导书
人工智能实验报告
人工智能实验报告
人工智能_实验报告
//船 class Boat { public: static int c; int pastor;//牧师 int savage;//野人 Boat(int pastor, int savage); }; //河岸状态 class State
人工智能及其应用-概论
人工智能 遗传算法实验报告
人工智能实验报告
人工智能实验报告