机器博弈中的数据结构与基本方法(一)-----总结

一、基本概念

  博弈分类:单人博弈(华容道)、双人博弈(象棋、围棋)、多人博弈(麻将、桥牌);完全信息博弈(象棋、围棋)、不完全信息博弈(麻将、桥牌、三国杀等)。

  注:大一曾选修过一门课:博弈论,也在数模班做过一些博弈方面的研究,有一些基础,所以对机器博弈中博弈概念很容易就理解了。但博弈论(Game Theory)是经济学的一个重要分支(虽然我发现我们学校图书馆有关博弈论的书籍主要放在数学类书架,这也是有其原因的),主要研究的是社会两难问题(如经典的囚徒困境问题),通常是非零和博弈(即致力于出现双赢局面),而机器博弈(以棋类为代表)主要研究零和博弈(即博弈参与者一方获利另一方必然遭受损失,比如所有的棋类都以战胜对方为目的)。关于经济学中的博弈在此不做赘述。

二、机器博弈中的数据结构

  关于数据结构的具体知识在此不做赘述,如果没有此方面知识根本没必要往下看。本学期刚刚学完数据结构,有些同学觉得都是很枯燥的理论,其实这枯燥与有趣之间缺德就是那么一点探索精神和自主学习意识,如果AI五子棋------------初探用的就是很基本的数组。以象棋为例,可以用数组存储棋盘,用布尔矩阵检查合法性。

  排序、查找在机器博弈中也频繁使用,因为要对每一种策略的得分(这个概念下面解释)进行筛选,找出最优策略。

  递归及回溯思想同样很重要。

  在涉及图的存储是,邻接表是实际应用最广泛的。

三、着法

  着法就是一个棋子从一个位置移动到另一个位置(象棋)或将不在棋盘上的棋子放在棋盘上某个位置(五子棋、围棋)。机器博弈要直接解决的问题就是如何做出最优着法。着法的最基本的要求是符合游戏规则,比如马走日,象飞田,马脚蹩子不能走,象眼堵住不能走等等。

四、博弈树

  今年李世石和AlphaGo的人机大战让蒙特卡洛树搜索从一个高深的专业词汇变成了一个众口相传的科技热词。博弈树分支越多,该类博弈对于程序设计的要求就越高,因为是指数增长的,所以除非NP=P,否则博弈树存储及搜索永远是一个难题,也是左右机器博弈水平的关键因素。

五、评估函数

  评估函数就是一个打分机制,通过评估函数,上文中贴出的连接中所使用的赢法数组就是一种简单的评估函数,评估函数是着法的基础,评估函数的合理性很大程度影响博弈水平。我猜想,机器学习很重要的一部分就是通过重复博弈来反复调整评估函数达到最佳状态。此外,专业棋手肯定比程序编写者更适合设计评估函数,因为他们的经验正是机器学习的目的。此外,已经启发式算法(模拟退火算法、遗传算法)也被广泛应用到机器博弈中,我曾经用模拟退火算法写过最短路径的程序021 模拟退火算法学习(一)-----求解最短连通路径,确实这种启发式算法能有效避免全局搜索的低效和爬山算法(一种贪心策略)局部最优解问题。

六、基本搜索方法

  产生博弈树之后海妖搜索博弈树获得一个最优解,常用的搜索策略有DFS和BFS,但是DFS搜索整个博弈树显然是不现实的,所以都会认为设置深度,但是过浅则影响博弈水平,过深则影响时间效率。同样,启发式搜索也是一种不错的选择,如极大极小法,alpha-beta剪枝,负极大值搜索。

七、博弈程序设计

  语言选择,面向对象语言在设计大型程序时优势明显。界面应该美观易用,交互性好。逻辑结构应该清晰,功能应该完备,包括基本设置,搜索策略设置,悔棋、打谱、存盘等基本功能。

  

时间: 2024-10-08 19:54:18

机器博弈中的数据结构与基本方法(一)-----总结的相关文章

机器博弈中的数据结构与基本方法(二)-----递归及回溯法实例

1.跳马问题:从左上角开始,按照象棋中马的行走规则(但是不考虑马脚,只需要按日字走),要求每个点走一次且仅一次,并且所有的点走走到,求解所有可行走法. 思路及代码: 1 #include <cstdio> 2 int a[9][9]; //包含边界拓展 3 int S = 0; //总的方案数 4 void PrintAnswer(){ //打印行走策略 5 printf("Answer\t%d\n", S); 6 for (int i = 2; i < 7; i++

C++中三种创建对象的方法【转】

我们都知道C++中有三种创建对象的方法,如下: #include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; } 第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者

Java中的数据结构-HashMap

Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 HashMap 组成结构 1.2.1 Hashmap底层数据结构 2.HashMap源码解析 2.1 HashMap属性源码解析 2.1.1 HashMap中的静态常量 2.1.2 HashMap中的属性 2.1.3 HashMap中的存储结点 2.1.4 Hash表 2.2 HashMap数据的改变

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

[转]详细介绍java中的数据结构

详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各种数据结构,但是我还是要说一说java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. C

java中的数据结构总结

Java的类库实在是很多,以至于很多人都不太了解,结果总是自己造轮子. 下面汇总了Java中的一些数据结构,加上一些实现的分析,同时备忘. 至于时间复杂度,个人觉得写出来的用处不大.如果明白它是怎么实现的,那自然就知道它的时间复杂度. 如果不理解它的实现,把时间复杂度背得再熟也没用. 接口: Collection<E> 子接口: BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, Navi

sql点滴42—mysql中的数据结构

MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补. 表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535)

java中的数据结构(集合|容器)

对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的操作.存储就出现了集合,集合应该是存储对象最常用的一种方式了,相对于数组更灵活,可变长度.同时集合也只能存储对象不能使基本数据类型. 集合框架分为两个派系Collection和Map而每一种集合类型都是基于特定的数据结构,Collection接口继承了Iterable接口所以可以使用Iterable

SQL Server数据库中还原孤立用户的方法集合

SQL Server数据库中还原孤立用户的方法集合 虽然SQL Server现在搬迁的技术越来越多,自带的方法也越来越高级. 但是我们的SQL Server在搬迁的会出现很多孤立用户,微软没有自动的处理. 因为我们的数据库权限表都不会在应用数据库中,但是每次对数据库作迁移的时候,单个数据库却带着它的数据库用户对象. 并且我们在新的数据库机器上也不能登录这些账号,但是它却静悄悄的存在我们的数据库中. 微软以前提供的一个老的接口存储过程来处理这个问题. sp_change_users_login 将