前文回顾


在上篇文章中,我们约定了一种衡量格子价值的方式,如下表。

综合价值排序 己方价值 敌方价值 对应的奖励数值
1 Lv1 ? \(2^{20}\)
2 ? Lv1 \(2^{16}\)
3 Lv2 ? \(2^{12}\)
4 Lv2 \(2^{8}\)
5 Lv3 \(2^{4}\)
6 Lv4 \(2^{0}\)

在该表中,对不同的情形,设计了不同的奖励数值,这些数值大多是采用经验公式,人为估计的数值,并不是最优良的数值。同样的,在上表中的除前两类为,其余都可根据实际情况进一步的细分权重,这里给出一个样例供大家参考/理解:

综合价值排序 己方价值 敌方价值 对应的奖励数值
3.1 Lv2 Lv2 \(2^{13}\)
3.2 Lv2 Lv3 \(2^{12}\)
3.3 Lv2 Lv4 \(2^{11}\)

同样是能构成杀招(Lv2等级),能顺便堵死对面杀招/优良的位置自然是更好的。

在附录中给出了详细的权重表

本篇中我们将基于遗传算法讨论如何让AI学习奖励值。

遗传算法概述


遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传机制的优化算法。它用于寻找问题的最优解,特别适用于复杂的优化问题和搜索问题。遗传算法基于达尔文的自然选择理论,通过模拟生物进化过程来逐步改进解决方案。

遗传算法的基本步骤如下:

  1. 初始化:创建一个初始种群,种群中的每一个个体(通常称为染色体或解)是问题的一个潜在解。

  2. 评估:计算种群中每个个体的适应度值,这通常通过一个目标函数来进行,适应度值表示个体的优劣。

  3. 选择:根据适应度值选择个体进行繁殖,优良个体有更高的概率被选择,以生成下一代种群。

  4. 交叉(Crossover):通过将两个个体的部分基因交换,生成新的个体。这一步模仿了生物的交配过程,可以产生新的解。

  5. 变异(Mutation):在某些个体中随机改变基因,以引入新的基因变异。这一步帮助算法跳出局部最优解,增加解的多样性。

  6. 替换:将一部分个体替换为最优良的个体,保留最优秀的基因,使得种群的型状不会出现下降或震荡。

  7. 终止:判断算法是否满足终止条件,如达到最大迭代次数或找到足够好的解。如果满足条件,算法终止,返回最优解;否则,返回第2步。

遗传算法实现思路

初始化


本文所设计的AI决策方案共包含12个参数,其中11个是奖励权重\(R_i\),1个是对劣质选项接受度\(K\)。

我们可以定义\(N\)个智能体,分别用初始权重进行初始化,一般来说,\(N\)可以取10~100,最好选择偶数,否则会有一些不必要的麻烦。

初始化过程可以用数学公式表示为:

\[W_i^{t=0} = W_0
\]

其中,\(W_0\)表示初始权重,\(W_i^{t=0}\)表示第\(t\)代的第\(i\)个个体。

评估


本例中,采用让AI对弈的方式,根据AI在棋局中的表现评估AI得分,具体流程如下:

  1. 生成一个从1到N的随机排列,并将其按顺序分配给AI
  2. 将序号为1、3、5、...的AI与序号为2、4、6、...的AI对弈
  3. 将棋局结果记录到AI得分表内。
  4. 是否完成\(N_R\)轮对局,倘若未完成,则返回到1。
  5. 对AI进行排名。

交叉


当完成排名时,让排名后50%的AI及前50%的AI两两组合,其数学公式如下

\[\begin{align*}
W_{i}^{t+1}&=W_i^t\times(1-c)+W_{i-50}^t\times c, &N/2 \leq &t \leq N \\
W_{i}^{t+1}&=W_i^t\times(1-c)+W_{i+50}^t\times c, &0 \leq &t \leq N/2
\end{align*}
\]

其中:\(c\)为学习因子(交叉率),表示AI在学习过程中对新知识(权重)的接受程度,\(c\)越大,AI越倾向于接受新权重,\(c\)越小,AI越倾向于保留旧权重。交叉率\(c\)一搬可取\(0.01\sim0.3\)

替换


首先定义局部最优个体和全局最优个体。

  • 局部最优\(W_b^t\):如果一个个体在本轮中的综合成绩排名为第一名(胜场最多),那么称其为局部最优个体。

  • 全局最优\(W_B\):当只进行一轮迭代时,全局最优个体等于局部最优个体,即:\(W_B=W_b^{t=0}\)。当进行了不止一局游戏时,将新的局部最优个体与全局最优个体进行\(N_R\)轮对局,倘若全局最优个体获胜,则其依旧为全局最优个体,倘若其失败,则局部最优个体成为新的全局最优个体。可以用数学公式表示为:

\[W_B=
\begin{cases}
W_b^t &\text{if}\;W_b^t \;\text{win},\\
W_B &\text{otherwise}.
\end{cases}
\]

为了保留最优的性状,将排名靠后的部分个体替换为全局最优个体,记替换率为\(s\),一般取\(0.02\sim 0.1\)

变异


在变异过程中,个体的基因发生随机的改变。定义变异系数\(m\),其绝对了变异的程度,一般来说\(m\)的范围在\(0.01\sim0.1\)数学公式如下:

\[W_{i,j}^{t}=W^t_{i,j}\times (1+m_j)
\]

其中\(W_{i,j}^{t}\)表示第\(t\)代的第\(i\)个个体的第\(j\)个权重,\(m_j\)是在\((-m,m)\)内的随机数。

