共享单车系统中自行车动态重定位的一种MCTS方法
1.基础知识储备
2.什么是MCTS?
由于Alpha-Go/Zero的热度,搜出来的MCTS的博客都是关于围棋游戏的。
wiki-pedia MCTS介绍
MCTS入门【很详细,适合初学者;带着问题去学更有效】
上一篇入门的英文原版
上一篇文章python编码实现
28天自制Alpha-Go
MCTS讲解
Chernoff-Hoeffding Bound
对于双人有限零和顺序游戏,首先构建一棵游戏树,游戏树是一种递归的数据结构,每次选择完最佳的下一步时,会移动到下一个子节点,而这个子节点又是它子树的根节点。因此我们可以把一局游戏视为“最佳下一步”的一个问题序列,每一次都可以由一个不同根节点的游戏树表示。通常在实际应用中,我们不需要记住到当前状态的路径,因为这不是当前游戏状态的关注点。
- 双人有限零和顺序游戏:有两位玩家参与,玩家能进行的动作总是有限的,双方的游戏目标是完全相反的(所有游戏的结果之和等于0)。
- 游戏树是一个数,其中每一个节点代表游戏的一个确定状态。从一个节点到该节点的一个子节点(如果存在)是一个移动。节点的子节点数目称为分支因子。游戏树的根节点代表游戏的初始状态。游戏树的终端节点是没有子节点的节点,至此游戏结束,无法再进行移动。终端节点的状态也就是游戏的结果(输/赢/平局)。
pseudo-code:
# Step2:Expansion
def monte_carlo_tree_search(root):
while resources_left(time, computational power): # MCTS的终止条件,计算资源或者时间限制而停止运行
leaf = traverse(root) # leaf = unvisited node
simulation_result = rollout(leaf) # Step3:Simulation
backpropagate(leaf, simulation_result) # Step4:Backpropagation
return best_child(root)
def traverse(node): # Step1:Selection
while fully_expanded(node): # 结点是完全扩展的,即
node = best_uct(node) # 选取UTC最高的结点,也就是最优子结点
return pick_univisted(node.children) or node # in case no children are present / node is terminal
def rollout(node):
while non_terminal(node):
node = rollout_policy(node)
return result(node)
def rollout_policy(node):
return pick_random(node.children)
def backpropagate(node, result):
if is_root(node) return
node.stats = update_stats(node, result)
backpropagate(node.parent)
def best_child(node):
pick child with highest number of visits
是否MCTS可以用于其他领域呢?