人工智能产生式系统实验报告解读

时间:2019-05-12 22:13:14下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《人工智能产生式系统实验报告解读》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《人工智能产生式系统实验报告解读》。

第一篇:人工智能产生式系统实验报告解读

实 验 报 告

【实验名称】______________产生式系统_______________________ 【实验目的】

1.理解产生式系统的结构原理与实际应用。2.掌握产生式规则表示及规则库组建的实现方法。

3.熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。

【实验原理】

产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。

【实验内容】

1.自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的事实,并基于原有的规则和输入的事实进行推理。

2.建造动物识别系统,能根据输入的动物特征判断是那种动物或给出相应的回答。3.算法设计 ①首先建立事实库

事实库是在程序的开始直接输入的,用户根据需要选择,即要求用户先输入特征个数,然后输入动物的特征,进行识别。如果未识别出来,则可以重新选择,或者退出。

动物的特征如下:

1有奶 2有毛发 3有羽毛 4会飞 5生蛋 6有爪 7有犬齿

8目盯前方 9吃肉 10有蹄 11反刍食物 12黄褐色 13黑色条纹

14黑色斑点 15长腿 16长脖子 17暗斑点 18白色 19不会飞

20黑白色 21会游泳 22善飞 23不怕风浪

24哺乳动物 25鸟 26食肉动物 27有蹄动物 28偶蹄动物

29海燕 30老虎 31金钱豹 32长颈鹿 33斑马 34鸵鸟 35企鹅

②建立静态规则库

即建立产生式规则,本算法采用了产生中间事实的方法,便于建立和使用规则。为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少。本算法共有15种规则,如下:

R1: 如果动物有奶,则它是哺乳动物 R2: 如果动物有毛发,则它是哺乳动物 R3: 如果动物有羽毛,则它是鸟 R4: 如果动物会飞且生蛋,则它是鸟 R5: 吃肉的哺乳动物是食肉动物

R6: 有爪有犬齿木钉前方的哺乳动物是食肉动物

R7: 有蹄的哺乳动物是有蹄动物 R8: 反刍食物的有蹄动物是偶蹄动物 R9: 黄褐色有黑条纹的食肉动物是老虎 R10:黄褐色有黑色斑点的食肉动物是金钱豹

R11:长腿长脖子有黄褐色暗斑点的有蹄动物是长颈鹿

R12:有黑白条纹的有蹄动物是斑马 R13:不会飞长腿长脖的鸟是鸵鸟 R14:不会飞会游泳黑白色的鸟是企鹅

③正向推理过程

从已知事实出发,通过规则库求得结论,或称数据驱动方式。推理过程是:  规则集中的规则前件与事实库中的事实进行匹配,得匹配的规则集合。 从匹配规则集合中选择一条规则作为使用规则。

 执行使用规则的后件,将该使用规则的后件送入事实库中。 重复这个过程直至达到目标。

如有多条匹配规则需从中选一条作为使用规则,本算法是根据规则的顺序依次选择,且规则中不存在同一组事实对应多条匹配规则。

R15:善飞不怕风浪的鸟是海燕 具体表示如下: R1: 1->24 R2: 2->24 R3: 3->25 R4: 4*5->25 R5: 6*7*8*24->26 R6: 9*24->26 R7: 10*24->27 R8: 11*27->28 R9: 12*13*24->30 R10: 12*14*24->31 R11: 12*15*16*17*27->32 R12: 13*18*27->33 R13: 15*16*19*25->34 R14: 19*20*21*25->35 R15: 22*23*25->29

④实验流程图

开始初始化欲加入的事实的个数及事实令i=1取出规则i的前提条件部分Ni=i+1事实库中有相应的事实Y取出规则i结论部分结论为新事实Y将该规则加入到事实库中该事实是结论性事实Y将该规则的结论作为最终的结论结束NN ⑤实验结果及分析

如输入如下事实:有羽毛、善飞、不怕风浪。系统的推理过程如下:

先从规则库中取出第一条规则R1,检查其前提是否可与事实库中的已知事实相匹配。R1的前提是“有奶”,但事实库中无此事实,故匹配失败;然后取R2,匹配失败;接着取R3,该前提与已知事实“有羽毛”相匹配,故R3被执行,并将其结论“鸟”作为新的事实加入到事实库中。此时,事实库的内容变为:有羽毛、善飞、不怕风浪、鸟;此后,R4~R14均匹配失败,接着取R15,该前提“善飞+不怕风浪+鸟”与已知事实相匹配,R15被执行,并推出“该动物是海燕”。由于“海燕”已是目标集合中的一个结论,即已推出最终结果,故问题求解过程结束。

下面是程序运行的结果:

【实验程序】

#include #define N 23 void main(){

int i,j,k,a,b,c;int num;int fact[N],temp[N];int flag=1;while(flag==1){ printf(“动物的特征如下:n”);printf(“1有奶

2有毛发

3有羽毛

4会飞

20黑白色n21会游泳

22善飞

23不怕风浪n”);

printf(“请输入描述该动物特征的个

数:”);

scanf(“%d”,&num);

printf(“请输入对这只动物的特征描述的序号(按序号由小到大):n”);

for(i=0;i

}

//********************************for(i=0;i

if(fact[i]==1)scanf(“%d”,&a);fact[i]=a;会飞

5生蛋n6有爪

7有犬齿

8目盯前方

9吃肉

10有蹄n11反刍食物

12黄褐色

13黑色条纹

14黑色斑点

15长腿n16长脖子

17暗斑点

18白色

19不

{

fact[num]=24;num++;printf(“使用规则1,新增加的 }

}

//********************************k=0;

for(i=0;i

}

if(temp[0]==4&&temp[1]==5){

fact[num]=25;num++;

printf(”使用规则4,新增加的事实if(fact[i]==4){

}

if(fact[i]==5){

}

temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;事实为: 哺乳动物n“);

} //********************************for(i=0;i

if(fact[i]==2){

fact[num]=24;num++;printf(”使用规则2,新增加的 } break;

事实为: 哺乳动物n“);

} //********************************for(i=0;i

if(fact[i]==3){

fact[num]=25;num++;printf(”使用规则3,新增加的 } break;

为:鸟n“);

}

//********************************

k=0;

for(i=0;i

if(fact[i]==6)事实为:鸟n”);

break;

} {

} if(fact[i]==7){

} if(fact[i]==8){

} if(fact[i]==24){

} temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;

}

//********************************k=0;

for(i=0;i

}

if(temp[0]==9&&temp[1]==24){

fact[num]=26;num++;

printf(“使用规则6,新增加的事实if(fact[i]==9){

}

if(fact[i]==24){

}

temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;

为:食肉动物n”);

fact[num]=26;num++;printf(“使用规则5,新增加的事实if(temp[0]==6&&temp[1]==7&&temp[2}

//********************************k=0;

for(i=0;i

if(fact[i]==10){ ]==8&&temp[3]==24)

{

为:食肉动物n”);

}

} temp[k]=fact[i];k++;continue;

}

}

break;

if(temp[0]==11&&temp[1]==27){

fact[num]=28;num++;

printf(“使用规则8,新增加的事实if(fact[i]==24){

} temp[k]=fact[i];break;

为:偶蹄动物n”);

}

//********************************k=0;

for(i=0;i

if(fact[i]==12){

}

if(fact[i]==13){

}

if(fact[i]==24){

temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;if(temp[0]==10&&temp[1]==24){

fact[num]=27;num++;printf(“使用规则7,新增加的事实

为:有蹄动物n”);

} //********************************k=0;for(i=0;i

if(fact[i]==11){

} if(fact[i]==27){ temp[k]=fact[i];

temp[k]=fact[i];k++;continue;

} }

}

} if(temp[0]==12&&temp[1]==13&&tempif(temp[0]==12&&temp[1]==14&&temp[2]==24)

{

fact[num]=30;//num++;printf(“使用规则9,新增加的事实

[2]==24)

{

fact[num]=31;//num++;

printf(”使用规则10,新增加的事实为:老虎n该动物为老虎n“);

为:金钱豹n该动物为金钱豹n”);

}

//********************************k=0;

for(i=0;i

if(fact[i]==12){

}

if(fact[i]==15){

}

if(fact[i]==16){

temp[k]=fact[i];k++;

temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;} //********************************k=0;for(i=0;i

if(fact[i]==12){

} if(fact[i]==14){

} if(fact[i]==24){ temp[k]=fact[i];break;

temp[k]=fact[i];k++;continue;

temp[k]=fact[i];k++;continue;

} } continue;

}

}

