# 03 Problem solving search

Outline

function SIMPLE-PROBLEM-SOLVING-AGENT(percept) returns an action
static:seq, an action sequence, initially empty
state, some description of the current world state
goal, a goal, initially null
problem, a problem formulation
state ← UPDATE-STATE(state,percept)
if seq is empty then do
goal ← FORMULATE-GOAL(state)
problem ← FORMULATE-PROBLEM(state, goal)
seq ← SEARCH(problem)
action ← FIRST(seq)
seq ← REST(seq)
return action


（抽象）状态=真实状态的集合
（抽象）行动=真实行动的复杂组合
（抽象）解=真实世界解决方案的真实路径集合

Tree search algorithms——搜索树
function Tree-Search(problem, strategy) returns a solution, or failure
initialize the search tree using the initial state of problem
loop do
if there are no candidates for expansion then return failure
choose a leaf node for expansion according to strategy(根据不同策略选择扩展节点)
if the node contains a goal then return the corresponding solution
else expand the node and add the resuling nodes to the search tree
end

function TREE-SEARCH(problem, fringe) returns a solution, or failure
fringe ← INSERT(MAKE-NODE(INITIAL-STATE[problem],fringe)
loop do
if fringe is empty then return failure
node ← REMOVE-FRONT(finge)
if GOAL-TEST[problem](STATE[node]) then return SOLUTION(node)
fringe ← INSERTALL(EXPAND(node, problem), fringe)
function EXPAND(node, problem) returns a set of nodes
successors ← the empty set
for each action, result in SUCCESSOR-FN[problem](STATE[node]) do
s ← a new NODE
PARENT-NODE[s] ← node; ACTION[s] ← action; STATE[s] ← result
PATH-COST[s] ← PATH-COST[node] + STEP-COST(node,action,s)
DEPTH[s] ← DEPTH[node] + 1
return successors

1.广度优先搜索：扩展未扩展过的最浅节点，将边缘组织成FIFO队列实现，新的厚积节点加入到队列尾

2.一致代价搜索：扩展代价最小的未扩展的节点，边缘组织成按路径损耗排序的队列实现，若单步代价均相等则等价于广度优先搜索

3.深度优先搜索：扩展深度最深的未扩展过的节点，边缘=LIFO队列，后继结点放在队列前

4.深度受限搜索：设置界限l，解决无限深度路径问题

5.迭代加深的深度优先搜索：每轮增加深度限制的深度受限搜索
function ITERATIVE-DEEPENING-SEARCH(problem) returns a solution
inputs:problem, a problem
for depth o to ∞ do
result DEPTH-LIMITED-SEARCH(problem, depth)
if result ≠ cutoff then return result
end 

N(IDS)=50+400+3000+20000+100000=123450
N(BFS)=10+100+1000+10000+100000+999990=1111100
IDS表现更优，因为在深度为d的节点不需展开

function GRAPH-SEARCH(problem,fringe) returns a solution, or failure
closed ← an empty set
fringe ← INSERT(MAKE-NODE(INITIAL-STATE[problem]),fringe)
loop do
if fringe is empty then return failure
node ← REMOVE-FRONT(finge)
if GOAL-TEST(problem, STATE[node]) then return node
if STATE[node] is not in closed then
fringe ← INSERTALL(EXPAND(node,problem),fringe)
end

# 04 Informed search

Outline

h(n)是特定问题的函数，若n是目标节点，则h(n)=0，如hSLD(n)为从n到Bucharest的直线距离

UCS与贪婪算法结合：Uniform-cost按路径代价g(n)排序，Greedy-search按目标距离h(n)排序
A*按两者的和f(n)=g(n)+h(n)排序
A*搜索

g(n)：到达节点n的耗散
h(n)：启发函数：从节点n到目标节点的最低耗散路径的耗散估计值
f(n)：经过节点n的最低耗散的估计函数
A*搜索使用可采纳启发式，即h(n)<=h*(n)，h*(n)是到n的实际代价，h(n)>=0

A*的最优性证明：略

f(n)值沿任何路径都是非递减的

A*的最优性证明：略
A*的性质：

A*扩展所有f(n)<C*的节点、部分f(n)=C*的节点，不扩展f(n)>C*的节点

8数码问题——把棋子水平或者竖直地滑动到空格中，直到目标局面：

h1(n)=错位的棋子数，h2(n)=所有棋子到其目标位置的水平竖直距离和

h(n)=max(ha(n);hb(n))同样是可采纳的，且统治ha,hb

h(n)——节点n到目标节点的最低耗散路径的耗散估计值
g(n)——初始节点到这个节点的路径损耗的总和
f(n)=g(n): Uniform Cost
f(n)=h(n): Greedy
f(n)=g(n)+h(n): A*

function HILL-CLIMBING(problem) returns a state that is a local maximum
inputs:problem, a problem
local variables: current, a node
neighbor, a node
current ← MAKE-NODE(INITIAL-STATE[problem])
loop do
neighbor ← a highest-valued successor of current
if VALUE[neighbor] <= VALUE[current] then return STATE[current]
current ← neighbor

1. When stuck, pick a random new starting state and re-run hill-climbing from there
2. Repeat this k times
3. Return the best of the k local optima

function SIMULATED-ANNEALING(problem, schedule) returns a solution state
inputs: problem, a problem
schedule, a mapping from time to "temperature"
local variables: current, a node
next, a node
T, a "temperature" controlling prob. of downward steps
current ← MAKE-NODE(INITIAL-STATE[problem])
for t ← 1 to ∞ do
T ← schedule[t]
if T=0 then return current
next ← a randomly selected successor of current
ΔE ← VALUE[next] - VALUE[current]
if ΔE > 0 then current ← next
else current ← net only with probability e^(ΔE/T)

Local Beam Search（局部剪枝搜索）

8皇后的遗传算法图解：见课本P111

# 05 CSP

Constraint Satisfaction Problems 约束满足问题

Outline
CSP实例
CSP的回溯搜索

CSP局部搜索

CSP：状态由值域Di中的变量Xi定义；每个约束包括一些变量的子集，并指定这些子集的值之间允许进行的合并

Binary CSP：每个约束和两个变量相关
Constraint graph：节点是变量，弧是约束

CSP的种类

O + O = R + 10．X1
X1 + W + W = U + 10．X2
X2 + T + T = O + 10．X3
X3 = F , T ≠ 0, F ≠ 0

[WA = red then NT = green] 等价于 [NT = green then WA = red]

function BACKTRACKING-SEARCH(csp) returns solution/failure
return RECURSIVE-BACKTRACKING({},csp)
function RECURSIVE-BACKTRACKING(assignment,csp) returns soln/failure
if assignment is complete then return assignment
var ← SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp],assignment,csp)
for each value in ORDER-DOMAIN-VALUES(var, assignment,csp) do
if value is consistent with assignment given CONSTRAINTS[csp] then
add {var = value} to assignment
result ← RECURSIVE-BACKTRACKING(assignment,csp)
if result ≠ failure then return result
remove {var = value} from assignment
return failure