流程汇总


以下给出遗传算法学习的流程

  1. 初始化种群

  2. 创建棋局,各个个体互相对战,统计得分并进行排名

  3. 判断是否达到停止条件,若不是则继续。

  4. 依排名将个体两两匹配,进行交叉操作

  5. 将排名靠后的个体分别替换为局部最优个体和全局最优个体

  6. 进行变异操作

  7. 转至步骤2

附录

行为优先级

  • Lv1:下子直接取胜,或在一回合内取胜。
  • Lv2:下在大概率在若干回合内取胜。
  • Lv3:能够迫使对方一直防御。
  • Lv4:收益较低。

初始权重表

综合价值排序 己方价值 敌方价值 对应的奖励数值
1 Lv1 ? \(2^{20}\)
2 ? Lv1 \(2^{16}\)
3.1 Lv2 Lv2 \(2^{13}\)
3.2 Lv2 Lv3 \(2^{12}\)
3.3 Lv2 Lv4 \(2^{11}\)
4.1 Lv3 Lv2 \(2^{9}\)
4.2 Lv4 Lv2 \(2^{8}\)
5.1 Lv3 Lv3 \(2^{6}\)
5.2 Lv3 Lv4 \(2^{4}\)
6.1 Lv4 Lv3 \(2^{2}\)
6.2 Lv4 Lv4 \(2^{0}\)

符号说明

符号 意义 数值范围
\(W\) 个体(权重) -
\(R\) 行动的奖励 -
\(K\) 对劣选项的接受程度 -
\(N\) 种群大小 10~100
\(N_R\) 评估时的对局轮数 10~100
\(T\) 迭代次数 20~500
\(c\) 交叉率 0.01~0.03
\(s\) 替换率 0.02~0.1
\(m\) 变异率 0.01~0.1

五子棋AI:实现逻辑与相关背景探讨(下)的更多相关文章

  1. .NET同步与异步之相关背景知识(六)

    在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...

  2. 五子棋AI清月连珠开源

    经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...

  3. 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

    五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...

  4. 五子棋AI大战OC实现

    Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...

  5. 五子棋AI教程

    https://github.com/Chuck-Ai/gobang 我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI: 五子棋AI设计教程第二版一:前言 五子棋AI设计教程第二版二:博弈 ...

  6. 如何使用jMeter发送两个逻辑上相关的HTTP请求

    在前一篇文章使用jMeter构造大量并发的随机HTTP请求里我通过jMeter构造了大量的HTTP GET并发请求,对服务器产生了大量读操作. 现在我有另一个需求场景:假设我开发了一个创建Servic ...

  7. 【五子棋AI循序渐进】——开局库

    首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...

  8. {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性  定位(position)z-index

    前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式表来对文 ...

  9. 【五子棋AI循序渐进】——多线程搜索

    关于多线程搜索,有很多方法来实现,很多文章推荐基于MTD(F)的方式.好处不言而喻,不过我的程序中采用的是基于PVS的多线程搜索.实现起来主要是这几个方面问题需要解决: 1.置换表的互斥访问. 2.局 ...

  10. 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码

    前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...

随机推荐

  1. WPF实现TextBlock呼吸灯效果

    实现代码 <TextBlock Text="录像中" FontSize="48" Foreground="#ED4646" Horiz ...

  2. DASCTF X GFCTF 2024|四月开启第一局 [PWN]详解

    DASCTF X GFCTF 2024|四月开启第一局[PWN] wp(详解) 1.dynamic_but_static 题目保护情况 64位程序,没有开canary和pie保护,got表可改 64位 ...

  3. SpringBoot中的一些组件

    Redis 引入data-redis-starter <dependency>    <groupId>org.springframework.boot</groupId ...

  4. var、let、const 区别?

    var 存在变量提升.let 只能在块级作用域内访问.const 用来定义常量,必须初始化,不能修改(对象特殊) 1.var[声明变量] var 没有块的概念,可以跨块访问,无法跨函数访问: 2.le ...

  5. css3 html5

    vscode的使用 什么是HTML5? HTML5新增语义化标签 多媒体标签 <audio>音频标签 谷歌浏览器 把autoplay属性给我们禁用. 两种音频格式的播放 视频标签<v ...

  6. Mac部署Tomcat8.5

    官网下载 点我直达 启动 将Tomcat包解压后并放到这个目录下:/Users/chenyanbin/plus/tomcat8.5/bin 切换目录: cd /Users/chenyanbin/plu ...

  7. Java 中的泛型 集合(List,Set) Map

    泛型 集合(List,Set) Map 泛型 泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查 ...

  8. vue高频面试题

    来源:B站程序员来了 第一部分:vue基础 1,v-if和v-for的优先级谁更高?同时出现该如何优化性能? 在同级出现的时候,render函数会将v-for和v-if同时渲染在一个名为_l的函数,在 ...

  9. vue小知识~实现父子组件双向数据绑定

    vue的数据是单向数据流动,在子组件中是不可以修改父组件的数据的,但是还是可以通过其他方式间接修改父组件的数据. 核心思想:数据在哪个组件,就在哪个组件修改. 1,方式一:通过向子组件传递方法 这个方 ...

  10. 记hashmap

    hashmap是map接口的一个实现类,在同步的情况下hashmap的性能是比较好的 hashmap就是一个kv键值对的集合,将数值散列均匀的存储在哈希表中.插入方法为map.put(k,v),读取方 ...