作业1: Bait游戏 实验报告

151220129 计科 吴政亿

任务一 深度优先搜索

变量简介

变量类型 变量名 变量含义
ArrayList closeList 存储已经走过的历史路径
boolean isCalculated 是否得到了能走到终点的答案
ArrayList depthFirstAction 存储dfs中的每一步动作
int nowStep 当前步骤在depthFirstAction的下标

函数简介

返回类型 函数名 传入参数 函数功能
boolean isInCloseList StateObservation obs 检测是否在历史状态中
boolean getDepthFirst StateObservation stateObs, ElapsedCpuTimer elapsedTimer 计算从stateObs出发的深度优先路径,如果找到则返回true
Types.ACTIONS act StateObservation stateObs, ElapsedCpuTimer elapsedTimer 根据局面stateObs调用getDepthFirst并返回当轮动作
void debugPrint Types.ACTIONS act 输出act动作信息
void debugPrintAllAction ArrayList actions 输入actions中所有动作信息

核心代码

boolean getDepthFirst(StateObservation stateObs, ElapsedCpuTimer elapsedTimer){if(stateObs in closeList)return false;elsecloseList.add(stateObs);stCopy = stateObs.copy();for(all actions in stateObs){try this action in stCopy;depthFirstAction.add(action);if(win) return true; // all actions are in 'depthFirstAction'else if(stateObs in closeList || Game over){stCopy = stateObs.copy(); // reset stCopydepthFirstAction.delete(action);continue;}else{ // a new stateif(getDepthFirst(stCopy,elapsedTimer))return true;else {stCopy = stateObs.copy(); // reset stCopydepthFirstAction.delete(action);continue;}}}return false;
}

任务二 深度受限的深度优先搜索

变量简介

变量类型 变量名 变量含义
ArrayList closeList 存储已经走过的历史路径
ArrayList stateDepth 历史路径里对应的每一个的深度
ArrayList limitDepthFirstAction 存储limitdfs中的每一步动作
double bestCost 精灵与目标在state中最优状态的距离
Vector2d goalpos 门的位置
Vector2d keypos 钥匙的位置

函数简介

返回类型 函数名 传入参数 函数功能
void initAgent null 初始化Agent
boolean isInCloseList StateObservation obs 检测是否在历史状态中
void limitDepthFirst StateObservation stateObs, ElapsedCpuTimer elapsedTimer, int depth 计算从stateObs出发的受限层数为depth的深度优先路径
Types.ACTIONS act StateObservation stateObs, ElapsedCpuTimer elapsedTimer 根据局面stateObs调用limitDepthFirst并返回当轮动作
void debugPrint Types.ACTIONS act 输出act动作信息
void debugPrintAllAction ArrayList actions 输入actions中所有动作信息
double getDistance Vector2d vec1, Vector2d vec2 返回vec1与vec2的曼哈顿距离
boolean avatarGetKey StateObservation stateObs 判断精灵是否得到钥匙
double heuristic StateObservation stateObs 启发式函数,返回局面评分
void debugPos Vector2d vec, String head 输出vec的位置信息

核心代码

protected void limitDepthFirst(StateObservation stateObs, ElapsedCpuTimer elapsedTimer, int depth){if(Reach the end of limitDepthFirst){nowStateScore = heuristic(stateObs);if(nowStateScore better than bestCost)bestAction = now actions;           return;}else if(stateObs is not game start){if(stateObs in closeList && depth same)return;else{closeList.add(stateObs);stateDepth.add(depth);}}else{ // at the beginning of limitdfs, init allcloseList.clear();stateDepth.clear();}for(all actions in stateObs){try this action in stCopy;limitDepthFirstAction.add(action);if(Game win) {nowStateScore = heuristic(stateObs);if(nowStateScore better than bestCost)bestAction = now actions;stCopy = stateObs.copy(); // reset stCopylimitDepthFirstAction.delete(action);continue;}               else{limitDepthFirst(stCopy,elapsedTimer,depth);stCopy = stateObs.copy(); // reset stCopylimitDepthFirstAction.delete(action);continue;}}
}

任务三 A*搜索

根据自己自行测试,可以在有限时间内完成第二关与第三关的搜索并成功通关。

变量简介

变量类型 变量名 变量含义
ArrayList closeList 存储已经走过的历史路径
PriorityQueue openList 存储尚未走的已探索到的步骤
boolean getAnswer 是否得到了能走到终点的答案
ArrayList aStarAction 存储aStar中的每一步动作
Vector2d goalpos 门的位置
Vector2d keypos 钥匙的位置

函数简介

返回类型 函数名 传入参数 函数功能
void initAgent null 初始化Agent
boolean isInCloseList StateObservation obs 检测是否在历史状态中
boolean isInOpenList StateObservation obs 检测是否在尚未走的已搜索到的区域中
void aStar StateObservation stateObs, ElapsedCpuTimer elapsedTimer, int depth 计算从stateObs出发的受时间限制的aStar路径
Types.ACTIONS act StateObservation stateObs, ElapsedCpuTimer elapsedTimer 根据局面stateObs调用aStar并返回当轮动作
double getDistance Vector2d vec1, Vector2d vec2 返回vec1与vec2的曼哈顿距离
boolean avatarGetKey StateObservation stateObs 判断精灵是否得到钥匙
double heuristic StateObservation stateObs 启发式函数,返回局面评分

核心代码

protected void aStar(StateObservation stateObs, ElapsedCpuTimer elapsedTimer) {initAgent();openList.add(startNode); // 将初始状态加入openListwhile(!openList.isEmpty()){Node tmp = openList.poll(); // 取得分最高的节点tmpaStarAction = tmp.actions; // 将aStarAction初始化为tmp从起点到当前位置的所有动作 closeList.add(tmp.stateObs.copy()); // 将tmp的状态加入closeList中标记已走过for(all actions in stateObs){stCopy = tmp.stateObs.copy();try this action in stCopy;aStarAction.add(act);if(Game win) {getAnswer = true;return ; // 最终的序列步骤在aStarAction中}else if(Game over || stateObs in closeList) { // 如果游戏结束或发现曾走过,则回溯aStarAction.delete(action);continue;}else if(stateObs in openList){ // 如果发现当前局面在openList待尝试if(new actions better than old){ // 如果当前走法优于之间走法refresh openList; // 则更新动作}aStarAction.delete(action); // 回溯}else{ // 这是一个新的动作openList.add(new Node(stCopy,heuristic(stCopy),aStarAction)); // 加入新的动作aStarAction.delete(action); // 回溯}}}
}

任务四 蒙特卡洛树搜索

算法框架

while(时间限制内){treePolicy选择一个当前可达状态selected;对子状态执行rollOut,得到得分;从selected开始执行backUp;
}
通过mostVisitedAction返回次数最大的动作并作为结果;

函数简介

函数名 传入参数 函数功能
rollOut null 不断随机向下搜索,当游戏结束或达到递归层数后对状态评分。更新Agent得分bound后返回得分。
backUp SingleTreeNode node, double result 传入一个节点与他的得分,对这个节点与他的所有祖先节点,访问次数+1,总分+=得分。
treePolicy null 如果当前节点有子节点未访问,则返回其中一个,否则调用uct从所有子节点中选择一个。
uct null 根据子节点总分,访问次数,Agent的得分bound计算节点分数,然后选择得分最高的返回。

核心代码

uct算法作为关键,他的子节点计算方式如下:

childValue(平均估值) = normalize(childTotalValuechildVisitTimes+ϵ),(ϵ=1∗10−6)normalize(childTotalValuechildVisitTimes+ϵ),(ϵ=1∗10−6)normalize(\frac{childTotalValue}{childVisitTimes+ \epsilon}),(\epsilon = 1*10^-6)
uctValue(节点分数) = childValue+2lnparentVisitTimes+1childVisitTimes+ϵ−−−−−−−−−−−−−−−√+ξ,ξchildValue+2ln⁡parentVisitTimes+1childVisitTimes+ϵ+ξ,ξchildValue + \sqrt{\frac{2\ln{parentVisitTimes + 1}}{childVisitTimes + \epsilon}}+\xi, \xi是噪声

简而言之,访问次数少的,平均分高的子节点节点分数更高,更容易被roolOut选中。由于在act中我们返回的是访问次数最多的子节点作为状态,所以可以看出uct对于可能成功的子节点更友好。

运行结果

【人工智能】作业1: Bait游戏 实验报告相关推荐

  1. 【人工智能】作业3: Aliens游戏 实验报告

    作业3: Aliens游戏 实验报告 吴政亿 151220129 wuzy.nju@gmail.com (南京大学 计算机科学与技术系, 南京 210093) 摘要:使用监督学习来模仿人玩游戏的动作, ...

  2. java弹弹球实验报告_Java弹球游戏实验报告—chen

    Java弹球游戏实验报告-chen 课 程 设 计 报 告 题 目 弹球小游戏 姓 名 方成 学 号 20 专 业 java 指导教师 陈华恩 2013年 12 月 30 目录 一.实验目的2 二.需 ...

  3. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc

    C语言拼图游戏实验报告 课程设计实验报告 班级:光电104-2 姓名:刘云龙 学号:201058501220 一.实验题目:使用C语言编写一个小游戏(拼图游戏) 二.实验目的:C语言是每一个通信学生的 ...

  4. java小游戏实训目的_Java弹球小游戏实验报告.doc

    Java弹球小游戏实验报告 滨江学院 Java程序设计实验报告 题 目 弹球小游戏 姓 名 许浩 学 号 20112346064 学 院 滨江学院 专 业 网络工程 年 级 2011级 指导教师 张舒 ...

  5. 扫雷c语言课程设计报告,扫雷游戏实验报告.docx

    扫雷游戏实验报告剖析 课程设计软件综合课程设计班 级:姓 名:学 号:指导教师:成 绩:电子与信息工程学院信息与通信工程系目录1.任务概述------------------------------- ...

  6. C语言中猜数大小的实验报告,猜数字游戏实验报告

    <猜数字游戏实验报告>由会员分享,可在线阅读,更多相关<猜数字游戏实验报告(17页珍藏版)>请在人人文库网上搜索. 1.C语言课程设计报告题 目:猜数字游戏班 级:通信工程组 ...

  7. java猜数字游戏实验报告_java猜数游戏实验报告.doc

    java猜数游戏实验报告 课 程 设 计 报 告 课程设计名称 Java程序设计-猜数游戏 指导教师 钟世刚 专业 班级 信息安全 学 号 姓 名 成 绩 一.设计任务与要求1 1.1 设计任务与要求 ...

  8. c语言程序设计扫雷游戏实验报告,C语言程序设计扫雷游戏实验报告.doc

    C语言程序设计扫雷游戏实验报告 中南大学 程序设计基础实践报告 题 目 设计一个和window系统类似的小游戏[挖地雷] 学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 ...

  9. c语言扫雷程序设计流程图,c语言程序设计扫雷游戏实验报告

    c语言程序设计扫雷游戏实验报告 中南大学 程序设计基础实践报告 题 目 设计一个和window系统类似的小游戏[挖地雷]学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 完 ...

最新文章

  1. labelimg颜色
  2. from . import _arpack ImportError: DLL load failed
  3. html div背景半透,css半透明背景实现方法
  4. 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )
  5. 配置FTP服务-要点总结
  6. 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators
  7. mysql 5.7 多主一从_mysql5.7多主一从,从机调优
  8. 数据结构与算法系列——排序(3)_折半插入排序
  9. Android相关资源
  10. Visual Studio Code 支持TensorFlow配置支持
  11. ANSI C、ISO C、Standard C、C89、C90、C99
  12. 同步异步+阻塞非阻塞-二述
  13. 使用tvp.player_v2_zepto.js播放腾讯视频
  14. Python乘法口诀
  15. 微信公众平台-服务号:网页授权域名 设置
  16. JS-节点的属性 获取各种节点(全)
  17. 浏览器无痕浏览还能查到记录吗,如何开启无痕模式
  18. 笔记本电脑外接显示器,仅显示器的时候卡顿问题的解决方案
  19. 2017年成都初中计算机考试时间,成都市教育局关于2017-2018学年全日制中小学教学时间安排的通知...
  20. Word文档中最规范页面设置如何设置

热门文章

  1. 【木马生成工具】Msfvenom介绍及利用
  2. Word突然不能复制粘贴怎么办?
  3. 估算负反馈运算放大电路的闭环电压放大倍数
  4. 放大倍数与增益dB换算
  5. 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4
  6. Bribe the Prisoners(2009 Round 1C C)
  7. 软件测试的36个常用术语
  8. 《自然》杂志发布2018年度影响世界的十大科学人物,中国神童入榜...
  9. C++11 enable_if 详解
  10. html+css 基础知识大总结