算法分析与实验研究报告

1398837199 贡献于2016-07-03

作者 13988  创建于2014-10-29 12:08:00   修改者13988  修改于2016-06-20 08:49:03字数7926

文档摘要:经历了一盘伟大的胜利后,李世石与“阿法狗”(AlphaGo)的围棋人机大战正持续引发着关注。对于创造出“阿法狗”的Deepmind公司来说,输掉 一盘棋并不是什么坏事,反而很高兴终于有人类发现了“阿法狗”的弱点,以帮助它进行改进。而“阿法狗”的强大,已经在前三盘展现得淋漓尽致,这真是一个伟 大的成就。如此了不起的人工智能程序,到底是怎样的人把它创造出来的呢?考察一下杰米斯•哈萨比斯(Demis Hassabis),这位Deepmind公司创始人的经历,你会发现,这并不是偶然。创造出AlphaGo的杰米斯•哈萨比斯,一个英国智力天才
关键词:

 哈尔滨工业大学(威海) 2016 年 春 季学期课程考核 (研究报告) 考 核 科 目: 面向问题求解的高级程序设计 学生所在院(系):软件学院 姓 名: 姚天 学 号: 151110432 研究题目:TacTicToe问题分析与实现 研究背景: 经历了一盘伟大的胜利后,李世石与“阿法狗”(AlphaGo)的围棋人机大战正持续引发着关注。对于创造出“阿法狗”的Deepmind公司来说,输掉 一盘棋并不是什么坏事,反而很高兴终于有人类发现了“阿法狗”的弱点,以帮助它进行改进。而“阿法狗”的强大,已经在前三盘展现得淋漓尽致,这真是一个伟 大的成就。如此了不起的人工智能程序,到底是怎样的人把它创造出来的呢?考察一下杰米斯·哈萨比斯(Demis Hassabis),这位Deepmind公司创始人的经历,你会发现,这并不是偶然。 创造出AlphaGo的杰米斯·哈萨比斯,一个英国智力天才   一月下旬,谷歌旗下的DeepMind公司公布其创造的“阿法狗”(AlphaGo)围棋程序击败了人类职业选手、欧洲冠军樊麾,这一消息震撼了主要 聚集在东亚的整个围棋圈。在Deepmind公司公布的一段视频中,有人就留意到,在“阿法狗”与樊麾对弈时,“阿法狗”的介绍标签上贴着一个英国国旗。 而这一次“阿法狗”挑战韩国的世界冠军李世石,现场的选手信息介绍中,也同样给“阿法狗”贴上了一个英国国旗。 1. 在“阿法狗”3:0战胜李世石后,这一做法显然可以做一些解读——来自英国的程序,在围棋这一古老的东亚智慧游戏上,战胜了来自东亚的人类。在多个场合中,“阿法狗”团队成员、包括DeepMind公司创始人杰米斯·哈萨比斯(Demis Hassabis)都曾强调围棋是智力游戏乃至人工智能领域的“圣杯”,但如今,这一“圣杯”已经被英国人攻破了。对于东亚人特别是我们中国人来说,该做如何感想?   首要的,还是要去了解Deepmind这家伟大的公司以及“阿法狗”的团队,其关键人物毫无疑问就是英国人杰米斯·哈萨比斯,尽管哈萨比斯并不是《自然》那篇论文上排名前列的作者,但名字列在了最后,这通常是团队老板的位置。正是他决定了要开发“阿法狗”。 1976年的伦敦北部,哈萨比斯诞生在一个有希腊-塞浦路斯混血的父亲和新加坡-中国混血的母亲的家庭中,是3个孩子中的老大。4岁时,就对国际象棋 表现出浓厚的兴趣;8岁编写自己的计算机游戏;13岁国际象棋达到大师水平,在一次欧洲比赛上仅输给了一代名将小波尔加;17岁就作为主力程序员,开发了 最早包含AI的游戏之一“主题公园”;20岁从剑桥大学获得计算机科学双重一级荣誉学位;不久之后创办自己的开创性视频游戏公司Elixir;从游戏界退 出后,回到科研领域,在海马体和情节记忆方面进行了开拓性的学术研究;随后又创办了DeepMind公司,迄今为止在人工智能领域创造了一个又一个的奇 迹。   以上还只是哈萨比斯惊人履历的一部分,像保持着蝉联5届脑力奥林匹克运动会全能脑力王(Pentamind)称号纪录这样的成就,还塞不进他的简历之中。毫无疑问,哈萨比斯是一个非凡的英国智力天才。 我觉得吧AlphaGo与李世石的对决称为“人机大战”至少在概念上是错误的,以为AlphaGo本身产生于人之智力,是一种程序化了的人之智力,因此本质上他还是“人人大战”,李世石完全凭借个人脑力和AlphaGo凭借众人脑力并借助罪魁苏最精准最冷静最严格遵循程序的计算机工具的“团敌人”的对决。 AlphaGo的研发团队之所以还要分析研究这次对决数据,目的还是改进AlphaGo这次暴露出来的缺陷并及时吸纳李世石之长处,吧AlphaGo程序越做越好,更加完善,这有正是人工智能最可爱或最可怕之处,它代表这一中越来越完美的趋势,而个人因为太多的局限性做不到这一点。可以预见,不断改进获得AlphaGo战斗力将更加强悍。 系统架构:这个系统采用C++实现,通过用类来分别实现人人对战与人际对战,用户可以自由选择。而用户与电脑进行博弈时,由于是电脑先手,根据一系列算法,电脑肯定会获胜。 代码实现: private: char board[3][3];//棋盘 int numMoves;//步数 char player[2];//玩家符号 Status status;//游戏状态 bool checkForWin(char c); bool computer_defend();//帮助电脑防守 bool computer_attack();//帮助电脑进攻 bool computer_rand();//平局已定,随便下 上面是游戏中最重要的几个函数,包括帮助电脑进攻及防守的函数,以及判定是否生理的函数,通过哥几个函数即可实现电脑一定会击败人。 void TicTacToe::computer_first(int a) { if (numMoves == 0)//电脑先走 { board[1][1] = 'X'; numMoves++; } else if (numMoves == 2)//电脑走第二步 { //玩家下在棱上,此时,电脑必胜。 if (board[0][1] == 'O' || board[1][0] == 'O' || board[1][2] == 'O' ||board[2][1] == 'O') { board[0][0] = 'X'; numMoves++; } //玩家下在角上。 else { int i = ((10 - a) - 1)/3;//行的下标 int j = ((10 - a) - 1)%3;//列的下标 board[i][j] = 'X'; numMoves++; } } else if (numMoves == 4)//电脑走第三步 { if (computer_attack()) { if (checkForWin('X') == true) { status = COMPUTER_WIN; } } else if (computer_defend()) { if (checkForWin('X') == true) { status = COMPUTER_WIN; } } else { computer_rand(); if (checkForWin('X') == true) { status = COMPUTER_WIN; } else if (numMoves == 9) { status = DRAW; } } } else { if (computer_attack()) { if (checkForWin('X') == true) { status = COMPUTER_WIN; } } else if (computer_defend()) { if (checkForWin('X') == true) { status = COMPUTER_WIN; } else if (numMoves == 9) { status = DRAW; } } else { computer_rand(); if (checkForWin('X') == true) { status = COMPUTER_WIN; } else if (numMoves == 9) { status = DRAW; } } } } //帮助电脑防守 bool TicTacToe::computer_defend() { if (board[0][0] == 'O'&&board[0][1] == 'O'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[0][0] == 'O'&&board[0][2] == 'O'&&board[0][1] == ' ') { board[0][1] = 'X'; numMoves++; return true; } else if (board[0][1] == 'O'&&board[0][2] == 'O'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[2][0] == 'O'&&board[2][1] == 'O'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[2][0] == 'O'&&board[2][2] == 'O'&&board[2][1] == ' ') { board[2][1] = 'X'; numMoves++; return true; } else if (board[2][1] == 'O'&&board[2][2] == 'O'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][0] == 'O'&&board[1][0] == 'O'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][0] == 'O'&&board[2][0] == 'O'&&board[1][0] == ' ') { board[1][0] = 'X'; numMoves++; return true; } else if (board[1][0] == 'O'&&board[2][0] == 'O'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'O'&&board[1][2] == 'O'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[0][2] == 'O'&&board[2][2] == 'O'&&board[1][2] == ' ') { board[1][2] = 'X'; numMoves++; return true; } else if (board[1][2] == 'O'&&board[2][2] == 'O'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[0][0] == 'O'&&board[2][2] == 'O'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[0][0] == 'O'&&board[1][1] == 'O'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[1][1] == 'O'&&board[2][2] == 'O'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'O'&&board[1][1] == 'O'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'O'&&board[2][0] == 'O'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'O'&&board[2][0] == 'O'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[1][0] == 'O'&&board[1][1] == 'O'&&board[1][2] == ' ') { board[1][2] = 'X'; numMoves++; return true; } else if (board[1][0] == 'O'&&board[1][2] == 'O'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'O'&&board[1][2] == 'O'&&board[1][0] == ' ') { board[1][0] = 'X'; numMoves++; return true; } else if (board[0][1] == 'O'&&board[2][1] == 'O'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'O'&&board[2][1] == 'O'&&board[0][1] == ' ') { board[0][1] = 'X'; numMoves++; return true; } else if (board[0][1] == 'O'&&board[1][1] == 'O'&&board[2][1] == ' ') { board[2][1] = 'X'; numMoves++; return true; } else { return false; } } //帮助电脑进攻 bool TicTacToe::computer_attack() { if (board[0][0] == 'X'&&board[0][1] == 'X'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[0][0] == 'X'&&board[0][2] == 'X'&&board[0][1] == ' ') { board[0][1] = 'X'; numMoves++; return true; } else if (board[0][1] == 'X'&&board[0][2] == 'X'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[2][0] == 'X'&&board[2][1] == 'X'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[2][0] == 'X'&&board[2][2] == 'X'&&board[2][1] == ' ') { board[2][1] = 'X'; numMoves++; return true; } else if (board[2][1] == 'X'&&board[2][2] == 'X'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][0] == 'X'&&board[1][0] == 'X'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][0] == 'X'&&board[2][0] == 'X'&&board[1][0] == ' ') { board[1][0] = 'X'; numMoves++; return true; } else if (board[1][0] == 'X'&&board[2][0] == 'X'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'X'&&board[1][2] == 'X'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[0][2] == 'X'&&board[2][2] == 'X'&&board[1][2] == ' ') { board[1][2] = 'X'; numMoves++; return true; } else if (board[1][2] == 'X'&&board[2][2] == 'X'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[0][0] == 'X'&&board[2][2] == 'X'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[0][0] == 'X'&&board[1][1] == 'X'&&board[2][2] == ' ') { board[2][2] = 'X'; numMoves++; return true; } else if (board[1][1] == 'X'&&board[2][2] == 'X'&&board[0][0] == ' ') { board[0][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'X'&&board[1][1] == 'X'&&board[2][0] == ' ') { board[2][0] = 'X'; numMoves++; return true; } else if (board[0][2] == 'X'&&board[2][0] == 'X'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'X'&&board[2][0] == 'X'&&board[0][2] == ' ') { board[0][2] = 'X'; numMoves++; return true; } else if (board[1][0] == 'X'&&board[1][1] == 'X'&&board[1][2] == ' ') { board[1][2] = 'X'; numMoves++; return true; } else if (board[1][0] == 'X'&&board[1][2] == 'X'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'X'&&board[1][2] == 'X'&&board[1][0] == ' ') { board[1][0] = 'X'; numMoves++; return true; } else if (board[0][1] == 'X'&&board[2][1] == 'X'&&board[1][1] == ' ') { board[1][1] = 'X'; numMoves++; return true; } else if (board[1][1] == 'X'&&board[2][1] == 'X'&&board[0][1] == ' ') { board[0][1] = 'X'; numMoves++; return true; } else if (board[0][1] == 'X'&&board[1][1] == 'X'&&board[2][1] == ' ') { board[2][1] = 'X'; numMoves++; return true; } else { return false; } } //平局已定,随便下 bool TicTacToe::computer_rand() { int i; int j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (board[i][j] == ' ') { board[i][j] = 'X'; numMoves++; return true; } } } return false; } 井字棋游戏程序设计的难点有以下方面: 1:判断玩家输入的坐标时候有效及坐标的位置是否已经被占据。利用while语句进行判断即可。 2:判断游戏是否已经结束。解决的方法:通过记数的方法和列出所有可能存在的游戏结束的情况。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档