博弈论最简单例子TacTicToe
博弈论是人工智能中的一个分支。顾名思义就是下棋的算法。当然引申出来的应用可能不止用来下棋,也可以用来做游戏或者模拟战争策略等。
博弈的基本算法也是模拟人的思维,比如当自己下子时遍历所有可能寻求最有利步骤,但是一种走法如果不能一步取胜则要考虑对方可能采取的对自己最不利的走法,如果对方不能取胜,然后再进一步考虑在对方的走法下自己最佳的应对是什么,如此递归下去,找到每条路径的胜算,采取最优策略。
伪代码可以这样:
function find_best(P)
{
var bestSolution=WORST;
for every possible step S after P:
if ( willWin(s))
return S;
else if(willEnd(S))
if( S >= bestSolution) bestSolution = S;
else
var W= find_worse(S);
if( W >= bestSolution ) bestSolution =W;
return bestSolution;
}
find_worse函数应该有类似的逻辑,唯一不同在于find_worse判断逻辑反过来,找出对对方最有利的解决办法。
上边描述的只是最简单的算法,实际上,在稍微复杂的棋类游戏中,这种算法都无法工作。原因是上述算法会递归遍历所有的可能性,在很多棋类游戏中,这在时间上无法支持的 – 太耗时。如果预先计算好所有可能又太耗存储空间。这时往往需要递归到特定深度即结束,并且由于往往不能搜索到棋局的最终胜或者负的结局,必须对任一状态有一个评估函数来评估分数。为了进一步优化,可能要对遍历的路径做些裁剪。比如,五子棋中不去考虑那些离已经存在的子太远的解决方案等等。
既然我们今天只研究最简单的情况,那么上边的算法还是可以解决问题的。我们就以井字棋为例,完全可以遍历所有情况,直接上递归算法都不会引起栈溢出 – 总共只有9步深度:).
代码在这里:http://www.luoxq.com/tic.html

博弈论最简单例子TacTicToe的更多相关文章
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- ko 简单例子
Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- 一个简单例子:贫血模型or领域模型
转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...
- jsonp的简单例子
jsonp的简单例子 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
随机推荐
- JavaScript(3)—— 正则表达式
---恢复内容开始--- 正则表达式 这是写的正则表达式,正则表达式的点比较多,也比较细.所以有些地方我们得注意的比较多.正则表达式在JS中是很重要的一个部分,其中他的语法都得牢记.不过最好还是理解性 ...
- 定义django admin的站点头,标题等
admin.py from django.contrib import admin from app.models import Product # Register your models here ...
- QTP连接MySQL
1.首先安装mysql数据驱动,qtp在windows系统下操作连接mysql,所以下载mysql-connector-odbc- 5.1.8-win32.msi 下载地址:http://mysq ...
- Ajax应用-定义一套自己的Ajax框架
—————————————————————————— <script type="text/javascript"> //定义个一个functio ...
- hdu_4539_郑厂长系列故事——排兵布阵(状压DP|最大团)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 题意:中文,不解释 题解:将每一行的状态压缩,然后进行DP,也可以用最大团做.这里我用的DP # ...
- PHP之curl函数相关试题
一.问答题 1.curl_setopt中超时设置,URL设置,post数据接收设置,解压缩设置,HEADER信息设置的参数名分别是什么? 2.curl批量设置参数的函数是什么? 二.编程题 1.封装一 ...
- php获取当前文件绝对路径
php如何获取当前文件的绝对路径. dirname(__FILE__) 函数返回的是脚本所在在的路径 <?php $basedir = dirname(__FILE__); echo $base ...
- ios屏幕
设备 屏幕尺寸 分辨率(pt) Reader 分辨率(px) 渲染后 PPI iPhone 3GS 3.5吋 320x480 @1x 320x480 163 iPhone 4/4s 3.5吋 32 ...
- VC2010编译错误
1. cannot convert parameter 1 from 'const char [43]' to 'LPCWSTR' 我是看了这个之后解决问题的~ http://blog.163.com ...
- Java学习笔记之类和对象
1.类是对象的抽象,对象是类的实例. 2.一个.java 文件,只能有一个公有类. 3.Java的默认访问权限是:default,即不加任何访问修饰符,该权限设置只能在同一包访问. 当前类 同一包 ...