MATLAB社区

MATLAB,社区等

机器人游戏的MATLAB

一个关于即时技术的故事。有时候最好的学习就是不学习。

电脑、国际象棋和围棋
我在IEEE Spectrum上读到一篇关于围棋的计算机程序的文章。ai已经掌握了国际象棋。下一个会是谁?).如果你回顾电脑游戏的历史,你会发现国际象棋程序一直在稳步进步,直到最终能够击败最好的人类棋手。另一方面,围棋程序一直停留在一个与人类最优秀的棋手相去甚远的水平。为什么呢?

游戏程序的基本元素是前瞻。本质上,程序会说“如果我搬到这里,比搬到那里好还是坏?”在国际象棋中,这很容易计算。但在围棋中,这种基本的前瞻策略就不那么有效了。要评估一个董事会职位是否比另一个更强要难得多。

但是最近,围棋程序开始变得更好。发生了什么事?

两个白痴完成游戏
通过应用蒙特卡罗技术,围棋程序得到了改进。这与人类的游戏方式完全不同,但它的效果非常好。它之所以有效,是因为我们可以让计算机快速地做很多愚蠢的事情。我称之为“两个白痴完成游戏”。

tictacman

考虑下面的情况。你已经到了游戏的关键时刻。我们称它为位置x
移动A和b,你应该做哪一个?现在,不要只看前面的一步,要一直玩到完成。但这有一个明显的问题。如果你不够聪明,不知道下一步该怎么走,你怎么能打完整场比赛?很简单:让两个傻瓜随机(但合法)移动,直到其中一个赢。然后将游戏返回到X位置,让他们再次玩游戏。一次又一次。一次又一次。有时他们从A步开始,有时从b步开始。在你那些速度快但不太聪明的朋友玩了几千局之后,检查记录。一个傻瓜(以傻瓜为对手)更有可能用招式A还是招式B赢? Those simulated games will give you the answer. Here’s the amazing thing: the idiot’s best move is your best move too. Don’t ask one clever mouse to solve the maze. Release ten thousand stupid mice and follow the lucky ones. This is what cheap computation buys you.

这种方法的美妙之处在于它完全不需要策略。你不需要为任何特定的游戏建立特殊的知识结构。你只需要知道什么招式是合法的,游戏如何结束。

嘀嗒游戏
当我一读到这个技术,我就想在MATLAB中尝试一下。所以让我们做一个可以玩Tic Tac Toe(也称为零和叉)的程序。我以前用MATLAB写过嘀嗒字游戏程序。我试着让他们聪明,我试着让他们学习。这并不难。蒙特卡洛方法的有趣之处在于,我可以用最少的努力教它一个新游戏。事实上,它让玩许多游戏变得简单。通过一些面向对象编程,您可以编写一个通用的游戏工具。然后,您只需要插入一些知道一些规则的代码,然后就可以了!你有一个即时游戏程序。

我是这么做的。我做了一个叫TicTacToe的类,它知道游戏规则和如何画棋盘。然后我编写了一个名为botMoves的函数,它可以查看游戏对象并做出下一步行动。分离非常干净。上面提到的所有蒙特卡洛逻辑都存在于botMoves中。

我只需要一个简短的脚本让机器人自己播放。

游戏= TicTacToe;nSimulatedGames = 1000;虽然~游戏。isGameOver botMoves(游戏,nSimulatedGames);结束

变量nSimulatedGames指的是我们让傻逼朋友为每一个潜在的移动而玩的模拟游戏的数量。这是它实际运行时的动画。

滴答声

碰巧的是,电脑总是自己绑起来。这其实是个好消息,因为如果你的对手有那么一点点聪明,你就不可能赢。所以我们的机器人足够聪明,可以阻止自己获胜。一些游戏测试表明,它也足够聪明,可以避免输给人类。但如果我们愿意,我们可以通过减少模拟游戏的数量来降低程序的竞争力。如果我只让它为每个可能的移动运行10个模拟游戏,我就可以轻松击败它。

我没有在博客中展示我的代码,但你可以在这个GitHub存储库中获得它:Monte-Carlo-Games.这是井字棋类,这是botMoves函数

下个星期
这是两篇文章中的第一篇。下次我们将展示如何快速地将简单的井字游戏套用在其他游戏中。我们还将在我们的编程中加入社区元素。我们将使用科迪来获取我们编码工作中一些棘手的部分!

带我去第二部分!

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。