continue;if(fact[i]==17){

} if(fact[i]==27){

} temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;

if(fact[i]==18){

}

if(fact[i]==27){

}

temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;

if(temp[0]==12&&temp[1]==15&&tempif(temp[0]==13&&temp[1]==18&&temp[2]==16&&temp[3]==17&&temp[4]==27)

{

fact[num]=32;//num++;printf(“使用规则11,新增加的事实

[2]==27)

{

fact[num]=33;//num++;

printf(”使用规则12,新增加的事实为:长颈鹿n该动物为长颈鹿n“);

为:斑马n该动物为斑马n”);

}

//********************************k=0;

for(i=0;i

if(fact[i]==15){

temp[k]=fact[i];k++;} //********************************k=0;for(i=0;i

if(fact[i]==13){ temp[k]=fact[i];k++;

} } continue;

for(i=0;i

}

if(temp[0]==19&&temp[1]==20&&temp

if(fact[i]==19){

}

if(fact[i]==20){

}

if(fact[i]==21){

}

if(fact[i]==25){

}

temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;if(fact[i]==16){

} if(fact[i]==19){

} if(fact[i]==25){

} temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;

if(temp[0]==15&&temp[1]==16&&temp[2]==19&&temp[3]==25)

{

fact[num]=34;//num++;printf(“使用规则13,新增加的事实

为:鸵鸟n该动物为鸵鸟n”);

} //********************************k=0;

[2]==21&&temp[3]==25)

{

fact[num]=35;

//num++;printf(“使用规则14,新增加的事实

}

} 为:企鹅n该动物为企鹅n”);

} //********************************k=0;for(i=0;i

if(fact[i]==22){

} if(fact[i]==23){

} if(fact[i]==25){ temp[k]=fact[i];break;temp[k]=fact[i];k++;continue;temp[k]=fact[i];k++;continue;

if(temp[0]==22&&temp[1]==23&&temp

[2]==25)

{

fact[num]=29;//num++;

printf(“使用规则15,新增加的事实

为:海燕n该动物为海燕n”);

}

//********************************if(fact[num]<29)

printf(“现有事实无法推断出结

果!n”);

printf(“n”);

printf(“继续请按1,退出按其它数字

键:”);

}

scanf(“%d”,&c);if(c==1)

flag=c;

else break;} 【小结或讨论】

本系统的规则库是静态的,不能动态增加新的规则。这使得在规则变化的情况下不能及时改变,但是该系统已经能基本满足需要,对输入的事实能给出相应的回答,判断出是何种动物。

读书的好处

1、行万里路,读万卷书。

2、书山有路勤为径,学海无涯苦作舟。

3、读书破万卷,下笔如有神。

4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文

5、少壮不努力,老大徒悲伤。

6、黑发不知勤学早,白首方悔读书迟。——颜真卿

7、宝剑锋从磨砺出,梅花香自苦寒来。

8、读书要三到:心到、眼到、口到

9、玉不琢、不成器,人不学、不知义。

10、一日无书,百事荒废。——陈寿

11、书是人类进步的阶梯。

12、一日不读口生,一日不写手生。

13、我扑在书上,就像饥饿的人扑在面包上。——高尔基

14、书到用时方恨少、事非经过不知难。——陆游

15、读一本好书,就如同和一个高尚的人在交谈——歌德

16、读一切好书,就是和许多高尚的人谈话。——笛卡儿

17、学习永远不晚。——高尔基

18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向

19、学而不思则惘,思而不学则殆。——孔子

20、读书给人以快乐、给人以光彩、给人以才干。——培根

第二篇:人工智能_实验报告

实验一:知识表示方法

一、实验目的

状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。

二、问题描述

有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 #include “RiverCrossing.h” using namespace std;

//主函数 void main(){

} system(“pause”);RiverCrossing riverCrossing(n, c);riverCrossing.solve();int n, c;cout<<“Please input n: ”;cin>>n;cout<<“Please input c: ”;cin>>c;RiverCrossing::ShowInfo();

RiverCrossing.h #pragma once #include

//船 class Boat { public:

};

//河岸状态 class State Boat(int pastor, int savage);static int c;int pastor;//牧师 int savage;//野人

{ public:

};

//过河问题

class RiverCrossing { private:

};bool move(State *nowState, Boat *boat);//进行一次决策

State* findInList(std::list &listToCheck, State &state);//检查某状态节void print(State *endState);//打印结果 static void ShowInfo();RiverCrossing(int n, int c);bool solve();//求解问题 std::list openList, closeList;State endState;State(int pastor, int savage, int boatAtSide);int getTotalCount();//获得此岸总人数 bool check();//检查人数是否符合实际 bool isSafe();//检查是否安全

State operator +(Boat &boat);State operatorboat.pastor, iSavage1);ret.pPrevious = this;return ret;State ret(iPastor + boat.pastor, iSavage + boat.savage, iBoatAtSide + 1);ret.pPrevious = this;return ret;

} openList.push_back(new State(State::n, State::n, 1));while(!openList.empty()){

} print(NULL);return false;//获取一个状态为当前状态

State *nowState = openList.front();openList.pop_front();closeList.push_back(nowState);//从当前状态开始决策

if(nowState->iBoatAtSide == 1){//船在此岸

} //过河的人越多越好,且野人优先

int count = nowState->getTotalCount();count =(Boat::c >= count ? count : Boat::c);for(int capticy = count;capticy >= 1;--capticy){

} //把船开回来的人要最少,且牧师优先

for(int capticy = 1;capticy <= Boat::c;++capticy){

} for(int i = 0;i <= capticy;++i){

} Boat boat(capticyi);if(move(nowState, &boat))

return true;} else if(nowState->iBoatAtSide == 0){//船在彼岸

//实施一步决策,将得到的新状态添加到列表,返回是否达到目标状态 bool RiverCrossing::move(State *nowState, Boat *boat){

//获得下一个状态 State *destState;if(nowState->iBoatAtSide == 1){

} destState = new State(*nowState1<iPastor<<“,”<

iSavage<<“,”<

iBoatAtSide;if(st.size()> 0)cout<<“-> ”;cout<

cout<<“==”<

七、实验结果

实验二:九宫重排

一、实验目的

A*算法是人工智能领域最重要的启发式搜索算法之一,本实验通过九宫重排问题,强化学生对A*算法的理解与应用,为人工智能后续环节的课程奠定基础。

二、问题描述

给定九宫格的初始状态,要求在有限步的操作内,使其转化为目标状态,且所得到的解是代价最小解(即移动的步数最少)。如:

三、基本要求

输入:九宫格的初始状态和目标状态 输出:重排的过程,即途径的状态

四、实验组织运行要求

本实验采用集中授课形式,每个同学独立完成上述实验要求。

五、实验条件

每人一台计算机独立完成实验。

六、实验代码

Main.cpp #include #include “NineGrid.h” using namespace std;

//主函数 void main(){ NineGrid::ShowInfo();

} string start, end;cout<<“Please input the initial state:(ex:134706582)”<>start;cout<<“Please input the target state:(ex:123804765)”<>end;NineGrid nineGrid(start, end);nineGrid.solve();system(“pause”);

NineGrid.h #pragma once #include #include #include using namespace std;

#define SPACE '0'

#define AT(s, x, y)(s)[(x)* 3 +(y)]

enum Move { };

//九宫格状态 class State { public:

int moves;//到此状态的移动次数 int value;//价值

State *pPrevious;//前一个状态

State(string &grid, State *pPrevious = NULL);int getReversedCount();//获取逆序数 void evaluate();//评价函数

bool check(Move move);//检查是否可以移动 string grid;//用字符串保存当前棋盘状态 int x, y;//空格所在位置 static State *pEndState;//指向目标状态,用于评价h的值 UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3

};State takeMove(Move move);//实施移动,生成子状态 //重载==运算符,判断两个状态是否相等

inline bool operator ==(State &state){ return grid == state.grid;} //九宫重排问题 class NineGrid { private:

};

NineGrid.cpp #include “NineGrid.h” #include #include #include using namespace std;

State* State::pEndState = NULL;

/*=======================Methods for class “State”=======================*/ //构造函数

