博弈论最简单例子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 ...
随机推荐
- Quicksum
Quicksum Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- Ubuntu 12.04 中自定义DNS服务器设置
首先我们需要创建一个文件/etc/resolvconf/resolv.conf.d/tail: #vim /etc/resolvconf/resolv.conf.d/tail 然后我们在这个文件里写入 ...
- drawableLayout的使用(转载讲的比较清晰的文章)
创建drawbler的布局文件 初始化drawbler的列表 响应drawable列表点击事件 现在侧滑菜单使用很多,大都是通过SlidingMenu实现.现在也可以通过DrawerLayout 创建 ...
- HDU 5348 MZL's endless loop
乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #incl ...
- ios简单更改系统TabBar的高度
- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGRect frame = self.tabBar.frame; fra ...
- runat="server" 是什么意思?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...
- eclipse4.3 安装tomcat8
Go to the WTP downloads page, select the 3.6.0 version , and download the zip (under Traditional Zip ...
- c++ lower_bound upper_bound
lower_bound, first greater than or equal to upper_bound, first strickly greater
- DataGridView直接导出EXCEL
1public void DataToExcel(DataGridView m_DataView) { SaveFileDialog kk = new SaveFileDialog(); kk.Tit ...
- MyEclipse build path no actions available
MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用的开发.MyEclipse的功能非常强大,支持也十分广泛 ...