1.下一次赋值应该对哪个变量进行？
2.尝试的变量应该按照什么顺序？
3.是否可以尽早地发现不可避免的失败？
4.是否可以利用问题结构？

1. Minimum remaining values 最小剩余值（MRV）：选择拥有最少合法值的变量

Degree heuristic 度启发式
Tie-breaker among MRV variables

2. Least constraining value 最少约束值

Forward checking——前向检验

3. Constraint propagation——约束传播

NT和SA不能都是蓝色（具体例子见课本P181）

Arc consistency——弧相容（定义见课本P174）

X → Y is consistent iff for every value x of X there is some allowed y
if X loses a value, neighbors of X need to be rechecked

function AC-3(csp) returns the CSP, possibly with reduced domains
inputs:csp, a binary CSP with variables {X1,X2,...,Xn}
local variables:queue, a queue of arcs, initially all the arcs in csp
while queue is not empty do
(Xi,Xj) ← REMOVE-FIRST(queue)
if REMOVE-INCONSISTENT-VALUES(Xi,Xj) then
for each Xk in NEIGHBORS[Xi] do
add (Xk,Xi) to queue
function REMOVE-INCONSISTENT-VALUES(Xi,Xj) returns true iff succeeds
removed ← false
for each x in DOMAIN[Xi] do
if no value y in DOMAIN[Xj] allows (x,y) to satisfy the constraint Xi ↔ Xj
then delete x from DOMAIN[Xi]; removed ← true
return removed

4.

CSP的树结构算法
1. 选择一个变量作为根节点，从根节点到叶子节点进行排序，使每个节点的父节点在该节点之前
2. 对j从n到2,执行函数REMOVEINCONSISTENT(Parent(Xi),Xi)
3. 对j从1到n，对Xi相容地赋值Parent(Xi)

Cutset conditioning（割集调整）：实例化变量的一个集合，使剩余的约束图变成树

CSP局部搜索

R=(number of constraints) / (number of variables)

If 新状态比现有状态好，移动到新状态
Else  以某个小于1的概率接受该移动，此概率随温度“T"降低而下降