State::State(string &grid, State *pPrevious){ this->grid = grid;NineGrid(string &start, string &dest);bool solve();//求解问题 //用于排序

static bool greater_than(const State *state1, const State *state2);static void ShowInfo();//显示信息 bool compareReversed();//比较逆序数奇偶性是否相同

bool takeMove(State *nowState, Move move);//进行一次决策

State* findInList(vector &listToCheck, State &State);//检查某状态void print(State *endState);//打印结果 vector openList, closeList;State startState, endState;clock_t startTime;节点是否在列表中

public:

} this->pPrevious = pPrevious;if(this->pPrevious)this->moves = pPrevious->moves + 1;this->moves = 0;else

this->value = 0;evaluate();for(int i = 0;i < 3;++i){

} for(int j = 0;j < 3;++j){

} if(AT(grid, i, j)== SPACE){

} x = i;y = j;return;bool State::check(Move move){

}

State State::takeMove(Move move){ switch(move){ case UP:

} return true;if(x1 < 0)return false;break;if(y + 1 >= 3)return false;break;case DOWN: case LEFT: case RIGHT:

} int destX, destY;switch(move){ case UP:

} string tGrid = grid;char t = AT(tGrid, destX, destY);AT(tGrid, destX, destY)= AT(tGrid, x, y);AT(tGrid, x, y)= t;return State(tGrid, this);destX = x1;break;destX = x;destY = y + 1;break;case DOWN: case LEFT: case RIGHT: void State::evaluate(){

for(int ii = 0;ii < 3;++ii){

for(int jj = 0;jj < 3;++jj){ if(AT(grid, i, j)== AT(pEndState->grid, ii, jj)){

h += abs(ijj);int g = moves, h = 0;for(int i = 0;i < 3;++i){

for(int j = 0;j < 3;++j){

//if(AT(grid, i, j)!= AT(pEndState->grid, i, j))// ++h;

if(AT(grid, i, j)== SPACE)continue;if(!pEndState)return;

}

}

}

} } } this->value = g + h;//求该状态的逆序数 //逆序数定义为:

//

不计空格,将棋盘按顺序排列,//

对于grid[i],存在jgrid[i],即为逆序。//

所有棋子的逆序总数为逆序数。int State::getReversedCount(){

}

/*=====================Methods for class “NineGrid”=====================*/ //显示信息

void NineGrid::ShowInfo(){

}

//构造函数

NineGrid::NineGrid(string &start, string &dest): startState(start), endState(dest)cout<<“************************************************”<

} return count;

} if(grid[i] > grid[j])++count;int count = 0;for(int i = 0;i < 9;++i){

if(grid[i] == SPACE)

continue;if(grid[j] == SPACE)continue;for(int j = 0;j < i;++j){

{

}

//当初始状态和目标状态的逆序数的奇偶性相同时,问题才有解 bool NineGrid::compareReversed(){ 2;}

//解决问题

bool NineGrid::solve(){

}

//实施一步决策,将得到的新状态添加到列表,返回是否达到目标状态

} print(NULL);return false;

} //从当前状态开始决策

for(int i = 0;i < 4;++i){

} Move move =(Move)i;if(nowState->check(move)){

} if(takeMove(nowState, move))

return true;

openList.push_back(new State(startState));while(!openList.empty()){

//获取一个状态为当前状态

State *nowState = openList.back();openList.pop_back();closeList.push_back(nowState);cout<<“==”<

cout<<“初始状态和目标状态的逆序数的奇偶性不同,问题无解!”<

bool NineGrid::takeMove(State *nowState, Move move){

}

//检查给定状态是否存在于列表中

State* NineGrid::findInList(vector &listToCheck, State &state){

}

//根据达到的目标状态,回溯打印出求解过程 void NineGrid::print(State *endState){

cout<<“Search successed!”<

addSymptom(pDisease, strInput);} else { ioFile.close();return true;//添加一个疾病,返回此疾病信息的指针

Disease* Expert::addDisease(const string &name){

}

//添加疾病的症状

void Expert::addSymptom(Disease *disease,const string &symptom){ }

//诊断函数

void Expert::diagnosis(){

cout<<“【症状询问】”<请输入症状:(或”不确定“以开始模糊搜索)”<>symptomInput;//用户输入的第一个症状 string symptomInput;//用户有的症状和没有的症状

vector symptomHave, symptomNotHave;//搜索的结果列表

vector findList;disease->symptomList.push_back(symptom);Disease disease;disease.name = name;m_DiseaseList.push_back(disease);return &m_DiseaseList.back();

for(vector::iterator ite = findList.begin();ite!=

bool remove = false;//是否从findList列表中排除本疾病

for(unsigned int j = 0;j <(*ite)->symptomList.size();++j){

Disease *pDisease = *ite;if(find(symptomNotHave.begin(), symptomNotHave.end(),//在symptomNotHave列表中找到此症状,直接排除 remove = true;break;findList.end();){ if(symptomInput == “不确定”){

} //添加所有疾病到findList列表中

for(unsigned int i = 0;i < m_DiseaseList.size();++i){ } //添加有此症状的疾病到findList列表中

for(unsigned int i = 0;i < m_DiseaseList.size();++i){

} //添加输入的症状到symptomHave列表中 symptomHave.push_back(symptomInput);Disease *pDisease = &m_DiseaseList[i];for(unsigned int j = 0;j < pDisease->symptomList.size();++j){

} if(symptomInput == pDisease->symptomList[j]){ } findList.push_back(pDisease);findList.push_back(&m_DiseaseList[i]);} else { pDisease->symptomList[j])!= symptomNotHave.end()){ } else if(find(symptomHave.begin(), symptomHave.end(),//在symptomHave,symptomNotHave列表中不存在这个症状,则询问 if(optionSelect(“->是否有症状”“ + pDisease->symptomList[j] +

} //询问得知有此症状,添加症状到symptomHave列表中 symptomHave.push_back(pDisease->symptomList[j]);//询问得知没有此症状,添加症状到symptomNotHave列表中,并排除symptomNotHave.push_back(pDisease->symptomList[j]);remove = true;break;pDisease->symptomList[j])== symptomHave.end()){ ”“?n(y/n): ”)){ } else { 此疾病

}

} } } if(remove){

} //需要排除此疾病

ite = findList.erase(ite);//迭代器后移 ++ite;} else { cout<

} cout<知识库中未找到匹配的记录!”<根据已有的知识库,可能的疾病为:”<

for(unsigned int i = 0;i < findList.size();++i){

} cout<name;if(i!= findList.size()-1)cout<<“, ”;cout<

bool Expert::optionSelect(const string &question){

cout<>option;

switch(option){ case 'Y': case 'y': return true;case 'N': case 'n': } return false;

} return false;

Disease.txt [疾病1] 症状A 症状B 症状C 症状D

[疾病2] 症状A 症状B 症状C

[疾病3] 症状A 症状B 症状D 症状E

[疾病4] 症状A 症状C 症状D

[疾病5] 症状B 症状C 症状D 症状E

[疾病6] 症状A 症状B

[疾病7] 症状A 症状C 症状E

[疾病8] 症状A 症状D

[疾病9] 症状B 症状C 症状E

[疾病10] 症状B 症状D

[疾病11] 症状C 症状D 症状E

六、实验结果

第三篇:人工智能发展史解读

人工智能学科诞生于20世纪50年代中期,当时由于计算机的产生与发展,人们开始了具有真正意义的人工智能的研究。(虽然计算机为AI提供了必要的技术基础,但直到50年代早期人们才注意到人类智能与机器之间的联系.Norbert Wiener是最早研究反馈理论的美国人之一.最熟悉的反馈控制的例子是自动调温器.它将收集到的房间温度与希望的温度比较,并做出反应将加热器开大或关小,从而控制环境温度.这项对反馈 回路的研究重要性在于: Wiener从理论上指出,所有的智能活动都是反馈机制的结果.而反馈机制是有可 能用机器模拟的.这项发现对早期AI的发展影响很大。)

1956年夏,美国达特莫斯大学助教麦卡锡、哈佛大学明斯基、贝尔实验室申龙、IBM公司信息研究中心罗彻斯特、卡内基——梅隆大学纽厄尔和赫伯特.西蒙、麻省理工学院塞夫里奇和索罗门夫,以及IBM公司塞缪尔和莫尔在美国达特莫斯大学举行了以此为其两个月的学术讨论会,从不同学科的角度探讨人类各种学习和其他职能特征的基础,并研究如何在远离上进行精确的描述,探讨用机器模拟人类智能等问题,并首次提出了人工智能的术语。从此,人工智能这门新兴的学科诞生了。这些青年的研究专业包括数学、心理学、神经生理学、信息论和电脑科学,分别从不同角度共同探讨人工智能的可能性。他们的名字人们并不陌生,例如申龙是《信息论》的创始人,塞缪尔编写了第一个电脑跳棋程序,麦卡锡、明斯基、纽厄尔和西蒙都是“图灵奖”的获奖者。

