Skip to content

3 博弈问题

3.1 与或图

问题归约:复杂问题不断分解变换得到子问题,最后转化为若干本原问题。

  • 初始问题描述、将问题化为子问题的操作符、本原问题描述

与图 & 或图

  • 与图:将原问题分解为若干子问题的与\(\rightarrow\)与节点
  • 或图:将原问题变换为若干子问题的或\(\rightarrow\)或节点

与或图:如果原问题既需要分解有需要变换才能得到本原问题,则归约过程可使用与或图表示

  • 端节点:没有子节点的节点
  • 终止节点:本原问题对应的节点(终止节点一定是端节点)

与或图 & 问题的分解和变换

(不)可解节点

  • 终止节点是可解节点,不为终止节点的端节点是不可解节点
  • 对于或节点,若子节点(不)存在可解节点,则该或节点为(不)可解节点
  • 对于与节点,若子节点(不)都是可解节点,则该与节点为(不)可解节点

解图(解树):由可解节点构成的,并且由这些可解节点可以推出初始节点为可解节点的子图

状态空间法与问题归约法

状态空间法 问题空间法
问题求解 状态变换 问题分解
搜索过程 普通有向图 与或图
节点 状态 问题
状态变换规则(操作) 问题分解规则(操作)
求解 解径 解图(解树)

一般搜索过程

  1. 将原始问题作为初始节点,将其作为当前节点
  2. 应用分解和变换对当前节点进行扩展,为子节点设置指向父节点的指针
  3. 选择合适的子节点作为当前节点,反复执行(2)步,反复执行(不)可解标记过程,直到初始节点被标记为(不)可解节点为止

3.2 与或图的盲目搜索

与或树的广度优先搜索

  • 算法
  • 把初始节点放入open表
  • 将open表的第一个节点取出放入closed表,记为n
  • 如果节点n可扩展,则:
    1. 扩展节点n,将子节点设置父指针并放入open表尾部
    2. 考察子节点中是否有终止节点。若有,则标记为可解节点并放入closed表,并用可解标记过程对先辈节点进行标记
    3. 如果初始节点被标记为可解节点,则搜索成功并退出
    4. 从open表删除具有可解先辈的节点,转(2)步
  • 如果节点n不可扩展,则:
    1. 标记节点n为不可扩展节点
    2. 用不可标记过程对节点n的先辈节点进行标记。如果初始节点标记为不可解节点,则搜索失败并退出
    3. 从open表删除具有不可解先辈的节点,转(2)步

与或树的深度优先搜索

  • 扩展节点的子节点放在open表的首部

3.3 与或图的启发式搜索

最优解树:代价最小的解树

  • 解树的代价是自下而上逐层计算的
  • 与状态空间搜索的代价计算不同
  • 节点的代价:
  • 终止节点的代价:\(h(n)=0\)
  • 或节点的代价:\(h(n)=\min\{c(n,n_i)+h(n_i)\}\)\(n_i\)\(n\)的子节点
  • 与节点的代价:
    • 最大代价法:\(h(n)=\max\{c(n,n_i)+h(n_i)\}\)\(n_i\)\(n\)的子节点
    • 和代价法:\(h(n)=\sum{(c(n,n_i)+h(n_i))}\)
  • 非终止节点的端节点:\(h(n)=\infty\)
  • 解树的代价:初始节点的代价

希望树:任何时候都选择最有希望成为最有解树一部分的节点进行扩展

  • 初始节点在希望树中
  • 如果节点在希望树中,则:
  • 若节点为或节点,则子节点中代价最小的在希望树中
  • 与节点为与节点,则所有子节点在希望树中

希望树的代价:除非节点的全部子节点都是端节点,否则子节点的代价是不可知的

  • 根据问题本身提供的启发性信息定义启发函数,用启发函数估算节点代价
  • 每当有新一代节点生成,都要自下而上地重新计算先辈节点的代价

启发式搜索过程

  1. 把初始节点放入open表中
  2. 计算希望树
  3. 依次将open表中希望树的端节点取出并放入closed表,记为n
  4. 如果节点n为终止节点,则:
  5. 标记n为可解节点
  6. 对希望树使用可解标记过程,对节点n的先辈节点进行标记
  7. 如果初始节点标记为可解节点,则找到最优解树并退出
  8. 从open表中删除具有可解先辈的所有节点,转(2)步
  9. 如果节点n不为终止节点,且不可扩展,则:
  10. 标记n为不可解节点
  11. 对希望树使用不可解标记过程,对节点n的先辈节点进行标记
  12. 如果初始节点标记为不可解节点,则搜索失败并退出
  13. 从open表中删除具有不可解先辈的所有节点,转(2)步
  14. 如果节点n不为终止节点,但可扩展,则:
  15. 扩展节点n,将子节点设置父指针并放入open表
  16. 计算这些子节点及其先辈节点的代价,转(2)步

3.4 博弈树搜索

博弈树:任何一方的每一步都是对自己最有利、对对手最不利的方案,站在某一方将上述博弈过程表示为与或图,即博弈树

  • 博弈树的初始格局为初始节点
  • 博弈树中,或节点和与节点是逐层交替出现的,己方扩展的节点之间为或关系,对方扩展的节点之间为与关系
  • 所有使自己获胜的终局都是本原问题,对应的节点为可解节点;所有使 对方获胜的终局都是不可解节点

极大极小分析法

  • 基本思想:
  • 设为博弈双方中的一方寻找一个最优行动方案
  • 为了找到当前最优行动方案,需要考虑每一方案实施后对方要采取的行动,计算可能的得分
  • 为了计算得分,需要根据问题的特性定义估价函数,用于估算端节点的得分(静态估值)
  • 端节点的估值计算出来后,计算父节点的得分:
    • 或节点:选择子节点中最大得分作为父节点得分
    • 与节点:选择子节点中最小得分作为父节点得分
  • 若一个方案能获得较大倒推值,则它就是当前最佳行动方案
  • 局限性:
  • 对于十分复杂的问题,利用完整的博弈树进行极大极小分析是困难的
  • 可行的方法:只生成一定深度的博弈树,使用极大极小分析法找出当前最好方案,然后在已选分支上继续扩展,如此反复

倒推值的计算

\(\alpha-\beta\)剪枝

  • 基本思想:边生成博弈树边计算各节点的倒推值,根据评估出的倒推值范围及时停止扩展已无必要扩展的子节点
  • 剪枝方法:
  • 定义:与节点倒推值的上确界为\(\beta\),或节点倒推值的下确界为\(\alpha\)
  • \(\alpha\)剪枝:对于与节点及其父节点(一定是或节点),若\(\alpha\geq \beta\),则不必再扩展该与节点的其余子节点
  • \(\beta\)剪枝:对于或节点及其父节点(一定是与节点),若\(\alpha\geq \beta\),则不必再扩展该与节点的其余子节点
  • 简记:
    • 极小\(\leq\)极大,剪枝,\(\alpha\)永不下降
    • 极大\(\geq\)极小,剪枝,\(\beta\)永不上升
  • 要进行\(\alpha-\beta\)剪枝,则至少必须使某一部分的搜索树生长到最大深度
  • 采用\(\alpha-\beta\)过程都要使用某种深度优先的搜索算法