文档视界 最新最全的文档下载
当前位置:文档视界 › 游戏人工智能实验报告四

游戏人工智能实验报告四

游戏人工智能实验报告四
游戏人工智能实验报告四

实验四有限状态机实验

实验报告

一、实验目的

通过蚂蚁世界实验掌握游戏中追有限状态机算法

二、实验仪器

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

int RedHomeRow;

int RedHomeCol;

int BlackHomeRow;

int BlackHomeCol;

int RedNum=2;

int BlackNum=2;

//地图大小,可改变

#define kMaxRows 30

#define kMaxCols 40

#define LENGTH 20

int terrain[kMaxRows][kMaxCols];

#define kGround 1

#define kWater 2

#define kBlackHome 3

#define kRedHome 4

#define kPoison 5

#define kFood 6

//ai_Entity类中函数的定义

ai_Entity::ai_Entity()

{

type=0;

state=0;

row=0;

col=0;

}

int Rnd(int min, int max)//不能产生负数

{

int result;

do{

result=rand()%max;

}while(result<=min);

return result;

}

void ai_Entity::New (int theType,int theState,int theRow,int theCol) {

type=theType;

row=theRow;

state=theState;

}

void ai_Entity::Forage()

{

int rowMove;

int colMove;

int newRow;

int newCol;

int foodRow;

int foodCol;

int poisonRow;

int poisonCol;

rowMove=Rnd(-1,3)-1;

colMove=Rnd(-1,3)-1;

newRow=row+rowMove;

newCol=col+colMove;

if(newRow<0)

return;

if(newCol<0)

return;

if(newRow>=kMaxRows)

return;

if(newCol>=kMaxCols)

return;

if((terrain[newRow][newCol]==kGround)||(terrain[newRow][newCol]==kWater)) {

row=newRow;

col=newCol;

}

if(terrain[newRow][newCol]==kFood)

{

row=newRow;

col=newCol;

terrain[row][col]=kGround;

state=kGoHome;

do{

foodRow=Rnd(-1,kMaxRows);

foodCol=Rnd(-1,kMaxCols);

}while(terrain[foodRow][foodCol]!=kGround);

}

if(terrain[newRow][newCol]==kPoison)

{

row=newRow;

col=newCol;

terrain[row][col]=kGround;

state=kDead;

do{

poisonRow=Rnd(-1,kMaxRows);

poisonCol=Rnd(-1,kMaxCols);

}while(terrain[poisonRow][poisonCol]!=kGround);

terrain[poisonRow][poisonCol]=kPoison;

}

}

void ai_Entity::GoHome()