这次会议之后,在美国很快形成了3个从事人工智能研究的中心,即以西蒙和纽威尔为首的卡内基—梅隆大学研究组,以麦卡锡、明斯基为首的麻省理工学院研究组,以塞缪尔为首的IBM公司研究组。随后,这几个研究组相继在思维模型、数理逻辑和启发式程序方面取得了一批显著的成果:

(1)1956年,纽威尔和西蒙研制了一个“逻辑理论家“(简称LT)程序,它将每个问题都表示成一个树形模型,然后选择最可能得到正确结论的那一枝来求解问题,证明了怀特黑德与罗素的数学名著《数学原理》的第2章中52个定理中的38个定理。1963年对程序进行了修改,证明了全部定理。这一工作受到了人们的高度评价,被认为是计算机模拟人的高级思维活动的一个重大成果,是人工智能的真正开端。

(2)1956年,塞缪尔利用对策论和启发式搜索技术编制出西洋跳棋程序Checkers。该程序具有自学习和自适应能力,能在下棋过程中不断积累所获得的经验,并能根据对方的走步,从许多可能的步数中选出一个较好的走法。这是模拟人类学习过程第一次卓有成效的探索。这台机器不仅在1959年击败了塞缪尔本人,而且在1962年击败了美国一个州的跳棋冠军,在世界上引起了大轰动。这是人工智能的一个重大突破。

(3)1958年,麦卡锡研制出表处理程序设计语言LISP,它不仅可以处理数据,而且可以方便的处理各种符号,成为了人工智能程序语言的重要里程碑。目前,LISP语言仍然是研究人工智能何开发智能系统的重要工具。

(4)1960年纽威尔、肖和西蒙等人通过心理学实验,发现人在解题时的思维过程大致可以分为3个阶段:1。首先想出大致的解题计划;2。根据记忆中的公理、定理和解题规划、按计划实施解题过程;3.在实施解题过程中,不断进行方法和目标分析,修改计划。这是一个具有普遍意义的思维活动过程,其中主要是方法和目的的分析。(也就是人们在求解数学问题通常使用试凑的办法进行的试凑是不一定列出所有的可能性,而是用逻辑推理来迅速缩小搜索范围的办法进行的),基于这一发现,他们研制了“通用问题求解程序GPS”,用它来解决不定积分、三角函数、代数方程等11种不同类型的问题,并首次提出启发式搜索概念,从而使启发式程序具有较普遍的意义。

(5)1961年,明斯基发表了一篇名为《迈向人工智能的步骤》的论文,对当时人工智能的研究起了推动作用。

正是由于人工智能在20世纪50年代到60年代的迅速发展和取得的一系列的研究成果,使科学家们欢欣鼓舞,并对这一领域给予了过高的希望。纽威尔和西蒙在1958年曾作出以下预言:

①不出十年,计算机将成为世界象棋冠军,除非规定不让它参加比赛;

②.不出十年,计算机将发现并证明那时还没有被证明的数学定理;

③.不出十年,计算机将谱写出具有较高美学价值并得到评论家认可的乐曲;

④不出十年,大多数心理学家的理论将采用计算机程序来形成。

非常遗憾的是,到目前为止,这样的预言还没有一个得到完全的实现,人工智能的研究状况比纽威尔和西蒙等科学家的设想要复杂和艰难的多。事实上,到了20世纪70年代初,人工智能在经历一段比较快速的发展时期后,很快就遇到了许多问题。这些问题主要表现在:

(1)1965年鲁宾逊发明了归结(消解)原理,曾被认为是一个重大的突破,可是很快这种归结法能力有限,证明两个连续函数之和还是连续函数,推证了十万步竟还没有得证。

(2)塞缪尔的下棋程序,赢得了周冠军后,没能赢全国冠军。

(3)机器翻译出了荒谬的结论。如从英语→俄语→英语的翻译中,又一句话:“The spirit is willing but the flesh is weak”(心有余而力不足),结果变成了”The wine is good but the meat is spoiled”(酒是好的,肉变质了),闹出了笑话。

(4)大脑约有10的15次方以上的记忆容量,此容量相当于存放几亿本书的容量,现有的技术条件下在机器的结构上模拟人脑是不大可能的。

(5)来自心理学、神经生理学、应用数学、哲学等各界的科学家们对人工智能的本质、基本原理、方法及机理等方面产生了质疑和批评。

由于人工智能研究遇到了困难,使得人工智能在20世纪70年代初走向低落。但是,人工智能的科学家没有被一时的困难所吓倒,他们在认真总结经验教训的基础上,努力探索使人工智能走出实验室,走向实用化的新路子,并取得了令人鼓舞的进展。特别是专家系统的出现,实现了人工智能从理论研究走向实际应用,从一般思维规律探索走向专门知识应用的重大突破,是人工智能发展史上的重大转折,将人工智能的研究推向了新高潮。下面是几个又代表性的专家系统:

(1)1968年斯坦福大学费根鲍姆教授和几位遗传学家及物理学家合作研制了一个化学质谱分析系统(DENDARL),该系统能根据质谱仪的数据和核磁谐振的数据,以及有关化学知识推断有机化合物的分子结构,达到了帮助化学家推断分子结构的作用。这是第一个专家系统,标志着人工之能从实验室走了出来,开始进入实际应用时代。

(2)继DENDARAL系统之后,费根鲍姆领导的研究小组又研制了诊断和治疗细菌感染性血液病的专家咨询系统MYCIN。经专家小组对医学专家、实习医师以及MYCIN行为进行正式测试评价,认为MYCIN的行为超过了其他所有人,尤其在诊断和治疗菌血症和脑膜炎方面,显示了该系统作为临床医生实际助手的前途。从技术的角度来看,该系统的特点是:1。使用了经验性知识,用可信度表示,进行不精确推理。2.对推理结果具有解释功能,时系统是透明的。3.第一次使用了知识库的概念。正是由于MYCIN基本解决了知识表示、知识获取、搜索策略、不精确推理以及专家系统的基本结构等重大问题(是怎样解决的呢?),对以后的专家系统产生了很大的影响。

(3)1976年,斯坦福大学国际人工智能中心的杜达等人开始研制矿藏勘探专家系统PROSPECTOR,它能帮助地质学家解释地质矿藏数据,提供硬岩石矿物勘探方面的咨询,包括勘探测评,区域资源估值,钻井井位选择等。该系统用语义网络表示地质知识,拥有15中矿藏知识,采用贝叶斯概率推理处理不确定的数据和知识。PROSPECTOR系统于1981年开始投入实际使用,取得了巨大的经济效益。例如1982年,美国利用该系统在华盛顿发现一处矿藏,据说实用价值可能超过1亿美元。

(4)美国卡内基—梅隆大学于20世纪70年代先后研制了语音理解系统HEARSAY-I加入HEARSAY-II,它完成从输入的声音信号转换成字,组成单词,合成句子,形成数据库查询语句,再到情报数据库中去查询资料。该系统的特点是采用“黑板结构”这种新结构形式,能组合协调专家的知识,进行不同抽象级的问题求解。

在这一时期,人工智能在新方法、程序设计语言、知识表示、推理方法等方面也取得了重大进展。例如70年代许多新方法被用于AI开发,著名的如Minsky的构造理论.另外David Marr提出了机器视觉方面的新理论,例如,如何通过一副图像的阴影,形状,颜色,边界和纹理等基本信息辨别图像.通过分析这些信息,可以推断出图像可能是什么,法国马赛大学的柯尔麦伦和他领导的研究小组于1972年研制成功的第一个PROLOG系统,成为了继LISP语言之后的另一种重要的人工智能程序语言;明斯基1974年提出的框架理论;绍特里夫于1975年提出并在MYCIN中应用的不精确推理;杜达于1976年提出并在PROSPECTOR中应用的贝叶斯方法;等等