Putweights on constraints
repeat
Primal search: update assignment to minimize weighted violation, until stuck
Dual step: update weights to increase weighted violation, until unstuck
until solution found, or bored

# 06 GAME PLAYING

- 玩家需要类似人类的智能
- 游戏可以很复杂(象棋、围棋等)
- 在有限的时间内需要作出决定

- 明确的和可重复的
- 充满可观察和有限的环境

Outline
- 游戏
- 最优策略
- 极小极大算法
- α-β剪枝
- 资源限制和近似评估
- 包含几率因素的游戏
- 不完全信息的游戏

- 不可预测的对手=>解决方案是对对手的每种可能的回应选择一种移动的策略
- 时间限制=>游戏对于低效率有严厉的惩罚

确定型的                                     随机的

- 一字棋、象棋、跳棋
- 游戏搜索
- 状态空间搜索树
- 玩家轮流
- 每一层，包含一轮的移动
- 选择移动到效用值最高的位置
- 零和游戏
- 一个玩家最大化结果
- 另一个玩家最小化结果

- 假设双边玩家均作最优选择
- 计算机假设在它移动之后，对手会选择最小值的移动
- 计算机选择的最佳移动考虑了它的移动以及对手的最优移动

- 对确定性、完全信息博弈的最优策略
- 策略：选择移动到具有最高的极大极小值的位置，在对手也使用最优策略的条件下，能导致至少不比其它策略差的结果。
- 假设两个游戏者都按照最优策略进行，那么节点的极小极大值就是对应状态的效用值(对于MAX)
- MAX优先选择有极大值的状态
- MIN优先选择有极小值的状态
- MINMAX-VALUE(n)=
UTILITY(n) 当n为终止状态
max MINMAX-VALUE(s) 当n为MAX节点
min MINMAX-VALUE(s) 当n为MIN节点

function MINIMAX-DECISION(state) returns an action
inputs: state, current state in game
return the a in ACTIONS(state) maximizing MIN-VALUE(RESULT(a,state))

function MAX-VALUE(state) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v ← -∞
for a, s in SUCCESSORS(state) do v ← MAX(v, MIN-VALUE(s))
return v

function MIN-VALUE(state) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v ← ∞
for a, s in SUCCESSORS(state) do v ← MIN(v,MAX-VALUE(s))
return v

- 完备性：仅当树是有限的(国际象棋有特定的规则)，在一个无限的树中甚至存在有限的策略
- 最优性：是的，对战一个最优策略的对手，不然呢
- 时间复杂度：O(b^m)
- 空间复杂度：O(bm) (深度优先搜索)

α-β剪枝
- 如果对战一个聪明的对手，博弈树的一些树枝不会被遍历到。
- 剪枝可以忽略一些树枝
- 为什么称为α-β
- α是到目前为止在路径上的任意选择点发现 的MAX的最佳(即最大值)选择，β的定义类似