{

int rowMove;

int colMove;

int newRow;

int newCol;

int homeRow;

int homeCol;

int poisonRow;

int poisonCol;

int i;

if(type==kRedAnt)

{

homeRow=RedHomeRow;

homeCol=RedHomeCol;

}

else

{

homeRow=BlackHomeRow;

homeCol=BlackHomeCol;

}

if(row

rowMove=1;

else if(row>homeRow)

rowMove=-1;

else

rowMove=0;

if(col

colMove=1;

else if(col>homeCol)

colMove=-1;

else

colMove=0;

newRow=row+rowMove;

newCol=col+colMove;

if(newRow<0)

return;

if(newCol<0)

return;

if(newRow>=kMaxRows)

return;

if(newCol>=kMaxCols)

return;

if(terrain[newRow][newCol]!=kPoison)

{

row=newRow;

col=newCol;

}

else

{

row=newRow;

col=newCol;

terrain[row][col]=kGround;

state=kDead;

do{

poisonRow=Rnd(-1,kMaxRows);

poisonCol=Rnd(-1,kMaxCols);

}while(terrain[poisonRow][poisonCol]!=kGround);

terrain[poisonRow][poisonCol]=kPoison;

}

if((newRow==homeRow)&&(newCol==homeCol)) {

row=newRow;

col=newCol;

state=kThirsty;

for(i=0;i

if(entityList[i].type==0)

{

if(type==kRedAnt)

RedNum++;

if(type==kBlackAnt)

BlackNum++;

break;

}

}

}

void ai_Entity::Thirsty()

{

int rowMove;

int colMove;

int newRow;

int newCol;

int foodRow;

int foodCol;

int poisonRow;

int poisonCol;

rowMove=Rnd(-1,3)-1;

colMove=Rnd(-1,3)-1;

newRow=row+rowMove;

newCol=col+colMove;

if(newRow<0)

return;

if(newCol<0)

return;

if(newRow>=kMaxRows)

return;

if(newCol>=kMaxCols)

return;

if((terrain[newRow][newCol]==kGround)||(terrain[newRow][newCol]==kFood)) {

row=newRow;

col=newCol;

}

if(terrain[newRow][newCol]==kWater)

{

row=newRow;

terrain[row][col]=kGround;

state=kForage;

do{

foodRow=Rnd(-1,kMaxRows);

foodCol=Rnd(-1,kMaxCols);

}while(terrain[foodRow][foodCol]!=kGround);

terrain[foodRow][foodCol]=kWater;

}

if(terrain[newRow][newCol]==kPoison)

{

row=newRow;

col=newCol;

terrain[row][col]=kGround;

state=kDead;

do{

poisonRow=Rnd(-1,kMaxRows);

poisonCol=Rnd(-1,kMaxCols);

}while(terrain[poisonRow][poisonCol]!=kGround);

terrain[poisonRow][poisonCol]=kPoison;

}

}

void ai_Entity::Dead()

{

if(type==kRedAnt)

RedNum--;

if(type==kBlackAnt)

BlackNum--;

type=0;

}

4)制作对话框

添加资源,拖动控件

9个静态文本框,7个编辑框

右键对话框添加类InputDlg,添加成员变量

int m_RedHomeRow;

int m_RedHomeCol;

int m_BlackHomeRow;

int m_BlackHomeCol;

int m_food;

int m_water;

int m_poison;

在AntView.cpp中加入#include"InputDlg.h"

5)对菜单项添加事件

给CAntView类添加一些成员变量

没做说明都是添加到CAntView类,没做说明都是COMMAND事件。

设置参数:点击出现对话框,输入值,确定后赋给CAntView的成员变量,刷新窗口void CAntView::OnData()

{

// TODO: 在此添加命令处理程序代码

InputDlg dlg;

if(dlg.DoModal()==IDOK)

{

RedHomeRow=kRedHomeRow=dlg.m_RedHomeRow;

BlackHomeRow=kBlackHomeRow=dlg.m_BlackHomeRow;

BlackHomeCol=kBlackHomeCol=dlg.m_BlackHomeCol;

kMaxWater=dlg.m_water;

kMaxFood=dlg.m_food;

kMaxPoison=dlg.m_poison;

}

if(kRedHomeRow>=kMaxRows||kBlackHomeRow>=kMaxRows||kRedHomeCol>=kMaxCols||kBlackHomeCol>=kMaxCols ||kRedHomeRow<0||kBlackHomeRow<0||kRedHomeCol<0||kBlackHomeCol<0

||kRedHomeRow==kBlackHomeRow&&kRedHomeCol==kBlackHomeCol)

{

AfxMessageBox(L"输入坐标不合法,请重新输入!");

return;

}

flag=1;

Invalidate();

}

运行:初始化数组,随机生成毒药、事物、水,刷新窗口

void CAntView::OnRun()

{

// TODO: 在此添加命令处理程序代码

if(flag==0)

{

AfxMessageBox(L"还未设置蚂蚁家的位置!");

return ;

}

if(flag!=1)

return ;

int i,j;

for(i=0;i

for(j=0;j

{

terrain[i][j]=kGround;

}

terrain[kRedHomeRow][kRedHomeCol]=kRedHome;

terrain[kBlackHomeRow][kBlackHomeCol]=kBlackHome;

srand(time(NULL)); //取系统时间为随机种子

int r,c;

for(i=0;i

{

r=Rnd(-1,kMaxRows);

c=Rnd(-1,kMaxCols);

if(terrain[r][c]==kGround)

i--;

}

for(i=0;i

{

r=Rnd(-1,kMaxRows);

c=Rnd(-1,kMaxCols);

if(terrain[r][c]==kGround)

terrain[r][c]=kPoison;

else

i--;

}

for(i=0;i

{

r=Rnd(-1,kMaxRows);

c=Rnd(-1,kMaxCols);

if(terrain[r][c]==kGround)

terrain[r][c]=kFood;

else

i--;

}

flag=2;

Invalidate();

}

下一步:有限状态机的核心代码,刷新窗口void CAntView::OnNext()

{

// TODO: 在此添加命令处理程序代码

if(flag==2)

{

//kGround才能新建

int x,y;

for(int i=0;i<2;i++)

{

x=Rnd(-1,kMaxCols);

y=Rnd(-1,kMaxRows);

if(terrain[y][x]==kGround)

{

entityList[i].New(kRedAnt,kForage,y,x);

}

else

i--;

}

x=Rnd(-1,kMaxCols);

y=Rnd(-1,kMaxRows);

if(terrain[y][x]==kGround)

{

entityList[i].New(kBlackAnt,kForage,y,x);

}

else

i--;

}

flag=3;

}

else

{

for(int i=0;i

{

switch(entityList[i].state)

{

case kForage:

entityList[i].Forage();

break;

case kGoHome:

entityList[i].GoHome();

break;

case kThirsty:

entityList[i].Thirsty();

break;

case kDead:

entityList[i].Dead();

break;

default:

break;

}

}

}

Invalidate();

}

6)OnDraw函数

flag是标志变量,便于控制绘图

{

CAntDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

if (!pDoc)

return;

// TODO: 在此处为本机数据添加绘制代码

int i,j;

//绘制网格

for(i=0;i<=LENGTH*kMaxRows;i+=LENGTH)

{

//画横线

pDC->MoveTo(0,i);

pDC->LineTo(LENGTH*kMaxCols,i);

}

for(i=0;i<=LENGTH*kMaxCols;i+=LENGTH)

{

//画竖线

pDC->MoveTo(i,0);

pDC->LineTo(i,LENGTH*kMaxRows);

}

//画出红黑房子

if(flag>=1)

{

pDC->TextOutW(kBlackHomeCol*LENGTH+1,kBlackHomeRow*LENGTH+1,L"H");

pDC->SetTextColor(RGB(255,0,0));

pDC->TextOutW(kRedHomeCol*LENGTH+1,kRedHomeRow*LENGTH+1,L"H");

pDC->SetTextColor(RGB(0,0,0));

}

if(flag>=2)//遍历数组在相应位置显示图片(水滴、骷髅、苹果)

{

CDC dcMemory;

dcMemory.CreateCompatibleDC(pDC);

CBitmap bmp1,bmp2,bmp3;

BITMAP bmpInfo1,bmpInfo2,bmpInfo3;

bmp1.LoadBitmapW(IDB_BITMAP1);

bmp1.GetBitmap(&bmpInfo1);

bmp2.LoadBitmapW(IDB_BITMAP2);

bmp2.GetBitmap(&bmpInfo2);

bmp3.LoadBitmapW(IDB_BITMAP3);

bmp3.GetBitmap(&bmpInfo3);

CBitmap *pOldBitmap=dcMemory.SelectObject(&bmp1);

{

for(j=0;j

{

if(terrain[i][j]==kWater)

{

dcMemory.SelectObject(&bmp1);

pDC->StretchBlt(j*LENGTH+1,i*LENGTH+1,19,19,&dcMemory,0,0,bmpInfo1.bmWidth,bmpInfo1.bmHeight,SRCCOPY);

}

else if(terrain[i][j]==kPoison)

{

dcMemory.SelectObject(&bmp2);

pDC->StretchBlt(j*LENGTH+1,i*LENGTH+1,19,19,&dcMemory,0,0,bmpInfo2.bmWidth,bmpInfo2.bmHeight,SRCCOPY);

}

else if(terrain[i][j]==kFood)

{

dcMemory.SelectObject(&bmp3);

pDC->StretchBlt(j*LENGTH+1,i*LENGTH+1,18,18,&dcMemory,0,0,bmpInfo3.bmWidth,bmpInfo3.bmHeight,SRCCOPY);

}

}

}

dcMemory.SelectObject(pOldBitmap);

}

if(flag>=3) //绘制蚂蚁

{

CDC dcMemory;

dcMemory.CreateCompatibleDC(pDC);

CBitmap bmp1,bmp2;

BITMAP bmpInfo1,bmpInfo2;

bmp1.LoadBitmapW(IDB_BITMAP4);

bmp1.GetBitmap(&bmpInfo1);

bmp2.LoadBitmapW(IDB_BITMAP5);

bmp2.GetBitmap(&bmpInfo2);

CBitmap *pOldBitmap=dcMemory.SelectObject(&bmp1);

for(i=0;i

{

if(entityList[i].type==kRedAnt)

{

dcMemory.SelectObject(&bmp1);

pDC->StretchBlt(entityList[i].col*LENGTH+1,entityList[i].row*LENGTH+1,19,19,&dcMemory,0,0,bmpInfo1.bmWidth,bmp Info1.bmHeight,SRCCOPY);

if(entityList[i].type==kBlackAnt)

{

dcMemory.SelectObject(&bmp2);

pDC->StretchBlt(entityList[i].col*LENGTH+1,entityList[i].row*LENGTH+1,19,19,&dcMemory,0,0,bmpInfo2.bmWidth,bmp Info2.bmHeight,SRCCOPY);

}

}

dcMemory.SelectObject(pOldBitmap);

CString s;

s.Format(_T("红蚂蚁数:%d 黑蚂蚁数:%d"),RedNum,BlackNum);//输出当前蚂蚁数

pDC->TextOutW(43*LENGTH,0,s);

}

}

四、实验结果

运行:

点击菜单项,设置参数,弹出对话框

如果设置参数不对:(房子坐标越界、红黑房子坐标相等、食物毒物水数为负数)

参数设置好后,房子出现:

点击下一步或F10,蚂蚁和文字出现:

多次点击下一步,蚂蚁数改变:

可以多次点击下一步

设置的参数不同蚂蚁的繁殖情况不同。比如,食物多,繁殖快,毒物多,蚂蚁可能很快就灭

绝了

五、实验心得

通过有限状态机实现蚂蚁的繁殖,很有趣的一个实验,通过此次实验能增加AI和MFC 的知识,程序还有很多需要改进的地方。比如,有时候不按指定的顺序点击菜单将会出现小错误;def.h里的东西太杂,可以新建cpp文件,整理进去。

六、主要代码

实验过程中已经列出主要代码,这里再列出与有限状态机算法有关的代码

ai_Entity::ai_Entity()

{

type=0;

state=0;

row=0;

col=0;

}

int Rnd(int min, int max)//不能产生负数

{

int result;

do{

result=rand()%max;

}while(result<=min);

return result;

}

void ai_Entity::New (int theType,int theState,int theRow,int theCol)

{

type=theType;

row=theRow;

col=theCol;

state=theState;

}

void ai_Entity::Forage()

{

int rowMove;

int colMove;

int newRow;

int newCol;

int foodRow;

int foodCol;

int poisonRow;

int poisonCol;

rowMove=Rnd(-1,3)-1;

colMove=Rnd(-1,3)-1;

newRow=row+rowMove;

newCol=col+colMove;

if(newRow<0)

return;

if(newCol<0)

return;

if(newRow>=kMaxRows)

return;

if(newCol>=kMaxCols)

return;

if((terrain[newRow][newCol]==kGround)||(terrain[newRow][newCol]==kWater)) {

row=newRow;

col=newCol;

}

if(terrain[newRow][newCol]==kFood)

{

row=newRow;

col=newCol;

游戏人工智能实验报告记录四

游戏人工智能实验报告记录四

————————————————————————————————作者:————————————————————————————————日期:

实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 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 unsigned int i; void Monkey_Go_Box(unsigned char x, unsigned char y) { printf("Step %d:monkey从%c走到%c\n", ++i, x, y);//x表示猴子的位置,y为箱子的位置 } void Monkey_Move_Box(char x, char y) { printf("Step %d:monkey把箱子从%c运到%c\n", ++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("Monkey\tbox\tbanana\n"); scanf("%c", &Monkey); getchar(); printf("\t"); scanf("%c", &Box); getchar(); printf("\t\t"); scanf("%c", &Banana); getchar(); printf("\n操作步骤如下\n"); if (Monkey != Box) { Monkey_Go_Box(Monkey, Box); } if (Box != Banana)

游戏人工智能实验报告四

实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 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

人工智能实验报告大全

人工智能课内实验报告 (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) {

AI游戏人工智能浓缩版(袖珍考试参考)

一.追逐与闪躲 Bresenham算法的原理是,计算每一点与终点之间的的横轴与纵轴,然后比较两轴的长度,哪个轴比较长,就往该方向前进,如果两轴等长,则往斜边前进。 if (deltaCol > deltaRow) { fraction = deltaRow * 2 - deltaCol; while (nextCol != endCol) { if (fraction >= 0) { nextRow += stepRow; fraction -= deltaCol; } nextCol += stepCol; fraction += deltaRow; pathRow[currentStep] = nextRow; pathCol[currentStep] = nextCol; currentStep++; }} else { fraction = deltaCol * 2 - deltaRow; while (nextRow != endRow) { if (fraction >= 0) { nextCol += stepCol; fraction -= deltaRow; } nextRow += stepRow; fraction += deltaCol; pathRow[currentStep] = nextRow; pathCol[currentStep] = nextCol; currentStep++; }}} 连续环境中的视线算法:在函数中定义了4的局部变量。u和v是Vector类型的,Vector类是一个自定义类(见附录A),负责处理基本向量算术,比如向量加法,减法,数量积,交叉乘积,和其他操作。另两个局部变量是一对布尔变量,left和right。它们是用来分析哪个操纵力启动,两个初始都是false。定义局部变量的下一行是计算从掠夺者到被掠夺者的视线。实际上,这条线不仅仅是计算线的位置。它还会计算宏观上掠夺者到被掠夺者之间相对位置的向量,通过使用代码 (Prey.vPosition - Predator.vPosition) ,然后把结果向量传递给VRotate2D函数,把它转换成掠夺者本地,本体坐标。VRotate2D 表现成一个标准的结合系统,把有关earth-fixed的系统转换成body-fixed对应系统方向(看下边的“全局与局部坐标系统”)。结果保存在u里,然后规格化u即(u.Normalize()),把它转换成单位长度向量。最后一行代码调用刚性体类的SetThrusters成员函数,在模拟循环的当前反复中为掠夺者提供转向力。 void DoLineOfSightChase(void) { Vector u, v; bool left = false; bool right = false; u = VRotate2D(-Predator.fOrientation, (Prey.vPosition - Predator.vPosition)); u.Normalize(); if (u.x < -_TOL) left = true; else if (u.x > _TOL) right = true; Predator.SetThrusters(left, right); } 二.群聚规则 首先根据角度检测,对于不同的视野检测方法是不同的(比如,宽视野,窄视野),下面的例子是对于宽广视野的检测 ·计算d=目标单位位置-当前单位位置,w为d以目标单位反方向的坐标系中的向量坐标。 ·如果w.y>0,则目标单位必然在视野范围内。 ·如果w.y<0,则要看x,y坐标构成的线段斜率,是否在设定的视野区域之外,如果 fabs(w.x)>fab(w.y)*_BACK_VIEW_ANGLE_FACTOR,则目标单位在视野范围内。其中的 _BACK_VIEW_ANGLE_FACTOR就是视野角度系数。该系数等于1时,视野弧线的直线与x轴夹角是45度,该系数越大,两条线越接近x轴,不可见区域越大,反之,系数越小,两条线越接近y轴,不可见区域越小。 视野检查 if (WideView) //宽广视野的检查 {InView=((w.y>0)||((w.y<0)&&(fabs(w.x) >fabs(w.y)*BACK_VIEW_ANGLE_FACTOR))) ;

人工智能实验报告

实验报告 1.对CLIPS和其运行及推理机制进行介绍 CLIPS是一个基于前向推理语言,用标准C语言编写。它具有高移植性、高扩展性、 强大的知识表达能力和编程方式以及低成本等特点。 CLIPS由两部分组成:知识库、推理机。它的基本语法是: (defmodule< module-n ame >[< comme nt >]) CLIPS的基本结构: (1).知识库由事实库(初始事实+初始对象实例)和规则库组成。 事实库: 表示已知的数据或信息,用deftemplat,deffact定义初始事实表FACTLIS,由关系名、后跟 零个或多个槽以及它们的相关值组成,其格式如下: 模板: (deftemplate [] *) :: = | 事实: (deffacts [] *) 当CLIPS系统启动推理时,会把所有用deffact定义的事实自动添加到工作存储器中。常用命令如下:asser:把事实添加到事实库(工作存储器)中retract:删除指定事实 modify :修改自定义模板事实的槽值duplicate :复制事实 clear:删除所有事实 规则库 表示系统推理的有关知识,用defrule命令来定义,由规则头、后跟零个或多个条件元素以 及行为列表组成,其格式如下: (defrule [] * ; =>

人工智能实验报告

人工智能课程项目报告 姓名: 班级:二班

一、实验背景 在新的时代背景下,人工智能这一重要的计算机学科分支,焕发出了他强大的生命力。不仅仅为了完成课程设计,作为计算机专业的学生, 了解他,学习他我认为都是很有必要的。 二、实验目的 识别手写字体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():,最后就是实现测试。

人工智能遗传算法实验报告

人工智能实验报告 学号: 姓名: 实验名称:遗传算法 实验日期:2016.1.5

【实验名称】遗传算法 【实验目的】 掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。 【实验原理】 遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化, 如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来 越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学 的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。 遗传算法程度流程图为:

【实验名称】遗传算法 【实验目的】 掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。 【实验原理】 遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化, 如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来 越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学 的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。 遗传算法程度流程图为:

人工智能实验报告

《一人工智能方向实习一》 实习报告 专业:计算机科学与技术 班级: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)估价函数的确定

人工智能实验报告材料

标准文档 《人工智能》课外实践报告 项目名称:剪枝法五子棋 所在班级: 2013级软件工程一班 小组成员:李晓宁、白明辉、刘小晶、袁成飞、程小兰、李喜林 指导教师:薛笑荣 起止时间: 2016-5-10——2016-6-18

项目基本信息项目名称五子棋 项目简介 智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。这个项目我们实现了当人点击“开始”按钮时,开始下棋,当人的棋子落时,计算机会根据算法进行最佳路径计算,然后落子下棋。任何一方赢了都会弹出哪方赢了。然后单击重新开始。 任务分工李晓宁 130904021 白明辉 130904001:负责界面实现和估值函数设计文档整理 刘小晶 130904032 袁成飞 130904051:负责极小极大值算法的设计与实现 李喜林 130904019 程小兰 130904004:负责αβ剪枝法的设计与实现 一、系统分析 1.1背景

1.1.1 设计背景 智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。能使人们在与电脑进行对弈的过程中学习五子棋,陶冶情操。并且推进人们对AI的关注和兴趣。 1.1.2可行性分析 通过研究,本游戏的可行性有以下三方面作保障 (1)技术可行性 本游戏采用Windows xp等等系统作为操作平台,使用人工智能进行算法设计,利用剪枝法进行编写,大大减少了内存容量,而且不用使用数据库,便可操作,方便可行,因此在技术上是可行的。 (2)经济可行性 开发软件:SublimText (3)操作可行性 该游戏运行所需配置低、用户操作界面友好,具有较强的操作可行性。 1.2数据需求 五子棋需要设计如下的数据字段和数据表: 1.2.1 估值函数:

人工智能_实验报告

实验一:知识表示方法 一、实验目的 状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。 二、问题描述 有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() { RiverCrossing::ShowInfo(); int n, c; cout<<"Please input n: "; cin>>n; cout<<"Please input c: "; cin>>c; RiverCrossing riverCrossing(n, c); riverCrossing.solve(); system("pause"); } RiverCrossing.h #pragma once #include //船 class Boat { public: static int c; int pastor;//牧师 int savage;//野人 Boat(int pastor, int savage); }; //河岸状态 class State

人工智能技术在游戏中的应用解读

人工智能技术在游戏中的应用 学院 专业 研究方向 学生姓名 学号 任课教师姓名 任课教师职称 2012年6月22 日

人工智能技术在游戏中的应用 前言:人工智能(Artificial Intelligence) ,英文缩写为AI。它是研究、开发用于模拟、延伸 和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机 科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出 反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系 统等,研究成果已经广泛地用于了各行各业,当然也包括游戏。 我们玩电脑游戏,主要是为了得到一种放松、一种享受、以及在现实生活中无法得到的一种快感。这需要电脑游戏能制作得符合玩家的口味,游戏的主题能够吸引玩家深入,游戏的规则和结果能够使得玩家满意。而在这一切中,人工智能技术扮演了相当重要的角色。摘要:本文探讨了当前人工智能游戏中的应用状况,阐述了游戏AI的应用技术,并列举。 关键词:游戏;人工智能;有限状态自动机;模糊逻辑;产生式系统;决策树;人工生命; 专家系统;神经网络;遗传算法 1. 电脑游戏与人工智能的关系 电脑游戏从诞生以来,由于其强大的模拟现实作用,越来越受到人们的喜爱。随着现代计算机、网络、虚拟现实、人工智能等技术的发展,游戏的拟人化越来越逼真。高度的拟人化使得现代电脑游戏能够模仿人类社会中的各种情形,并把这些情形通过视觉、听觉、甚至触觉等多种感官反映到人的大脑,从而对人们的现实生活产生巨大冲击。 无论是什么游戏,游戏玩家都希望在游戏中能够体验到现实中无法体验到的刺激,得到现实中无法得到的满足。这些刺激和满足主要表现在特定的挑战、社会化、幻想、情感等方面。 人们在玩电脑游戏的时候,也希望游戏中的其他角色能够拥有某些程度上的智能。这些智能可以使得人们能够在游戏的同时得到满足,它可以使人在进行游戏中不觉得孤单。然而,这种智能必须得到控制。如果游戏中的机器角色的智能明显高于玩家的能力,玩家会有很强烈的挫败感,之后便会放弃这样的游戏。所以,人工愚蠢(Artificial Stupidity)技术也是必不可少的。在游戏中,太强或太弱的人工智能都是不合适的。 那何种程度的人工智能才是合适的呢?回答这个问题首先要考虑怎样的机器可以算作智能机器。这里就不能不提人工智能之父图灵。图灵在1950年提出了“图灵实验”的概念,他认为能够通过图灵实验的机器是具有智能的。其实,在游戏中也是一样的。“图灵实验”在游戏中可以这样描述:当玩家和其他玩家同诸多机器在同时游戏时,如果这个玩家通过游戏规则中的任何方式都无法分辨游戏中的其他角色哪个是其他玩家,哪个是机器的线程,那么我们可以说这个游戏通过了“游戏中的图灵测试”。一般来说,通过了“游戏中的图灵测试”的游戏是最适合玩家娱乐的。 最近网络游戏大量流行,我觉得,网络游戏也许是人工智能最佳的实验场合。因为网游是现实社会的一个简化版本,这在里,大量需要各种处理问题的知识与技巧,需要各种类

人工智能 八数码游戏

实验一:八数码游戏问题 一、八数码游戏问题简介 九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。 问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。 (a)初始状态(b)目标状态 图八数码游戏 二、实验目的 1. 熟悉人工智能系统中的问题求解过程; 2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 3. 熟悉对八数码问题的建模、求解及编程语言的应用。 三、实验的思路 八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。 例如: (a) 初始状态 (b) 目标状态 图1 八数码问题示意图

1.启发函数设定 由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零,因此可以把数码不同的位置个数作为标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息来扩展节点的选择,减少搜索范围,提高搜索速度。 2.搜索过程:(搜索采用广度搜索方式,利用待处理队列辅助,逐层搜索(跳过劣质节点)) a、把初始数码组压入队列; b、从队列中取出一个数码组节点; c、扩展子节点,即从上下左右四个方向移动空格,生成相应子节点: d、对子节点数码组作评估,是否为优越节点,即其评估值是否小于等于其父节点加一,是则将其压入队,否则抛弃。 e、判断压入队的子节点数码组(优越点)的评估值,为零则表示搜索完成,退出搜索; f、跳到步骤2; 四、数据结构的设计 数码结构体 typedef struct node //八数码结构体 { int form[N][N]; //数码组 int evalue; //评估值,差距 int udirec; //所屏蔽方向,防止往回推到上一状态,1上2下3左4右 struct node *parent; //父节点 }Graph; Graph *Qu[MAX];//队列 Graph *St[MAX];//堆栈

游戏人工智能 有限状态机的实验报告

实验三:有限状态机 姓名:廖远东班级:数媒2 学号:E10700217 一、实验目的 掌握有限状态机的原理,并会使用有限状态机,要求能编程序实现一个案例如书上蚁群世界。. 二、实验仪器 linux 下的codeblock 三、主要代码 ant.h: #ifndef ANT_H_INCLUDED #define ANT_H_INCLUDED #define kGround 1 #define kWater 2 #define kBlackHome 3 #define kRedHome 4 #define kPoison 5 #define kFood 6 #define kMaxWater 15 #define kMaxPoison 8 #define kMaxFood 20 #define kRedHomeRow 5 #define kRedHomeCol 5 #define kBlackHomeRow 5 #define kBlackHomeCol 36 // entities #define kMaxEntities 30 #define kRedAnt 1 #define kBlackAnt 2 #define kTree 3

#define kPlayerSpeed 4 // entity states #define kForage 1 #define kGoHome 2 #define kGuard 3 #define kThirsty 4 #define kDead 5 //#define kChaseDistance 7 //#define kMaxPathLength 200 // world constants #define kMaxRows 30 #define kMaxCols 10 //#define kMaxTiles 10 // world constants //#define kUpKey 1 //#define kDownKey 2 //#define kLeftKey 3 //#define kRightKey 4 class a i_Entity { public: int type; int state; int row; int col; //unsigned long timeToMove; ai_Entity(); ~ai_Entity(); void Forage(void); void GoHome(void); void Thirsty(void); void Dead(void); void New(int theType, int theState, int theRow, int theCol); int DistanceFrom(int t); }; class a i_World {

人工智能实验报告

人工智能实验报告 实验名称:模糊方法实现电热箱的闭环控制实验 模糊逻辑控制(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)按一定策略从规则库中选择规则与数据库的已知事实进行匹配。匹配的过程中会产生三种情况。第一种匹配成功,则此条规则将被列入被激活候选集;第二种匹配失败,即输入条件与已知条件矛盾;第三种匹配无结果,即该条规则前件的已知条件中完全与输入事实无关,则将规则列入待测试规则集,将在下一轮匹配中再次使用。因为有可能推理中间结果符合其前件的已知 正向推理是从已知事实出发,通过规则库求的结论,也称为自底向上,或称为数据驱动方式。 正向推理过程的具体步骤是:

游戏人工智能实验报告四

游戏人工智能实验报告四

实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 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 int RedHomeRow; int RedHomeCol; int BlackHomeRow; int BlackHomeCol; int RedNum=2; int BlackNum=2; //地图大小,可改变 #define kMaxRows 30 #define kMaxCols 40 #define LENGTH 20 int terrain[kMaxRows][kMaxCols]; #define kGround 1 #define kWater 2 #define kBlackHome 3 #define kRedHome 4 #define kPoison 5 #define kFood 6 //ai_Entity类中函数的定义 ai_Entity::ai_Entity() { type=0; state=0; row=0; col=0; } int Rnd(int min, int max)//不能产生负数{ int result; do{ result=rand()%max; }while(result<=min); return result; }

游戏人工智能实验报告二

实验二聚集与避障 实验报告 一、实验目的 掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别 二、实验仪器 Windows 7系统 Microsoft Visual Studio2015 三、实验原理及过程 //描述聚集与避障的算法原理 //描述程序实现时的思路包括对每个调用的API进行详细说明 智能体只考虑哪些在检测盒内的障碍物。 初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析,然后把所有已经标记的障碍物都转换到智能体的局部空间。 转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了,接下来必须要检测障碍物是否和检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。 此时,只剩下那些与检测盒相交的障碍物了。 接下来我们找出离智能体最近的相交点。 再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。 用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。 四、实验结果

五、实验心得(需包括有何不足如何改进) //你认为目前的聚集与避障有什么不足之处,如何改进 目前的聚集与避障的不足之处在于: 可能会因为错误的方案设计而搞错导致路线的躲闪。 还有就是从实验2开始,我的电脑本身出现了COMCTL32.LIB文件LINK的错误,后来在同学的帮助下我解决了这个问题。 如何改进: 实验前必须要经过精确的计算并且代码不能出现任何错误。 把COMCTL32.LIB文件载入文件以让程序正确运行。 六、主要代码

相关文档