人工智能的科学家们从各种不同类型的专家系统和知识处理系统中抽取共性,总结出一般原理与技术,使人工智能又从实际应用逐渐回到一般研究。围绕知识这一核心问题,人们重新对人工智能的原理和方法进行了探索,并在知识获取、知识表示以及知识在推理过程中的利用等方面开始出现一组新的原理、工具和技术。1977年,在第五届国际人工智能联合会(IJCAI)的会议上,费根鲍姆教授在一篇题为《人工智能的艺术:知识工程课题及实例研究》的特约文章中,系统的阐述了专家系统的思想,并提出了知识工程(KnowledgeEngineering)的概念。费根鲍姆认为,知识工程是研究知识信息处理的学科,它应用人工智能的原理和方法,对那些需要专家知识才能解决的应用难题提供了求解的途径。恰当的运用专家知识的获取、表示、推理过程的构成与解释,是设计基于知识的系统的重要技术问题。至此,围绕着开发专家系统而开展的相关理论、方法、技术的研究形成了知识工程学科。知识工程的研究使人工智能的研究从理论转向应用,从基于推理的模型转向基于知识的模型。

为了适应人工智能和知识工程发展的需要,在政府的大力支持下,日本于1982年开始了为期10年的“第五代计算机的研制计划”,即“知识信息处理计算机系统KIPS”,总共投资4.5亿美元。它的目的是使逻辑推理达到数值运算那样快。日本的这一计划形成了一股热潮,推动了世界各国的追赶浪潮。美国、英国、欧共体、苏联等都先后制订了相应的发展计划。随着第五代计算机的研究开发和应用,人工智能进入一个兴盛时期,人工智能界一派乐观情绪。

然而,随着专家系统应用的不断深入,专家系统自身存在的知识获取难、知识领域窄、推理能力弱、只能水平低、没有分布式功能、实用性差等等问题逐步暴露出来。日本、美国、英国和欧洲所制订对那些针对人工智能的大型计划多数执行到20世纪80年代中期就开始面临重重困难,已经看出达不到预想的目标。进一步分析便发现,这些困难不只是个别项目的制订又问题,而是涉及人工智能研究的根本性问题。总的来讲是两个问题:一是所谓的交互(Interaction)问题,即传统方法只能模拟人类深思熟虑的行为,而不包括人与环境的交互行为。另一个问题是扩展(Scaling up)问题,即所谓的大规模的问题,传统人工智能方法只适合于建造领域狭窄的专家系统,不能把这种方法简单的推广到规模更大、领域更宽的复杂系统中去。这些计划的失败,对人工智能的发展是一个挫折。

尽管经历了这些受挫的事件,AI仍在慢慢恢复发展.新的技术在日本被开发出来,如在美国首创的模糊逻辑,它可以从不确定的条件作出决策;还有神经网络,被视为实现人工智能的可能途径.1982年后,人工神经网络像雨后春笋一样迅速发展起来,给人们带来了新的希望。人工神经网络的主要特点是信息的分布存储和信息处理的并行化,并具有自组织自学习能力,这使人们利用机器加工处理信息有了新的途径和方法,解决了一些符号方法难以解决的问题,使人工智能的学术界兴起了神经网络的热潮。1987年美国召开了第一次神经网络国际会议,宣布新学科的诞生。1988年以后,日本和欧洲各国在神经网络方面的投资逐步增加,促进了该领域的研究。但是随着应用的深入,人们又发现人工神经元网络模型和算法也存在问题。

20世纪80年代末,以美国麻省理工学院布鲁克斯(R.A.Brooks)教授为代表的行为主义学派提出了“无须表示和推理”的智能,认为智能只在与环境的交互中表现出来,并认为研制可适应环境的“机器虫”比空想智能机器人要好。以后,人工智能学术界充分认识到已有的人工智能方法仅限于在模拟人类智能活动中使用成功的经验知识处理简单的问题,开始在符号机理与神经网机理的结合及引入Agent系统等方面进一步开展研究工作。20世纪90年代,所谓的符号主义、连接主义和行动主义3种方法并存。对此,中国学者认为这3种方法各有优缺点,他们提出了综合集成的方法,即不同的问题用不同的方法来解决,或用联合(混合、融合)的方法来解决,再加上人工智能系统引入交互机制,系统的智能水平将会大为提高。

总而言之,尽管人工智能的发展经历了曲折的过程,但它在自动推理、认知建模、机器学习、神经元网络、自然语言处理、专家系统、智能机器人等方面的理论和应用上都取得了称得上具有“智能”的成果。许多领域将知识和智能思想引入到自己的领域,使一些问题得以较好的解决。应该说,人工智能的成就是巨大的,影响是深远的。

读书的好处

1、行万里路,读万卷书。

2、书山有路勤为径,学海无涯苦作舟。

3、读书破万卷,下笔如有神。

4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文

5、少壮不努力,老大徒悲伤。

6、黑发不知勤学早,白首方悔读书迟。——颜真卿

7、宝剑锋从磨砺出,梅花香自苦寒来。

8、读书要三到:心到、眼到、口到

9、玉不琢、不成器,人不学、不知义。

10、一日无书,百事荒废。——陈寿

11、书是人类进步的阶梯。

12、一日不读口生,一日不写手生。

13、我扑在书上,就像饥饿的人扑在面包上。——高尔基

14、书到用时方恨少、事非经过不知难。——陆游

15、读一本好书,就如同和一个高尚的人在交谈——歌德

16、读一切好书,就是和许多高尚的人谈话。——笛卡儿

17、学习永远不晚。——高尔基

18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向

19、学而不思则惘,思而不学则殆。——孔子

20、读书给人以快乐、给人以光彩、给人以才干。——培根

第四篇:人工智能论文解读

人工智能结课论文

系别:计算机科学与技术系

班级:姓名:于静学号:

13计算机专接本一班

知识处理

***0

摘要:进入2l 世纪,计算机硬件和软件更新的速度越来越快,计算机这个以往总给人以冷冰冰的机器的形象也得到了彻底的改变。人机交互的情形越来越普遍,计算机被人类赋予了越来越多的智能因素。伴随着人类把最新的计算机技术应用于各个学科,对这些学科的认知也进入了日新月异的发展阶段,促使大量的新的研究成果不断涌现。例如:“人机大战”中深蓝计算机轻松的获胜、人类基因组排序工作的基本完成、人类大脑结构性解密、单纯器官性克隆的成功实现等等。随着计算机这个人类有史以来最重要的工具的不断发展,伴随着不断有新理论的出现,人类必须重新对它们进行分析和审视。知识处理是人工智能这一科学领域的关键问题。本文对知识处理的核心问题之——识的表示进行了全面的综述目前流行的知识表达方式不下十种,在此只介绍一阶谓词逻辑、产生式、语义网络、框架、混合等目前最常用的知识表示方法。并对其进行了优缺点分析及简单对比。最后对知识表示的发展趋向作出了展望。

关键词:知识

人工智能(AI)

知识表达式

一阶谓词逻辑

产生式 语义网络

框架

一、知识和知识的表示

1、知识的概念

知识是人类世界特有的概念,他是人类对客观世界的一种比较准确、全面的认识和理解的结晶。(1)知识只有相对正确的特性。常言道:实践出真理。只是源于人们生活、学习与工作的实践,知识是人们在信息社会中各种实践经验的汇集、智慧的概括与积累。只是爱源于人们对客观世界运动规律的正确认识,是从感知认识上升成为理性认识的高级思维劳动过程的结晶,故相应于一定的客观环境与条件下,只是无疑是正确的。然而当客观环境与条件发生改变时,知识的正确性就接受检验,必要时就要对原来的认识加以修改和补充,一至全部更新而取而代之。例如知道1543年哥白尼学说问世之前,人们一直都以为地球是宇宙的核心;再有:人们都知道一个关于“瞎子摸象”的故事,它通俗地说明了完整的只是形式是一个复杂的智能过程。通常人们获取知识的重要手段是:利用信息,把各种信息提炼、概括并关联在一起,就形成了知识。而利用信息关联构成知识的形式有多种多样。

(2)知识的确定与不确定性如前说述,知识有若干信息关联的结构组成,但是,其中有的信息是精确的,有的信息却是不精确的。这样,则由该信息结构形成的知识也有了确定与不确定的特征。例如,在我国中南地区,根据天上出现彩虹的方向及其位置,可以预示天气的变化。有谚语曰:“东边日(晴天),西边雨。”但是,这只是一种常识性经验,并不能完全肯定或否定。再如:家有一头秀发,一时两鬓如霜。我们则认为家一定是年轻人,乙就是老年人嘛?不能完全肯定,因为相反的事例是很多的。比如,当年的白毛女就不是老人,而现在六十多岁的演员有一头黑发也不足为奇。

2、知识表达及其映像原理