α-β算法
function ALPHA-BETA-DECISION(state) returns an action
return the a in ACTIONS(state) maximizing MIN-VALUE(RESULT(a, state)

function MAX-VALUE(state,α,β) returns a utility value
inputs: state, current state in game
α, the value of the best alternative for MAX along the path to state
β, the value of the best alternative for MIN along the path to state
if TERMINAL-TEST(state) then return UTILITY(state)
u ← -∞
for a, s in SUCCESSORS(state) do
v ← MAX(v, MIN-VALUE(s,α,β))
if v ≥ β then return v
α ← MAX(α,v)
return v

function MIN-VALUE(state,α，β) returns a utility value
same as MAX-VALUE but with roles of α,β reversed

α-β的效率
- 效果取决于后继的检查顺序，如果最优的后继最先被检查则效果更好。
- 最坏的情况：
- 顺序排列所以没有树枝被修剪
- 对穷举算法没有改进
- 最好的情况：
- 每个玩家的最优移动都被最先评价
- 在实践中，性能接近最佳，而不是最坏的

α-β的性质
- 剪枝不影响最后的结果
- 好的移动顺序提高了剪枝的效率
- 在好的移动顺序情况下，时间复杂度=O(b^(m/2))

- 标准方法：有限深度搜索
- 利用截断测试代替终止测试
- 例如深度限制(可能增加静态搜索)
- 利用可以估计棋局效用值的启发式评价函数EVAL取代效用函数
- 即估计位置期望值的评价函数

- 理想函数：返回位置的效用值
- 实际上：典型特征的线性加权和
Eval(s)=w_1f_1(s)+w_2f_2(s)+...+w_nf_n(s)
- 越重要的特征，加权值越高
- 确定性博弈的结果作为一个序数效用函数

- 在实际游戏中，通常对每一步移动有个时间限制T
- 怎么考虑进去呢
- 不能中途停止α-β，有信心利用期望的结果
- 所以，我们可以设置一个保守的极限深度，保证我们会在小于T的时间内找到下一步
- 但是，搜索可能会提前停止，进行更多搜索的机会被浪费掉了
- 实际中，常用迭代加深搜索(IDS)
- 以逐渐增加的深度限制进行α-β搜索
- 当时间到时，使用最后一次完成的α-β搜索的策略(即已完成的最深的搜索)

- 国际象棋：深蓝在1997年一场六局的比赛中打败人类世界冠军，深蓝每秒搜索2亿个位置，使用非常复杂的评估，并扩大到40层。
- 计算机能够预见它的决策中的长期棋局序列。机器拒绝走一步有决定性短期优势的棋—显示了非常类似人类的对危险的感觉。
- 西洋跳棋：Chinook，世界人机跳棋冠军
- Chinook在1994年结束了人类长达40年的世界冠军统治
- 2007年，跳棋得到解决，最佳算法最终导致平局
- Chinook不会输
- 使用了一个提前计算好的存有443，748，401，247个不多于8个棋子的棋局数据库，使它的残局走棋没有缺陷
- 奥赛罗：人类冠军拒绝对战强大的电脑
- Go，围棋：人类冠军拒绝对战弱小的计算机。在围棋中，b>300(棋盘为19×19)，所以大多数程序使用模式的知识基础，提出合理的动作。人工智能的试金石。
- AlphaGl：首次在19×19的棋盘上打败人类
- 谷歌电脑棋手DeepMind
- 深度神经网络：
- 价值网络：评价板的位置
- 政策网络：选择移动
- 训练于：
- 有监督的学习
- 增强自我发挥学习
- 搜索算法
- 蒙特卡罗模拟+价值/政策网络

AlphaGo：背景
- 减少搜索空间
- 减少深度
- 位置评价
- 减少分支
- 基于政策的移动采样
- 政策=概率分布 p (a|s)

AlphaGo中的深度神经网络
- AlphaGo使用两种类型的神经网络
- 政策网络：下一步的行动是什么
- 从人类专家的行动学习
- 价值网络：状态的值是什么
- 利用政策网络从自我学习
- SL=监督学习，RL=强化状态

- 在不确定的游戏中，机会由骰子、洗牌决定，简化的例子用掷硬币表示。
- 最大期望效用
- 为什么对效用求平均，而不是极大极小值
- 最大期望效用原则：一个agent应该根据其知识选择期望效用最大化的行为
- 决策的一般原则
- 经常作为理性的定义

- ......
if state is a chance node then
return average of EXPECTIMINIMAX-VALUE of SUCCESSORS(state)

- TDGammon采用depth-2搜索+很好的eval函数+强化学习：世界冠军的水平
- 评价函数应该是棋局的期望效用值的正线性变换

- 例如，纸牌游戏，对手的初始牌未知，通常我们对每一次出牌计算一次概率值，就像游戏开始时有一个大骰子一样。
- 策略：在评价一个有未知牌的给定行动过程时，首先计算出每副可能牌的出牌行动的极小极大值，然后再用每副牌的概率来计算得到对所有发牌情况的期望值。

- 行动的价值是在所有的实际状态的平均值的直觉是错误的。
- 局部可观测性，行动的价值取决于信息的状态或agent所在的信度状态。
- 可以生成和搜索一棵信息状态树

- 游戏是非常有趣的工作
- 完美是不可能实现的，必须近似
- 游戏的最好模型是搜索问题
- 博弈搜索树表示电脑/对手的轮流移动
- 评价函数估计给定每个玩家的板的配置质量、
- 极大极小算法选择最佳移动的假设是对手总是选择最好的移动
- α-β是可以避免搜索树的很大一部分来深化搜索深度的算法—消除无关的子树以提高效率

- 无信息的搜索策略
- 深度优先搜索(BFS)，一致代价搜索，深度优先搜索(DFS)，深度受限搜索，迭代加深的深度优先搜索
- 有信息的搜索策略
- 最佳优先搜索：贪婪、A*
- 局部搜索：爬山、模拟退火等
- 约束满足问题
- 回溯=深度优先搜索的给每个节点分配一个变量
- 增强：变量的顺序和值选择启发式，向前检查，约束传播

05-18 1万+

11-27 7052
06-11 1755
12-26 1949
06-13 630
06-12 5161
04-13 276
07-10 2253
04-16 1627
04-13 86
12-29 862