实验一:追逐与拦截
一、实验目的
掌握游戏中追逐与拦截的人工智能算法
二、实验仪器
Visual C++6.0
三、实验原理及过程
四、实验结果
红色的箭头追着蓝色的箭头跑。
五、实验心得(需包括有何不足如何改进)
认识了AI的特点,用Visual C++6.0编写程序时的环境及生成效果。不足就是红色的箭头回跑到的屏幕的外面去。
六、主要代码
#include "main.h"
#include "time.h"
//---------------------------------------------------------------------------
/*
Book: AI for Game Developers
Authors: David M. Bourg & Glenn Seemann
Example: Chasing and evading in continuous environments, Chapter 2
*/
//---------------------------------------------------------------------------
// Global Variables:
int FrameCounter = 0;
RigidBody2D Craft1, Craft2;
Vector Target;
#define _TIMESTEP 0.001
#define _TOL 1e-10
#define _FWDTIME 10
#define _THRUSTFACTOR 3
#define _CHASESETUP true
bool Initialize(void)
{
Craft1.fMass = 10;
Craft1.fInertia = 10;
Craft1.fInertiaInverse = 1/10;
Craft1.vPosition.x = _WINWIDTH-60;
Craft1.vPosition.y = _WINHEIGHT*0.8;
Craft1.fWidth = 10;
Craft1.fLength = 20;
Craft1.fHeight = 5;
Craft1.fOrientation = 135;
Craft1.CD.y = -0.12*Craft1.fLength; Craft1.CD.x = 0.0f; // coordinates of the body center of drag
Craft1.CT.y = -0.50*Craft1.fLength; Craft1.CT.x = 0.0f; // coordinates of the propeller thrust vector
Craft1.CPT.y = 0.5*Craft1.fLength; Craft1.CPT.x = -0.5*Craft1.fWidth; // coordinates of the port bow thruster
Craft1.CST.y = 0.5*Craft1.fLength; Craft1.CST.x = 0.5*Craft1.fWidth; // coordinates of the starboard bow thruster
Craft1.ProjectedArea = (Craft1.fLength + Craft1.fWidth) * Craft1.fHeight;
Craft1.ThrustForce = _THRUSTFORCE*1;
Craft2.fMass = 10;
Craft2.fInertia = 10;
Craft2.fInertiaInverse = 1/10;
if(_CHASESETUP)
{
Craft2.vPosition.x = 40;
Craft2.vPosition.y = _WINHEIGHT*0.8;
} else {
Craft2.vPosition.x = Craft1.vPosition.x - Craft1.fLength*8;
Craft2.vPosition.y = Craft1.vPosition.y - Craft1.fLength*4;
}
Craft2.fWidth = 10;
Craft2.fLength = 20;
Craft2.fHeight = 5;
if(_CHASESETUP)
Craft2.fOrientation = -135;
else
Craft2.fOrientation = 135;
Craft2.CD.y = -0.12*Craft2.fLength; Craft2.CD.x = 0.0f; // coordinates of the body center of drag
Craft2.CT.y = -0.50*Craft2.fLength; Craft2.CT.x = 0.0f; // coordinates of the propeller thrust vector
Craft2.CPT.y = 0.5*Craft2.fLength; Craft2.CPT.x = 0.5*Craft2.fWidth; // coordinates of the port
Craft2.CST.y = 0.5*Craft2.fLength; Craft2.CST.x = -0.5*Craft2.fWidth; // coordinates of the starboard bow thruster
Craft2.ProjectedArea = (Craft2.fLength + Craft2.fWidth) * Craft2.fHeight;
Craft2.ThrustForce = _THRUSTFORCE*_THRUSTFACTOR;
return true;
}
void UpdateSimulation(void)
{
double dt = _TIMESTEP;
RECT r;
Craft1.SetThrusters(false, false);
if (IsKeyDown(VK_UP))
Craft1.ModulateThrust(true);
if (IsKeyDown(VK_DOWN))
Craft1.ModulateThrust(false);
if (IsKeyDown(VK_RIGHT))
Craft1.SetThrusters(true, false);
if (IsKeyDown(VK_LEFT))
Craft1.SetThrusters(false, true);
// Do craft 2 AI
Craft2.Fa.x = 0;
Craft2.Fa.y = 0;
Craft2.Pa.x = 0;
Craft2.Pa.y = 0;
if(BasicChase)
{
DoCraft2Chase();
DoCraft2ModulateThrust();
}
if(BasicEvade)
DoCraft2Evade();
if(InterceptChase)
{
//DoCraft2Intercept();
//DoCraft2ModulateThrust();
DoCraft2InterceptAlt();
}
if(PotentialChase)
DoAttractCraft2();
// update the simulation
Craft1.UpdateBodyEuler(dt);
Craft2.UpdateBodyEuler(dt);
if(FrameCounter >= _RENDER_FRAME_COUNT)
{
// update the display
if(!ShowTrails)
ClearBackBuffer();
DrawCraft(Craft1, RGB(0,0,255));
DrawCraft(Craft2, RGB(255,0,0));
RECT r;
r.left = (int) (Target.x-3);
r.top = (int) (Target.y-3);
r.right = (int) (Target.x+3);
r.bottom = (int) (Target.y+3);
DrawEllipse(&r, 1, RGB(0,255,0));
CopyBackBufferToWindow();
FrameCounter = 0;
} else
FrameCounter++;
if(Craft1.vPosition.x > _WINWIDTH) Craft1.vPosition.x = 0; if(Craft1.vPosition.x < 0) Craft1.vPosition.x = _WINWIDTH; if(Craft1.vPosition.y > _WINHEIGHT) Craft1.vPosition.y = 0; if(Craft1.vPosition.y < 0) Craft1.vPosition.y = _WINHEIGHT;
if(Craft2.vPosition.x > _WINWIDTH) Craft2.vPosition.x = 0; if(Craft2.vPosition.x < 0) Craft2.vPosition.x = _WINWIDTH;
if(Craft2.vPosition.y > _WINHEIGHT) Craft2.vPosition.y = 0;
if(Craft2.vPosition.y < 0) Craft2.vPosition.y = _WINHEIGHT;
}
void DrawCraft(RigidBody2D craft, COLORREF clr)
{
Vector vList[5];
double wd, lg;
int i;
Vector v1;
wd = craft.fWidth;
lg = craft.fLength;
vList[0].y = lg/2; vList[0].x = wd/2;
vList[1].y = -lg/2; vList[1].x = wd/2;
vList[2].y = -lg/2; vList[2].x = -wd/2;
vList[3].y = lg/2; vList[3].x = -wd/2;
vList[4].y = lg/2*1.5; vList[4].x = 0;
for(i=0; i<5; i++)
{
v1 = VRotate2D(craft.fOrientation, vList[i]);
vList[i] = v1 + craft.vPosition;
}
DrawLine(vList[0].x, vList[0].y, vList[1].x, vList[1].y, 2, clr);
DrawLine(vList[1].x, vList[1].y, vList[2].x, vList[2].y, 2, clr);
DrawLine(vList[2].x, vList[2].y, vList[3].x, vList[3].y, 2, clr);
DrawLine(vList[3].x, vList[3].y, vList[4].x, vList[4].y, 2, clr);
DrawLine(vList[4].x, vList[4].y, vList[0].x, vList[0].y, 2, clr);
if(ShowVectors)
{
Vector v, u;
double f = 5;
// Show velocity vectors in green
DrawLine(craft.vPosition.x, craft.vPosition.y, craft.vPosition.x+craft.vVelocity.x, craft.vPosition.y+craft.vVelocity.y, 3, RGB(0,255,0));
// Show force vectors in black
// thrust vector
v.x = 0;
v.y = craft.ThrustForce*f;
v = VRotate2D(craft.fOrientation, v);
u.x = craft.CT.x;
u.y = craft.CT.y;
u = VRotate2D(craft.fOrientation, u);
DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));
// port steering force
v.x = craft.PThrust.x*f;
v.y = craft.PThrust.y*f;
v = VRotate2D(craft.fOrientation, v);
u.x = craft.CPT.x;
u.y = craft.CPT.y;
u = VRotate2D(craft.fOrientation, u);
DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));
// stbd steering force
v.x = craft.SThrust.x*f;
v.y = craft.SThrust.y*f;
v = VRotate2D(craft.fOrientation, v);
u.x = craft.CST.x;
u.y = craft.CST.y;
u = VRotate2D(craft.fOrientation, u);
DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));
// applied force
v.x = craft.Fa.x*f;
v.y = craft.Fa.y*f;
v = VRotate2D(craft.fOrientation, v);
u.x = craft.Pa.x;
u.y = craft.Pa.y;
u = VRotate2D(craft.fOrientation, u);
DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0));
}
}
void DoCraft2Chase(void)
{
Vector u, v;
bool p = false;
bool s = false;
u = VRotate2D(-Craft2.fOrientation, (Craft1.vPosition - Craft2.vPosition));
u.Normalize();
Target = Craft1.vPosition;
if(u.x < -_TOL)
p = true;
else if(u.x > _TOL)
s = true;
Craft2.SetThrusters(p,s);
}
void DoCraft2Evade(void)
{
Vector u, v;
bool p = false;
bool s = false;
u = VRotate2D(-Craft2.fOrientation, (Craft1.vPosition - Craft2.vPosition));
u.Normalize();
if(u.x > 0)
p = true;
else if(u.x < 0)
s = true;
Craft2.SetThrusters(p,s);
Target = Craft2.vPosition;
}
void DoCraft2Intercept(void)
{
Vector u1, u2, u;
Vector s1, s2;
Vector Vr;
double t1, t2;
Vector s1unit, s2unit;
bool p = false;
bool s = false;
Vr = Craft1.vVelocity - Craft2.vVelocity;
s2 = GetVelocityIntersection() - Craft2.vPosition;
s2unit = s2;
s2unit.Normalize();
u2 = VRotate2D(-Craft2.fOrientation, s2);
t2 = s2.Magnitude()/(Vr * s2unit);
s1 = Craft1.vPosition - Craft2.vPosition;
s1unit = s1;
s1unit.Normalize();
u1 = VRotate2D(-Craft2.fOrientation, s1);
t1 = s1.Magnitude()/(Vr * s1unit);
if(t1 < 0.0)
{
u = u2;
Target = s2 + Craft2.vPosition;
} else if(t2 < 0.0) {
u = u1;
Target = s1 + Craft2.vPosition;
} else if(t2 < t1)
{
u = u2;
Target = s2 + Craft2.vPosition;
} else {
u = u1;
Target = s1 + Craft2.vPosition;
}
u.Normalize();
if(u.x < -_TOL)
p = true;
else if(u.x > _TOL)
s = true;
Craft2.SetThrusters(p,s);
}
void DoCraft2InterceptAlt(void)
{
Vector u;
Vector s1, s2, s12;
bool p = false;
bool s = false;
double tClose;
Vector Vr12;
double vr;
// turn around if we get ahead of the prey...
s12 = Craft1.vPosition - Craft2.vPosition;
u = VRotate2D(-Craft2.fOrientation, s12);
if(u.y < -_TOL)
{
//if(GetRandomNumber(0, 10, true) < 5)
p = true;
//else
// s = true;
Craft2.SetThrusters(p,s);
Target = Craft2.vPosition;
return;
}
Vr12 = Craft1.vVelocity-Craft2.vVelocity; // closing velocity s12 = Craft1.vPosition - Craft2.vPosition; // range to close
tClose = s12.Magnitude() / Vr12.Magnitude(); // time to close
s1 = Craft1.vPosition + (Craft1.vVelocity * tClose);
Target = s1;
s2 = s1 - Craft2.vPosition;
u = VRotate2D(-Craft2.fOrientation, s2);
u.Normalize();
if(u.x < -_TOL)
p = true;
else if(u.x > _TOL)
s = true;
Craft2.SetThrusters(p,s);
}
void DoAttractCraft2(void)
{
// Apply Lenard-Jones potential force to Craft2
Vector r = Craft2.vPosition - Craft1.vPosition;
Vector u = r;
u.Normalize();
double U, A, B, n, m, d;
A = 2000;
B = 4000;
n = 2;
m = 3;
d = r.Magnitude()/Craft2.fLength;
U = -A/pow(d, n) + B/pow(d, m);
Craft2.Fa = VRotate2D( -Craft2.fOrientation, U * u);
Craft2.Pa.x = 0;
Craft2.Pa.y = Craft2.fLength / 2;
Target = Craft1.vPosition;
}
Vector GetVelocityIntersection(void)
{
double s, t, num, denom;
Vector a,b,c,d;
a = Craft1.vPosition;
b = a+Craft1.vVelocity;
c = Craft2.vPosition;
d = c+Craft2.vVelocity;
denom = a.x * (d.y-c.y) +
b.x * (
c.y-
d.y) +
d.x * (b.y-a.y) +
c.x * (a.y-b.y);
if(denom == 0)
return Vector(a.x, a.y, 0);
num = a.x * (d.y-c.y) +
c.x * (a.y-
d.y) +
d.x * (c.y-a.y);
s = num/denom;
num = -( a.x * (c.y-b.y) +
b.x * (a.y-
c.y) +
c.x * (b.y-a.y) );
t = num/denom;
if( (s >= 0) && (t >= 0) )
return Vector(a.x+s*(b.x-a.x), a.y+s*(b.y-a.y),0);
else
return Vector(a.x, a.y, 0);
}
int GetRandomNumber(int min, int max, bool seed)
{
int number;
if(seed)
srand( (unsigned)time( NULL ) );
number = (((abs(rand())%(max-min+1))+min));
if(number>max)
number = max;
if(number number = min; return number; } void DoCraft2ModulateThrust(void) { Vector r = Craft1.vPosition - Craft2.vPosition; double dmax = Craft2.fLength * 10; if((Craft2.PThrust.Magnitude() > 0) || (Craft2.SThrust.Magnitude() > 0)) // turning { if(r.Magnitude() > dmax) Craft2.ThrustForce = _MAXTHRUST; else Craft2.ThrustForce = r.Magnitude() / dmax * _MAXTHRUST; } else { // todo: check how close we are to target and adjust speed to stay with it Craft2.ThrustForce = _MAXTHRUST; } } 人工智能实验报告大 全 人工智能课内实验报告 (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 《人工智能》课外实践报告 项目名称:剪枝法五子棋 所在班级: 2013级软件工程一班 小组成员:李晓宁、白明辉、刘小晶、袁成飞、程小兰、李喜林 指导教师:薛笑荣 起止时间: 2016-5-10——2016-6-18 项目基本信息 一、系统分析 1.1背景 1.1.1 设计背景 智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。能使人们在与电脑进行对弈的过程中学习五子棋,陶冶情操。并且推进人们对AI的关注和兴趣。 1.1.2可行性分析 通过研究,本游戏的可行性有以下三方面作保障 (1)技术可行性 本游戏采用Windows xp等等系统作为操作平台,使用人工智能进行算法设计,利用剪枝法进行编写,大大减少了内存容量,而且不用使用数据库,便可操作,方便可行,因此在技术上是可行的。 (2)经济可行性 开发软件:SublimText (3)操作可行性 该游戏运行所需配置低、用户操作界面友好,具有较强的操作可行性。 1.2数据需求 五子棋需要设计如下的数据字段和数据表: 1.2.1 估值函数: 估值函数通常是为了评价棋型的状态,根据实现定义的一个棋局估值表,对双方的棋局形态进行计算,根据得到的估值来判断应该采用的走法。棋局估值表是根据当前的棋局形势,定义一个分值来反映其优势程度,来对整个棋局形势进行评价。本程序采用的估值如下: 状态眠二假活三眠三活二冲四假活三活三活四连五 分值 2 4 5 8 12 15 40 90 200 一般来说,我们采用的是15×15的棋盘,棋盘的每一条线称为一路,包括行、列和斜线,4个方向,其中行列有30路,两条对角线共有58路,整个棋盘的路数为88路。考虑到五子棋必须要五子相连才可以获胜,这样对于斜线,可以减少8路,即有效的棋盘路数为72路。对于每一路来说,第i路的估分为E(i)=Ec(i)-Ep(i),其中Ec(i)为计算机的i路估分,Ep(i)为玩家的i路估分。棋局整个形势的估值情况通过对各路估分的累加进行判断,即估值函数: 72 F(n)= Σ E(i) i=1 1.2.2 极小极大值算法: 极大极小搜索算法就是在博弈树在寻找最优解的一个过程,这主要是一个对各个子结点进行比较取舍的过程,定义一个估值函数F(n)来分别计算各个终结点的分值,通过双方的分值来对棋局形势进行分析判断。以甲乙两人下棋为例,甲为max,乙为min。当甲走棋时,自然在博弈树中寻找最大点的走法,轮到乙时,则寻找最小点的走法,如此反复,这就是一个极大极小搜索过程,以此来寻找对机器的最佳走法。 班级::学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; 实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 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 《高级语言程序设计》实验报告 班级: 学号: 姓名: 成绩: 实验1熟悉Visual C++6.0环境及运行C 程序 一、实验目的 1.掌握在Visual C++6.0环境下C 程序的建立、编辑、编译和执行过程。 2.掌握C 程序的最基本框架结构,完成简单程序的编制与运行。 3.了解基本输入输出函数scanf()、printf ()的格式及使用方法。 4.掌握发现语法错误、逻辑错误的方法以及排除简单错误的操作技能。 二、实验内容 1.下列程序的功能是:从键盘输入两个数a 和b ,求它们的平方和,并在屏幕上输出。输入该C 程序,编译并运行之,记下屏幕的输出结果,以文件名sy1_1.c 保存。 #include A=x*y a =x*y ; print ('a=%d",A); print f ("a=%d",a ); printf("\n"); } (2)下程序的功能为:求两数中的较大数据并输出。纠正程序中存在的错误,以实现其功能。程序以文件名 sy1_3.c 保存。 #include 人工智能导论实验报告 学院:计算机科学与技术学院 专业:计算机科学与技术 2016.12.20 目录 人工智能导论实验报告 (1) 一、简介(对该实验背景,方法以及目的的理解) (3) 1. 实验背景 (3) 2. 实验方法 (3) 3. 实验目的 (3) 二、方法(对每个问题的分析及解决问题的方法) (4) Q1: Depth First Search (4) Q2: Breadth First Search (4) Q3: Uniform Cost Search (5) Q4: A* Search (6) Q5: Corners Problem: Representation (6) Q6: Corners Problem: Heuristic (6) Q7: Eating All The Dots: Heuristic (7) Q8: Suboptimal Search (7) 三、实验结果(解决每个问题的结果) (7) Q1: Depth First Search (7) Q2: Breadth First Search (9) Q3: Uniform Cost Search (10) Q4: A* Search (12) Q5: Corners Problem: Representation (13) Q6: Corners Problem: Heuristic (14) Q7: Eating All The Dots: Heuristic (14) Q8: Suboptimal Search (15) 自动评分 (15) 四、总结及讨论(对该实验的总结以及任何该实验的启发) (15) 实验一词法分析 班级:计科12-3 学号:08123282 姓名:樊鑫 一.实验目的 1、学会针对DFA转换图实现相应的高级语言源程序。 2、深刻领会状态转换图的含义,逐步理解有限自动机。 3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 二.实验内容 TINY计算机语言的编译程序的词法分析部分实现。 从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。 为了简化程序的编写,有具体的要求如下: (1)数仅仅是整数。 (2)空白符仅仅是空格、回车符、制表符。 (3)代码是自由格式。 (4)注释应放在花括号之内,并且不允许嵌套 三.实验要求 要求实现编译器的以下功能: (1)按规则拼单词,并转换成二元式形式 (2)删除注释行 (3)删除空白符 (空格、回车符、制表符) (4)列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式 (5)发现并定位错误 ,词法分析进行具体的要求: (1)记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。 (2)词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个 单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供 当前识别出记号的属性值。这样配合语法分析程序的分析需要的记号及其属性, 生成一个语法树。 (3)标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比 该表格,如果存在该表格中则是保留字,否则是一般标示符。 四.实验程序 #include 东南大学电工电子中心 实验报告 课程名称:电工电子实践初步 第 1~2 次实验 实验名称:常用电子仪器的使用 院(系):自动化学院专业:自动化 姓名:XXX 学号:0800XX 实验室:8室实验组别:XX 同组人员:实验时间:2010年8月21~9月9日评定成绩:审阅教师: 1、掌握常用电子仪器的使用方法; 2、掌握几种典型信号的幅值、有效值和周期的测量; 3、学会识别常用电子元器件; 4、学会用万用表测量电阻、电容的方法。 二、实验仪器设备 1、TDS1001型数字示波器; 2、F05A型数字合成函数/任意波信号发生器/计数器; 3、UT803型数字万用表 4、YB2172型交流毫伏表 三、实验内容 1、示波器测量前的调节与准备 内容:根据测量要求设置菜单变量。 2、机内标准信号测量 a、内容:将机内的标准方波信号输入到CH1通道,用示波器测量这个信号,将 波形画在坐标纸上,测量数据记录到表3中并分析讨论(峰峰值和周期要按所列格式记录)。用数字示波器测量电压峰峰值、高电平、低电平、周期时必须用三种方法:第一种方法是直接使用面板上的“MEASURE”按钮,然后在显示屏上读数;第二种方法是先读出波形垂直所占格数或水平所占格数,然后用“格数×倍率(V/DIV,S/DIV)”方式计算相应电压或时间;第三种方法是用游标来测量。 b、操作过程: ①将机内标准方波信号接入CH1通道; ②设置合适的电压灵敏度或扫描时基因数或使用自动设置功能(AUTOSET)以获 得稳定、清晰、观察效果好的波形; ③分别使用数字示波器的三种测量方法测量电压峰峰值、高电平、低电平、周 期,并记录数据和波形。 波形如下: 图1 机内标准方波信号 计算机科学与技术1341901301 敏 实验一:知识表示方法 一、实验目的 状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。 二、问题描述 有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 四、算法描述 (1)算法基本思想的文字描述; 实验1 Windows编程基础实验报告 一、实验目的和要求 (1)创建一个Win32应用程序Ex_SDK,在程序中构造一个编辑框控件和一个按钮。 (2)编辑框用于输入一元二次方程的系数,当单击“计算”按钮,获取方程系数得的根通过TextOut显示在窗口客户区中。 二、实验环境 操作系统:Windows 2000 编译器:Visual C++ 6.0的开发环境 三、实验准备和说明 (1)具备知识:简单的SDK编程基础。 (2)准备本次上机所需要的程序。 (3)创建本次实验工作文件夹“…\Visual C++程序\实验\实验1” 四、实验内容和步骤 1.启动Visual C++ 6.0 打开计算机,启动Visual C++ 6.0系统。 2.创建工程并添加代码 ①选择“文件”→“新建”菜单命令,打开应用程序向导,显示出“新建”对话框。单击“工程”标签,从列表框中选中Win32 Application(Win32 应用程序)项。在工程名称框中输入Win32应用程序项目名称Ex_SDK。单击浏览按钮...将工程定位到文件夹“…\Visual C++ 6.0程序\实验\实验1”。 ②单击“确定”按钮继续。在向导第一步对话框中,选中An empty project(一个空的工程)项。单击“完成”按钮,系统将显示AppWizard(应用程序向导)的创建信息,单击“确定”按钮,系统将自动创建此应用程序。 ③再次选择“文件”→“新建”菜单命令,显示出“新建”对话框。单击“文件”标签,在左边的列表框中选择C++ Source File项,在右边的“文件”下的编辑框中输入Ex_SDK.cpp,单击“确定”按钮。 ④在打开的文档窗口中输入下面的代码: #include 人工智能课内实验报告 (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-4章) 1.人工智能有哪几个主要的学派?各学派的基本理论框架和主要研究方向有何不同?2.用谓词逻辑方法表述下面问题积木世界的问题。 (定义谓词、描述状态、定义操作、给出操作序列) 3.请给出下列描述的语义网络表示: 1)11月5日,NBA常规赛火箭主场对阵小牛,火箭107-76大胜小牛。 2)张老师从9月至12月给自动化专业学生教授《自动控制原理》。李老师从10至12月 给计算机专业学生教授《操作系统原理》。 3)树和草都是植物;树和草都有根和叶;水草是草,生活在水中;果树是树,会结果; 苹果树是果树,结苹果。 4.请用相应谓词公式描述下列语句: 1)有的人喜欢足球、有的人喜欢篮球;有的人既喜欢足球又喜欢篮球。 2)喜欢编程的同学都喜欢计算机。 3)不是每个自控系的学生都喜欢编程。 4)有一个裁缝,他给所有不自己做衣服的人做衣服。 5)如果星期六不下雨,汤姆就会去爬山。 5.什么是谓词公式的解释?对于公式?x ?y (P(x)→Q(f(x),y)) D={1,2,3} 分别给出使公式为真和假的一种解释。 6.什么是合一?求出下面公式的最一般合一: P(f(y), y, x) P(x, f(a),z)。 7.把下面谓词公式化为子句集 ?x ?y (P(x,y)∨Q(x,y))→R(x,y)) ?x (P(x) →?y(P(y)∧R(x,y)) ?x (P(x)∧?y(P(y) →R(x,y))) 8.证明下面各题中,G是否是F的逻辑结论? F1: ?x (P(x) →?y(Q(y)→L(x,y))) F2: ?x (P(x)∧?y(R(y) →L(x,y))) G: ?x (R(x) →~Q(x)) F1: ?z (~B(z)→?y(D(z,y)∧C(y))) F2: ?x (E(x)∧A(x)∧?y (D(x,y) →E(y))) F3: ?y(E(y) →~B(y)) G: ?z (E(z) ∧C(z)) 9.已知:John, Mike, Sam是高山俱乐部成员。 高山俱乐部成员都是滑雪运动员或登山运动员(也可以都是)。 登山运动员不喜欢雨。 滑雪运动员都喜欢雪。 凡是Mike喜欢的,John就不喜欢。 凡是Mike 不喜欢的,John就喜欢。 Mike喜欢雨和雪。 问:高山俱乐部是否有一个成员,他是登山运动员,但不是滑雪运动员?如果有,他是谁?10.为什么说归结式是其亲本子句的逻辑结论? 11.何为完备的归结策略?有哪些归结策略是完备的? 12.何谓搜索?有哪些常用的搜索方法?盲目搜索与启发式搜索的根本区别是什么?13.用状态空间法表示问题时,什么是问题的解?什么是最优解?在图搜索算法中,OPEN 表和CLOSED表的作用是什么?f(x)有何不同含义? 14.宽度优先搜索和深度优先搜索有何不同?在何种情况下,宽度优先搜索优于深度优先搜索,何种情况反之? 15.什么是启发式搜索,g(x)与h(x)各有什么作用?A*算法的限制条件是什么? 实验1实验报告格式 《计算机图形学》实验1实验报告 实验题目:用户坐标、视图坐标、Java awt坐标概念的建立和应用 实验内容:掌握用户坐标、视图坐标、Java awt坐标概念,掌握三类坐标的转换算法。编写自己的算法函数,并形成Java语言程序包。编写程序调用验证之。 参考程序:有两个示范程序MyTest.java和MyLineDrawApplet.java 基本概念: 用户坐标:是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。 应用程序使用该坐标系:所有传给Java 2D渲染过程的坐标都是指用户坐标。例如下面程序中的默认用户坐标的范围是X轴从-1到1,Y轴也是凑够-1到1。 视图坐标:是设备相关的坐标,随目标渲染设备不同而不同。下面程序中定义的视图坐标的缺省值为(0,0)和(1,1)。 Java awt坐标:使用java.awt时使用的坐标,即窗口显示图像时的边界坐标。 填充:这个过程可以抽象的理解为以已知的线为中心,向周围扩展像素,然后对这些像素所在的方块进行着色。 将用户坐标转换为视图坐标实际上是将独立于设备的逻辑坐标转换为设备相关的坐标,将视图坐标转化为A WT坐标就是将视图坐标按照显示窗口的大小进行缩放。 算法设计:(详细叙述自己设计程序的功能、算法及实现) 程序的功能: 可以根据传入的用户坐标进行视图坐标、A WT坐标之间的转换,其反向转换同理也可以实现,即将转换的方法逆过去即可。此外,程序还可以进行图形的绘画和填充,比如矩形、椭圆、多边形等。 算法及其实现函数: 用户坐标到视图坐标的转换:对于相应的用户坐标应用数学中的平移与放缩,就可以得到视图坐标。具体方法如下:在用户坐标系下,设矩形窗口的左下角坐标为(Ux1,Uyb), 右上角为(Uxr,Uyt),视图坐标系下的两个点坐标分别为(Vx1,V yb)和(Vxr,V yt), 则视图坐标的表达式为:(Xu,Y u)是已知的用户坐标,(Xv ,Y v)是要求的视图坐标Xv=aXu+b Y v=cY u+d 其中:a=(Vxr-Vxl)/(Uxr-Uxl) b=Vxl-aUxl c=(V yt-V yb)/(Uyt-Uyb) d=V yb-cUyb //将用户坐标的点转换到视图坐标 public double view_x(double x) { double s=(x-user_i_x)/(user_a_x- user_i_x); double t=view_i_x[currentV iew]+s* //坐标的平移及压缩 (view_a_x[currentView]-view_i_x[currentV iew]); return t; } public double view_y(double y) { double s=(y-user_i_y)/(user_a_y-user_i_y); double t=view_i_y[currentV iew]+s* //坐标的平移及压缩 (view_a_y[currentView]-view_i_y[currentV iew]); return t; } 视图坐标到A WT坐标的转换:由于视图坐标在0到1之间,因此将显示窗口的宽和高 学生实验报告 学院:软件与通信工程学院 课程名称:大学物理实验 专业班级:通信工程111班 姓名:陈益迪 学号:0113489 学生实验报告 一、实验综述 1、实验目的及要求 1.了解游标卡尺、螺旋测微器的构造,掌握它们的原理,正确读数和使用方法。 2.学会直接测量、间接测量的不确定度的计算与数据处理。 3.学会物理天平的使用。 4.掌握测定固体密度的方法。 2 、实验仪器、设备或软件 1 50分度游标卡尺准确度=0.02mm 最大误差限△仪=±0.02mm 2 螺旋测微器准确度=0.01mm 最大误差△仪=±0.005mm 修正值=0.018mm 3 物理天平 TW-0.5 t天平感度0.02g 最大称量 500g △仪=±0.02g 估读到 0.01g 二、实验过程(实验步骤、记录、数据、分析) 1、实验内容与步骤 1、用游标卡尺测量圆环体的内外径直径和高各6次; 2、用螺旋测微器测钢线的直径7次; 3、用液体静力称衡法测石蜡的密度; 2、实验数据记录表 (1)测圆环体体积 (2)测钢丝直径 仪器名称:螺旋测微器(千分尺) 准确度=mm 01.0 估读到mm 001.0 次数i 千分尺读数(mm) 测定值d i (mm) d d d i i -=? (mm) 1 2.151 2.169 0 2 2.15 3 2.171 0.002 3 2.147 2.165 -0.00 4 4 2.150 2.168 -0.001 5 2.151 2.169 0 6 2.150 2.168 -0.001 7 2.153 2.171 0.002 测定平均值d 2.169 测石蜡的密度 仪器名称:物理天平TW —0.5 天平感量: 0.02 g 最大称量500 g 石蜡在空气的质量M 1 石蜡在空气中在、环在水中的质量M 2 石蜡和环均在水中的质量M 3 2.44g 11.04g 8.50g 3、数据处理、分析 (1)、计算圆环体的体积 ○ 1直接量外径D 的A 类不确定度S D ,S D= S D =0.0161mm=0.02mm ○ 2直接量外径D 的B 类不确定度u d. u d,= U d =0.0155mm=0.02mm ○ 3直接量外径D 的合成不确定度σσD = σD =0.0223mm=0.2mm ○ 4直接量外径D 科学测量结果 D=(21.19±0.02)mm ○ 5直接量内径d 的A 类不确定度S d 。S d = S d =0.0045mm=0.005mm 人工智能导论 实验报告 姓名:蔡鹏 学号:1130310726 实验一 一、实验内容 有如下序列,试把所有黑色格移到所有白色格的右边,黄色格代表空格,黑色格和白色格可以和距离不超过三的空格交换。 二、实验代码 #include Enstack(root,&S); while(S.num!=0) { n=Destack(&S); if(n->f < min->f) { min=n; } for(i=0;i 实验报告 课程名称:电机学指导老师:史涔溦成绩:__________________实验名称:直流电动机实验实验类型:验证性实验同组学生姓名: 一、实验目的和要求(必填)二、实验内容和原理(必填) 三、主要仪器设备(必填)四、操作方法和实验步骤 五、实验数据记录和处理六、实验结果与分析(必填) 七、讨论、心得 一、实验目的和要求 1、进行电机实验安全教育和明确实验的基本要求 2、认识在直流电机实验中所用的电机、仪表、变阻器等组件 3、学习直流电动机的接线、起动、改变电机转向以及调速的方法 4、掌握用实验方法测取直流并励电动机的工作特性和机械特性 5、掌握直流并励电动机的调速方法 6、并励电动机的能耗制动 二、实验内容和原理 1、并励直流电动机起动实验 2、改变并励直流电动机转向实验 : 3、测取并励直流电动机的工作特性和机械特性 4、并励直流电动机的调速方法 三、主要仪器设备 1、直流电源(220V,3A,可调) 2、并励直流电动机 3、负载:测功机。与被测电动机同轴相连。 4、调节电阻。电枢调节电阻选取0-90欧,磁场调节电阻选取0—3000欧。 5、直流电压电流表。电压表为直流250V,电枢回路电流表量程,励磁回路电流表量程200mA。 四、操作方法与实验步骤 (1)并励直流电动机的起动实验 接线图: ` 实验时,首先将电枢回路电阻调节到最大,因为起动初n=0,而端电压为额定值,如果电枢回路电阻过小那么会因电流过大而烧坏电机。其次应该Rf调节到最小,因为当电枢电流和电动势一定时,磁通量和转速是成反比的,如果磁场太弱,那么会造成很大的转速,从而造成危险。调节电源电压,缓缓启动电机,观察电动机的旋转方向是否符合负载的加载方向。最后逐步减小R1,实现分级起动,直到完全切除R1. 注意每次起动前,将测功机加载旋钮置0。实验完成后,将电压和测功机加载旋钮置0。 (2)改变并励直流电动机转向实验 改变转向,即改变导体的受力方向,则改变电枢电流或者磁场的方向都可以实现。因此对调励磁绕组或者电枢绕组的极性即可。重新起动,观察转向。 (3)测量并励直流电动机的工作特性和机械特性 1、完全起动电机并获取稳定转速,使得R1=0 2、将电动机调节到额定状态,调节电源电压测功机加载旋钮及磁场调节电阻R f ,至额定状态:U=U N , I=I N ,n=n N ,记下此时的I f ,即I fN 。 . 3、保持U=U N ,I f =I fN 不变,调测功机加载旋钮,逐渐减小电动机负载至最小,测I、n、T 2 。 (4)并励直流电动机的调速特性1、改变电枢电压调速 1) 按操作1起动后,切除电枢调节电阻R 1(R 1 =0) 实验报告 1.对CLIPS和其运行及推理机制进行介绍 CLIPS是一个基于前向推理语言,用标准C语言编写。它具有高移植性、高扩展性、 强大的知识表达能力和编程方式以及低成本等特点。 CLIPS由两部分组成:知识库、推理机。它的基本语法是: (defmodule< module-n ame >[< comme nt >]) CLIPS的基本结构: (1).知识库由事实库(初始事实+初始对象实例)和规则库组成。 事实库: 表示已知的数据或信息,用deftemplat,deffact定义初始事实表FACTLIS,由关系名、后跟 零个或多个槽以及它们的相关值组成,其格式如下: 模板: (deftemplate 实验1:三大生物信息中心浏览、DOTPLOT 一、实验目的: 1. 了解三大生物信息中心的资源; 2. 学习分析DOT PLOTS比对结果。 二、实验内容: (一)、三大生物信息中心浏览 1. NCBI 2. EBL 3. DDBJ (二)、DOTPLOT 1. 了解demo sequence 了解软件使用方法; 2. 通过序列自身比对,寻找其重复和反向重复区域。 三、作业: 1. Introduce the following NCBI databases in your own words:MMDB, CDD, dbGap, PMC., OMIM, UniGene, PubChem, RefSeq. MMDB——分子模型数据库(Molecular model database) 一个关于三维生物分子结构的数据库,结构来自于X-ray晶体衍射和NMR色谱分析。MMDB 是来源于Brookhaven蛋白数据库(PDB)三维结构的一部分,排除了那些理论模型。MMDB重新组织和验证了这些信息,从而保证在化学和大分子三维结构之间的交叉参考。数据的说明书包括生物多聚体的空间结构,这个分子在化学上是如何组织的,以及联系两者的一套指针。利用将化学,序列,和结构信息整合在一起,MMDB计划成为基于结构的同源模型化和蛋白结构预测的资源服务。MMDB的记录以ASN.1格式存储,可以用Cn3D, Rasmol, 或Kinemage来显示。另外,数据库中类似的结构已经被用V AST确认,新的结构可以用V ASTsearch来同数据库进行比较。(https://www.wendangku.net/doc/8f12677515.html,/Structure/MMDB/mmdb.shtml) CDD——蛋白质保留区序列数据库(Conserved Domain Database) 提供在分子演化过程中蛋白质保留区数据。资料来源为Smart资料库、Pfam数据库、研究人员提供的数据与MMDB数据库中已知3-D蛋白质结构的区域比对数据。藉由使用CD-Search工具,CDD可被用来鉴定蛋白质输入序列保留区;此外,CDART工具亦使用CDRPS-BLAST检索具相似区域结构的蛋白质。(https://www.wendangku.net/doc/8f12677515.html,/Structure/cdd/cdd.shtml)dbGaP——基因型和表型数据库(The database of Genotypes and Phenotypes ) 此数据库开发的归档和分发的调查研究基因型和表型的相互作用的结果。这些研究包括全基因组关联研究,医疗测序,分子诊断方法,以及基因型和非临床特征之间的关联。 (https://www.wendangku.net/doc/8f12677515.html,/gap) PMC——公共医学中心(PubMed Central) PMC是生命科学期刊文献的数字化文献馆,由美国国家医学图书馆(NLM)的国家生物技术信息中心(NCBI)开发和设计。PMC旨在扮演数字化时代世界级图书馆的角色。进入PMC是免费且不受限制的。PMC(包括Medline)是一个数据库精品,它可帮助研究者和临床医生们找到相关的文章,在多种情况下,还可直接链到全文出版者。(https://www.wendangku.net/doc/8f12677515.html,/pmc/) OMIM——在线人类孟德尔遗传(Online Mendelian Inheritance in Man) 孟德尔遗传学(OMIM)数据库是人类基因和基因疾病的目录数据库。该数据库包括原文信息、图片和参考信息,同时还可以链接到Entrez系统MEDLINE数据库中相关文献和序列信息。经常更新人类基因和遗传失调的目录。OMIM的使用:根据输入到检索窗口的一个或几个词执行简单的查询;返回含有该词的文档的列表;选择一个或更多的异常查看其OMIM记录的全文。(https://www.wendangku.net/doc/8f12677515.html,/omim/) UniGene——面向基因聚类数据库人工智能实验报告大全
人工智能实验报告
数据结构实验一 实验报告
游戏人工智能实验报告四
C实验报告1参考答案范文
(完整word版)哈工大人工智能导论实验报告
实验1实验报告
实践初步实验报告1
人工智能实验报告
实验1实验报告-
人工智能实验报告大全
人工智能导论1-4章作业
实验1实验报告格式
大学物理实验报告1
人工智能导论实验
电机学实验1实验报告
人工智能实验报告
实验报告1——20111012