智能机器系统如同智能生物一样,在运用知识进行信息交流或只能问题求解时,都需要预先进行知识表示。进而实现知识调用,达到利用知识求解问题的目的。因而只是表示是知识信息处理系统必不可少的关键环节。对智能机器系统而言只是表示,实际上就是对知识的一种描述或约定。其本质,就是采用某种技术模式,八所要求解决的问题的相关知识,映射为一种便于找到该问题解的数据结构。对知识进行表示的过程,实质上就是把相关只是映射(或称为变换:Transformation;或称为映像:Mapping;或称为编码:Coded)为该数据结构的过程。如图1。

图1 只是表达及其映射原理

如图,其目标是要对复杂的智能性问题实现机器求解,但机器直接对原始问题求解难度很大,可采用知识表达的映射原理,把原始问题映射为它的一种同构或同态问题,然后在对同构或同态问题求出它的解答,则相对容易而方便。顺便指出:同构解答与原始问题有相同的形式解,然而对于同态问题,如果得到原始解,只需对同台解答再施行反运算即可。在自然科学实际应用研究中,利用映射(称之为变换)原理迂回求解的思想,是一种非常有效而广为使用的重要手段。目前比较常见的知识表达方法主要有:常用的知识表示方法:一阶谓词逻辑表示法,产生式表示法,框架表示法,语义网络表示法,脚本表示法,过程表示法,面向对象表示法,神经网络表示法。如图2

二、常用知识表示法:

2.1一阶谓词逻辑表示法:

一阶谓词逻辑表示法是目前应用最广的方法之一,在AI系统上已经得到了应用。它是通过分析命题内容和谓词逻辑,尽可能正确地表述它的各种意境的过程。知识的谓词逻辑表示符合人的思维习惯,可读性好,逻辑关系表达简便。使用谓词逻辑既便于表达概念、状态、属性等事实性知识,又能方便地采用谓词公式的表达形式,进行各种智能行为的过程性描述与演绎推理。一阶谓词的一般形式为P(x1,x2,„,xn)其中P是谓词名,xi为个体常量、变元,或函数。例如:STUDENT(zhangsan):zhangsan是学生

STUDENT(x):x是学生Greater(x,5):x>5TEACHER(father(Wanghong)):王宏的父亲是教师。在一阶谓词表示法中连接词是非常重要的其中: 连接词:¬、∨、∧、→、↔ 量词:∀、∃

(∀x)P(x)为真、为假的定义

(∃x)P(x)为真、为假的定义

结合具体事例可以看到一阶谓词逻辑在知识表示法中的优越性: 李明是计算机系的学生,但他不喜欢编程。定义谓词:

COMPUTER(x):x是计算机系的 学生

LIKE(x,y):x喜欢y 谓词公式为:

LIKE(liming,programming)COMPUTER(liming)∧

谓词逻辑是一种传统经典也是最基本的形式化方法。谓词逻辑知识表示规范性严,逻辑性强,自然性好,推理过程严密,易于实现。这些优良特性使得谓词逻辑最早用于人工智能机器定理证明,并获得了成功。但是必须看到,谓词逻辑属于标准的二值(T与F)逻辑,难以直接进行不确定性问题的处理。对于复杂系统的求解问题,容易陷入冗长演绎推理中,常常不可避免地带来求解效率低,甚至产生“组合爆炸”问题。因此,针对谓词逻辑,尚待人们不断加以改进,以寻求自然性好而效率更高的技术方法。

2.2产生式表示法

目前,产生式表示方法是专家系统的第一选择的知识表达方式。是美国数学家Post在1943年提出了一种计算形式体系里所使用的术语。产生式表示的基本形式为:(1)确定性知识的表示:

产生式形式:P→Q或者IF P THEN Q 它的含义:如果前提P满足,则可以推出结论Q或执行Q操作。例如:IF CLEAR(B)AND HANDEMPTYTHEN Pickup(B)如果积木B上是空的,且机械手空,则机械手从桌面上抓起积木B。(2)不确定知识的表示:

产生式形式:P→Q(置信度)或者IF P THEN Q(置信度)在不确定推理中,当已知事实与前提P不能精确匹配时,只要按照“置信度”的要求达到一定的相似度,就认为已知事实与前提条件相匹配,再按照一定的算法将这种可能性(不确定性)传递到结论Q。

产生式表示法其优点在于模块性。规则与规则之间相互独立灵活性。知识库易于增加、修改、删除自然性。方便地表示专家的启发性知识与经验透明性。易于保留动作所产生的变化、轨迹,但仍有不少缺点:知识库维护难。效率低。为了模块一致性理解难。由于规则一致性彼此之间不能调用。

2.3 语义网络表达式

语义网络是人工智能常用的知识表示法之一。是一种使用概念及其语义关系来表达知识的有向图。它作为人类联想记忆的一个显示心理学模型,是由J.R.Quillian于1968年在他的博士论文中首先提出,并用于自然语言处理。语义网络结构共使用了三种图形符号:框、带箭头及文字标识的线条和文字标识线。分别称为:(1)节(结)点;弧(又叫做边或支路);指针。

(2)节点(Node):也称为结点。用圆形、椭圆、菱形或长方形的框图来表示,用来表示事物的名称、概念、属性、情况、动作、状态等。

(3)弧(Arc):这是一种有向弧,又称之为支路(Branch)。节点之间用带箭头及文字标识的有向线条来联结,用以表示事物之间的结构,即语义关系。

(4)指针(Pointer):也叫指示器。是在节点或者弧线的旁边,另外附加必要的线条及文字标识,用来对节点、弧线和语义关系作出相宜的补充、解释与说明。

语义网络是一种结构化知识表示方法,具有表达直观,方法灵活,容易掌握和理解的特点。概括起来,主要优点在于采用语义关系的有向图来连接,语义、语法、词语应用兼顾,具有描述生动,表达自然,易于理解等。

虽然语义网络知识表示和推理具有较大的灵活性和多样性,但是没有公认严密的形式表达体系,却不可避免地带来了非一致性和程序设计与处理上的复杂性,这也是语义网络知识表示尚待深入研究解决的一个课题。

2.4.框架表式式

框架表示法诞生于1975年,这也是一种结构化的知识表示方法,并已在多种系统中得到成功的应用。框架理论是由人工智能科学创始人之一,美国著名的人工智能学者M.L.Minsky(明斯基)提出来的。

自然界各种事物都可用框架(Frame)组织构成。每个被定义的框架对象分别代表着不同的特殊知识结构,从而可在大脑或计算机中表示、存储并予以认识、理解和处理。框架是一种被用来描述某个对象(诸如一个事物、一个事件或一个概念)属性知识的数据结构。下面是一个关于“大学教师”的框架设计模式。

n

框架名:

〈大学教师〉 n

姓名:

单位(姓,名)n

年龄:

单位(岁)

n

性别:

范围((男,女)缺省:男)n

学历:

范围(学士,硕士,博士)

n

职称:

范围((教授,副教授,讲师,助教)缺省:讲师)n

部门:

范围(学院(或系、处)n

住址:

〈住址框架〉 n

工资:

〈工资框架〉 n

参加工作时间:

单位(年,月)

n

健康状况:

范围(健康,一般,较差)n

其它:

范围(〈个人家庭框架〉,〈个人经济状况框架〉)

上述框架共有十一个槽,分别描述了关于“大学教师”的十一个方面的知识及其属性。在每个槽里都指定了一些说明性的信息,表明了相关槽的值的填写要有某些限制。框架表示法支持上层框架概念抽象和下层框架信息继承共享的思想,不仅减少了框架信息和属性知识表达的冗余,而且保证了上、下层框架知识表达的一致性。

主要缺点:框架表示法过于死板,难以描述诸如机器人纠纷等类问题的动态交互过程生动性。

三、各知识表达式的比较与展望

以上若知识表达方法,绝大多数在应用中得到了很好的应用。但实际工作中,如果要建立一个人工智能系统、专家系统时,还是要根据具体情况提出一个混合性的知识表达方式。每一种知识表示方法各有特点,而且适用的领域也不同:

(1)谓词逻辑方法只适用于确定性、陈述性、静态性知识,而对动态的、变化性、模糊性知识则很难表示。

(2)产生式规则方法推理方法太单一,如果前提条件太多,或规则条数太多,则推理的速度将慢得惊人。

(3)语义网络方法表达的知识面比较窄。(4)框架方法表示的知识横向关系不太明确。(纵向从属继承关系很明确)

因此,对于复杂的、深层次的知识,应根据需要表示知识的特征,来决定用二种或三种方法联合表示,例如:

(1)逻辑与框架:框架里的槽值可以对应于谓词项。

(2)语义网络与框架:结点对应与框架,结点的参数就是框架的槽值。

(3)产生式与框架:框架的槽值对应于一条产生式规则。与神经网络结合。

参考文献:

[1] 蔡之华;模糊Petri网及知识表示 [J];计算机应用与软件;1994年03期 [2].张科杰,袁国华,彭颖红; 知识表示及其在机械工程设计中的应用探讨[J];

机械设计;2004年06期。

[3].刘晓霞。新的知识表示方法——概念图[J]。航空计算技术。1997(4)。[4].王永庆人工智能原理与方法[M]。西安交通大学出版社。1998。

读书的好处

1、行万里路,读万卷书。

2、书山有路勤为径,学海无涯苦作舟。

3、读书破万卷,下笔如有神。

4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文

5、少壮不努力,老大徒悲伤。

6、黑发不知勤学早,白首方悔读书迟。——颜真卿

7、宝剑锋从磨砺出,梅花香自苦寒来。

8、读书要三到:心到、眼到、口到

9、玉不琢、不成器,人不学、不知义。

10、一日无书,百事荒废。——陈寿

11、书是人类进步的阶梯。

12、一日不读口生,一日不写手生。

13、我扑在书上,就像饥饿的人扑在面包上。——高尔基

14、书到用时方恨少、事非经过不知难。——陆游

15、读一本好书,就如同和一个高尚的人在交谈——歌德

16、读一切好书,就是和许多高尚的人谈话。——笛卡儿

17、学习永远不晚。——高尔基

18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向

19、学而不思则惘,思而不学则殆。——孔子

20、读书给人以快乐、给人以光彩、给人以才干。——培根

第五篇:人工智能实验报告

人工智能课内实验报告

(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 unsigned int i;void Monkey_Go_Box(unsigned char x, unsigned char y){

printf(“Step %d:monkey从%c走到%cn”, ++i, x, y);//x表示猴子的位置,y为箱子的} void Monkey_Move_Box(char x, char y){ 位置

printf(“Step %d:monkey把箱子从%c运到%cn”, ++i, x, y);//x表示箱子的位置,y为} void Monkey_On_Box(){ 香蕉的位置

printf(“Step %d:monkey爬上箱子n”, ++i);} void Monkey_Get_Banana(){ printf(“Step %d:monkey摘到香蕉n”, ++i);} void main(){

unsigned char Monkey, Box, Banana;printf(“********智能1501班**********n”);printf(“********06153034************n”);printf(“********刘少鹏**************n”);printf(“请用a b c来表示猴子箱子香蕉的位置n”);printf(“Monkeytboxtbananan”);scanf(“%c”, &Monkey);getchar();printf(“t”);scanf(“%c”, &Box);getchar();printf(“tt”);scanf(“%c”, &Banana);getchar();printf(“n操作步骤如下n”);if(Monkey!= Box){ Monkey_Go_Box(Monkey, Box);} if(Box!= Banana){ Monkey_Move_Box(Box, Banana);} Monkey_On_Box();Monkey_Get_Banana();printf(“n”);

getchar();}

五、实验结果相关截图

六、心得体会

通过本次实验,我初步了学会了使用VC的新建工程,并且进行简单的程序编写。此外我还学会如何使用一些谓词来解决生活中的一些简单问题,并且用VC编程给出具体的操作步骤,感觉对VC编程有了新的认识。在实验中我也遇到过许多问题,比如在我写完代码进行编译时总是会出现一个错误“ fatal error C1010: 在查找预编译头时遇到意外的文件结尾,是否忘记了向源中添加“#include ‘stdafx.h’”关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该项目的每一个cpp结尾的文件属性中设置不使用预编译头即可。在这个过程中也锻炼了自己解决问题的能力。

人工智能课内实验报告

实验2:编程实现简单动物识别系统的知识表示

学 院: 自动化学院

班 级: 智能1501 姓 名: 刘少鹏(33)学 号: 06153034 日 期: 2017-3-13 10:15-12:00

实验2:编程实现简单动物识别系统的知识表示

一、实验目的

1、理解和掌握产生式知识表示方法;

2、能够通过VC编程语言实现产生式系统的规则库。

二、实验内容

1、以动物识别系统的产生式规则为例;

2、用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。

三、实验步骤

1、确定需要识别的动物及其属性

本次实验的简单动物识别系统总共能识别7种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟和信天翁。

2、建立识别七种动物识别系统的规则

3、选定编程语言并确定综合数据库和规则库结构(1)选用C语言作为编程语言

(2)综合数据库的建立(3)规则库的建立

四、程序源代码

#include #include using namespace std;struct RULES

{

int count;char pre[255];char back[255];int mark;};void check();RULES r[100] = {

{ 1,“有毛发”,“哺乳动物”,0 }, { 1,“有奶”,“哺乳动物”,0 }, { 1,“有羽毛”,“鸟”,0 }, { 2,“会飞&下蛋&”,“鸟”,0 }, { 1,“吃肉”,“食肉动物”,0 },//所有规则静态数据库

{ 3,“有锋利的牙齿&有爪&眼睛盯着前方&”,“食肉动物”,0 }, { 2,“哺乳动物&有蹄&”,“有蹄类哺乳动物”,0 }, { 2,“哺乳动物&反刍&”,“有偶蹄类哺乳动物”,0 }, { 4,“哺乳动物&食肉动物&黄褐色&有暗斑&”,“金钱豹”,0 }, { 4,“哺乳动物&食肉动物&黄褐色&黑色条纹&”,“老虎”,0 }, { 4,“有蹄类哺乳动物&有长脖子&有长腿&有暗斑&”,“长颈鹿”,0 }, { 2,“有蹄类哺乳动物&黑条纹&”,“斑马”,0 }, { 5,“鸟&不会飞&有长脖子&有长腿&黑白色&”,“鸵鸟”,0 }, { 4,“鸟&不会飞&会游泳&黑白色&”,“企鹅”,0 }, { 2,“鸟&会飞&”,“信天翁”,0 }, { 1,“反刍”,“哺乳动物”,0 }

};int number;int m;int cat = 15;int a;int length;void input(){

//输入的事实长度

string f[255];

//输入的事实数组

while(1){

cat++;cout << “number” << endl;cin >> r[cat].count;cout << “输入事实,两种以上的事实请在每个事实后加上‘&’符号” << endl;cin >> r[cat].pre;cout << “输入结果” << endl;cin >> r[cat].back;r[cat].mark = 0;while(1){

cout << “输入“1”继续添加规则,输入“2”查看规则库” << endl;int p;cin >> p;if(p == 1){ } else { if(p == 2){ input();

} } check();else { } cout << “输入错误,重新输入” << endl;} } void delate(){ }

cout << “输入要删除的条数” << endl;int bar;cin >> bar;for(int t = 0;t <= cat;t++){ r[bar'0' >= 0 && temp[i]'0' >= 0 && temp[j]'0';target[j] = temp[j]3);break;case 2: /* down */

if(blank<6)swap(m + blank, m + blank + 3);break;case 3: /* left */

if(blank!= 0 && blank!= 3 && blank!= 6)swap(m + blank, m + blank1][y1][y-1] =-1;

bool flag = true;int i = 0;for(i = 0;i<3;i++)for(int j = 0;j<3;j++)if(s.QP[i][j] == 0)flag = false;if(flag)return NO_BLANK;if(IsWin(s)==-1)return-MAX_NUM;if(IsWin(s)== 1)return MAX_NUM;int count = 0;for(i = 0;i<3;i++)

for(int j = 0;j<3;j++)

if(s.QP[i][j] == 0)tmpQP[i][j] = 1;else tmpQP[i][j] = s.QP[i][j];for(i = 0;i<3;i++)

count +=(tmpQP[i][0] + tmpQP[i][1] + tmpQP[i][2])/ 3;count +=(tmpQP[0][i] + tmpQP[1][i] + tmpQP[2][i])/ 3;for(i = 0;i<3;i++)count +=(tmpQP[0][0] + tmpQP[1][1] + tmpQP[2][2])/ 3;count +=(tmpQP[2][0] + tmpQP[1][1] + tmpQP[0][2])/ 3;for(i = 0;i<3;i++)

for(int j = 0;j<3;j++)

if(s.QP[i][j] == 0)tmpQP[i][j] =-1;else tmpQP[i][j] = s.QP[i][j];for(i = 0;i<3;i++)

count +=(tmpQP[i][0] + tmpQP[i][1] + tmpQP[i][2])/ 3;count +=(tmpQP[0][i] + tmpQP[1][i] + tmpQP[2][i])/ 3;for(i = 0;i<3;i++)

count +=(tmpQP[0][0] + tmpQP[1][1] + tmpQP[2][2])/ 3;count +=(tmpQP[2][0] + tmpQP[1][1] + tmpQP[0][2])/ 3;return count;return false;L1: cout << “请输入棋子的坐标xy: ”;

};

} else {

} cout << “非法输入!”;goto L1;int Tic::s_count = 0;//初始化棋盘状态节点总数,刚开始置为 class demo : public Tic { public:

demo(){} bool Judge(){

} virtual bool AutoDone(){

int a, b, i, j, m, n, max, min, x, y;if(IsWin(States[0])==-1){

} a = 0, b = 0;max =-10000;for(x = 0;x<3;x++)

for(y = 0;y<3;y++)States[11].QP[x][y] = States[0].QP[x][y];cout << “恭喜您获胜!” << endl;return true;int i, j, a = 0;for(i = 0;i<3;i++)for(j = 0;j<3;j++)if(States[0].QP[i][j] == 0)a++;if(a == 0)return true;return false;for(i = 0;i<3;i++)for(j = 0;j<3;j++){

if(States[0].QP[i][j] == 0){

a = 1;

for(x = 0;x<3;x++)

for(y = 0;y<3;y++)

}

}

States[a].QP[x][y] = States[0].QP[x][y];

States[a].QP[i][j] = 1;min = 10000;

for(m = 0;m<3;m++)

for(n = 0;n<3;n++){

}

if(States[a].QP[m][n] == 0){

}

b = 1;

for(x = 0;x<3;x++)

for(y = 0;y<3;y++)

States[10].QP[x][y] = States[a].QP[x][y];

States[10].QP[m][n] =-1;

States[10].e_fun = e_fun(States[10]);

if(States[10].e_fun

States[a].e_fun = min;if(States[a].e_fun>max){

}

max = States[a].e_fun;for(x = 0;x<3;x++)

for(y = 0;y<3;y++)

States[11].QP[x][y] = States[a].QP[x][y];for(x = 0;x<3;x++)for(y = 0;y<3;y++)States[0].QP[x][y] = States[11].QP[x][y];cout << “计算机走棋” << endl;PrintQP();if(IsWin(States[0])== 1){

} else if(IsWin(States[0])==-1){

} return false;

cout << “抱歉你输了,计算机获胜!” << endl;return true;cout << “恭喜您获胜!” << endl;return true;

};} void main(){

cout << “****项目名称:一字棋游戏的实现****” << endl;cout << “****班 级:智 能 1 5 0 1 ****” << endl;cout << “****姓 名:刘 少 鹏****” << endl;cout << “****学 号:0 6 1 5 3 0 3 4 ****” << endl;cout << “****说 明:-1代表人落子位置,1代表电脑落子位置,0代表该位置无棋子 ****” << endl;

system(“title #子棋智能小游戏”);system(“color A2”);char IsFirst;bool IsFinish;cout << “若您为先手,请输入'Y'!反之,请输入'N':” << endl;cin >> IsFirst;demo *p = new demo();p->init();cout << “棋盘的初始状态:” << endl;p->PrintQP();do {

if(!p->Judge()){

} if(p->Judge())IsFinish = true;if(IsFirst == 'Y'){

} else if(IsFirst == 'N'){

} IsFinish = p->AutoDone();if(!p->Judge()){ }

if(!IsFinish){ p->UserInput();p->PrintQP();} p->UserInput();p->PrintQP();if(!p->Judge()){ }

IsFinish = p->AutoDone();} while(!IsFinish);if((p->IsWin(p->States[0])== 0)&& p->Judge()){

} } cout << “平局” << endl;system(“pause”);3.2、实验运行结果截图

4、实验心得

本次实验,我通过学习用VC编程语言设计简单的博弈游戏,从而理解和掌握博弈树的启发式搜索过程,熟悉博弈中两种最基本的搜索方法——极大极小过程和过程。并且将这种思想通过代码表现出来。

本次实验我最大的收获不仅仅是学到了课本上的知识,更是学会了如何主动的求解问题的答案。实验中我遇到了许多困难,不仅仅是有关编程算法方面的,还有一些代码逻辑流程的设计。这些困难我通过上网和去图书馆查找资料或者向同学请教等方式,逐一解决了困难,我收获良多。

人工智能课内实验报告

实验6:子句集消解实验

学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(33)学 号: 06153034 日 期: 2017-05-8 10:15-12:00

实验6子句集消解实验

一、实验目的

(1)熟悉子句集化简的九个步骤;

(2)理解消解规则,能把任意谓词公式转换成子句集。

二、编程环境

Visual Studio 2017

三、实验原理

在谓词逻辑中,任何一个谓词公式都可以通过应用等价关系及推理规则化成相应的子句集。

其化简步骤如下:

(1)消去连接词“→”和“↔” 反复使用如下等价公式:

P→Q ⇔﹁ P∨Q

P↔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)将每个否定符号“﹁”移到仅靠谓词的位置,使得每个否定符号最多只作用于一个谓词上。

(3)对变元标准化

在一个量词的辖域内,把谓词公式中受该量词约束的变元全部用另外一个没有出现过的任意变元代替,使不同量词约束的变元有不同的名字。

(4)化为前束范式

化为前束范式的方法:把所有量词都移到公式的左边,并且在移动时不能改变其相对顺序。

(5)消去存在量词

(6)化为Skolem标准形

对上述前束范式的母式应用以下等价关系

P∨(Q∧R)⇔(P∨Q)∧(P∨R)(7)消去全称量词(8)消去合取词

在母式中消去所有合取词,把母式用子句集的形式表示出来。其中,子句集中的每一个元素都是一个子句。

(9)更换变量名称

对子句集中的某些变量重新命名,使任意两个子句中不出现相同的变量名。

四、实验结果及代码

//化简子句集的九步法演示 //作者:刘少鹏 //时间:2017.5 #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 << “------------------求子句集九步法演示-----------------------” << endl;system(“color 0A”);//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,48

下载人工智能产生式系统实验报告解读word格式文档
下载人工智能产生式系统实验报告解读.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    人工智能TSP旅行商问题实验报告

    人工智能实验三实验报告 班级: 姓名: 学号: 一 实验题目 TSP问题的遗传算法实现 旅行商问题(Traveling Salesman Problem, TSP),又译为旅行推销员问题、货担郎问题,简称为TSP问题......

    人工智能课程论文解读

    人工智能课程论文 题目:人工智能:用科学解密生命与智慧 姓名:学号:指导老师:人工智能:用科学解密生命与智慧 摘要 本文是对人工智能及其应用的一个综述。首先介绍了人工智能的理......

    人工智能导论论文解读

    终结者会出现吗? -----对于人工智能技术发展趋势的思考 摘要:1、时间过去30年了,当回想起这部电影,我们不禁想问几个问题:“终结者”会出现吗?在现在的技术水平下能制造出如此复......

    人工智能课程设计(五子棋)解读

    《人工智能导论》课程报告 课题名称: 五子棋 姓名: X X 学号:114304xxxx 课题负责人名(学号): X X114304xxxx 同组成员名单(学号、角色): x x1143041325 XXX1143041036 指导教师:......

    人工智能大作业解读(大全5篇)

    实现遗传算法的0-1背包问题求解 目录 摘要.........................................................................................................2 一.问题描述.........

    人工智能与电子商务解读

    人工智能与电子商务 2013年6月16日 人工智能在电子商务中的应用 摘要:人工智能技术和电子商务的飞速发展推动了全球科技经济领域的进步,基于人工智能技术的电子商务更趋向完......

    人工智能实验报告-八数码 (五篇模版)

    《人工智能》实验一题目 实验一启发式搜索算法 1. 实验内容: 使用启发式搜索算法求解8数码问题。 ⑴ 编制程序实现求解8数码问题A算法,采用估价函数 wn, fndnpn其中:dn是搜索树......

    基于人工智能的英语教学系统

    摘 要:人工智能是研究人类智能活动规律的科学,论文介绍了人工智能的原理、特点及应用领域,分析了目前英语教学面临的问题,提出了基于人工智能技术的英语教学系统的实现方案。该......