日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

强化学习—— 蒙特卡洛树(Monte Carlo Tree Search, MCTS)

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习—— 蒙特卡洛树(Monte Carlo Tree Search, MCTS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

強化學習—— 蒙特卡洛樹(Monte Carlo Tree Search, MCTS)

  • 1. 單一狀態蒙特卡洛規劃
    • 1.1 特點
    • 1.2 數學模型
  • 2. 上限置信區間策略
  • 3. 蒙特卡洛樹搜索
    • 3.1 選擇
    • 3.2 擴展
    • 3.3 模擬
    • 3.4 反向傳播
    • 3.5 流程圖
  • 4. 代碼實現

1. 單一狀態蒙特卡洛規劃

多臂賭博機(multi-armed bandits) 為例

1.1 特點

為序列決策問題,在利用(exploitation)和探索(exploration)之間保持平衡,利用為過去決策中的最佳匯報,探索為未來獲得更大回報。

1.2 數學模型

  • 設有k個賭博機,選擇第I個賭博機后,獲得的回報為:VItV_{I_t}VIt??
  • 經過n次操作后的悔值函數為(第一項為最大的獎賞):Qn=maxi=1,...,k∑t=1nVi,t?∑t=1nVIt,tQ_n=\displaystyle{max_{i=1,...,k}}\sum_{t=1}^n V_{i,t} - \sum_{t=1}^n V_{I_t,t}Qn?=maxi=1,...,k?t=1n?Vi,t??t=1n?VIt?,t?

2. 上限置信區間策略

upper confidence bound, UCB

  • 記錄第i個賭博機過去t-1時刻的平均獎賞,在t時刻,選擇具有最佳上限置信區間的賭博機:It=maxi=1,...,k{V^i,Ti(t?1)+2?log(t)s}I_t=max_{i=1,...,k}\{\hat{V}_{i,T_i(t-1)}+\sqrt{\frac{2\cdot log(t)}{s}}\}It?=maxi=1,...,k?{V^i,Ti?(t?1)?+s2?log(t)??}
    s為賭博機在過去被選中的次數。
  • UCB的計算公式為:UCB=V^j+c?log(N)njUCB=\hat V_j + c\cdot \sqrt{\frac{log(N)}{n_j}}UCB=V^j?+c?nj?log(N)??
  • 3. 蒙特卡洛樹搜索

    3.1 選擇

  • 選擇最大化UCB值的節點:UCB=V^i+c?log(N)nic=2UCB=\hat V_i + c\cdot \sqrt{\frac{log(N)}{n_i}}\\ c=2UCB=V^i?+c?ni?log(N)??c=2
  • 從根節點root開始,向下遞歸選擇子節點,直至選擇到葉子節點L,通常用UCB選擇最具有潛力的后續結點。
  • 3.2 擴展

    如果葉子節點L不是終止節點,則隨機創建一個未被訪問節點,選擇該節點作為后續節點C。

    3.3 模擬

    從節點C出發,對游戲進行模擬,直到博弈游戲結束。

    3.4 反向傳播

    用模擬結果來回溯更新導致這個結果的每個節點中的獲勝次數和訪問次數。

    3.5 流程圖


    此圖來源

    4. 代碼實現

    MCTS實際使用時可以根據任務進行細節調整,以下為五子棋的MCTS代碼:

    # -*- coding: utf-8 -*- # @Time : 2022/4/4 14:55 # @Author : CyrusMay WJ # @FileName: mcts.py # @Software: PyCharm # @Blog :https://blog.csdn.net/Cyrus_May import numpy as np import copy import datetimeclass Agent:"""turn: 0 means black player, 1 means white player."""def __init__(self, width=15, height=15, logger=None):self.width = widthself.height = heightself.logger = Noneself.turn = 0self.__init_board()def __init_board(self):self.black_board = np.zeros([self.width, self.height])self.white_board = np.zeros([self.width, self.height])self.all_board = self.black_board + self.white_boarddef judge_terminal(self):if self.turn:return self.__judge(self.white_board)else:return self.__judge(self.black_board)def __judge(self, board):for i in range(self.width):for j in range(self.height):if self.width - i >= 5 and board[i, j:i + 5].sum() == 5:return 1if self.height - j >= 5 and board[i:i + 5, j].sum() == 5:return 1if self.width - i >= 5 and self.height - j >= 5 and sum(board[i, j], board[i + 1, j + 1], \board[i + 2, j + 2], board[i + 3, j + 3],board[i + 4, j + 4]) == 5:return 1if self.i >= 4 and self.height - j >= 5 and sum(board[i, j], board[i - 1, j + 1], \board[i - 2, j + 2], board[i - 3, j + 3],board[i - 4, j + 4]) == 5:return 1return 0def update_board(self, x, y):if self.turn:self.black_board[x, y] = 1else:self.white_board[x, y] = 1self.all_board[x, y] = 1def next_state(self):x, y = np.where(1 - self.all_board)if not x.shape[0]:return None, Noneidx = np.random.choice(np.arange(x.shape[0]))x = x[idx]y = y[idx]return x, ydef childs_state(self):x, y = np.where(1 - self.all_board)return x, yclass Node():def __init__(self, agent, childs=[], parent=None):self.agent = agentself.childs = childsself.parent = parentself.reward = 0self.n = 0def add_child(self, node):self.childs.append(node)class MCTS():def __init__(self, max_epochs=10000, max_time=5, logger=None):self.logger = loggerself.max_epochs = max_epochsself.c = 1/np.sqrt(2) # 平衡因子self.max_time = max_timedef search(self, board):board = np.array(board)black_state = (board == 1).astype(np.int32)white_state = (board == 2).astype(np.int32)turn = 0 if black_state.sum() <= white_state.sum() else 1self.agent = Agent(logger=self.logger)self.agent.white_board = white_stateself.agent.black_board = black_stateself.agent.all_board = white_state + black_stateself.agent.turn = turnself.turn = turnreturn self.run()def run(self):root = Node(copy.deepcopy(self.agent))start = datetime.datetime.now()for i in range(self.max_epochs):path = self.selection(root,self.max_epochs)path = self.expand(path)if not path:continuereward = self.simulation(path)self.backward(path,reward)if datetime.datetime.now() - start > self.max_time:breakscores = np.array([self.ucb(node, self.max_epochs) for node in root.childs])x,y = np.where(self.agent.all_board - root.childs[np.argmax(scores)].agent.all_board)return x[0],y[0]def ucb(self, node, epoch):if node.turn == self.turn:return (node.n - node.reward) / (node.n + 1e-8) + 2 * np.sqrt(2 * np.log(epoch) / ((node.n-node.reward) + 1e-8))return node.reward / (node.n + 1e-8) + 2 * np.sqrt(2 * np.log(epoch) / (node.n + 1e-8))def selection(self, root, epoch):path = [root]while 1:if not root.childs:return pathscores = np.array([self.ucb(node, epoch) for node in root.childs])path.append(root.childs[np.argmax(scores)])return pathdef expand(self, path):if path[-1].n > 0 or len(path) == 1:x, y = path[-1].agent.childs_state()if not x.shape[0]:return Nonefor row, col in zip(x, y):node = copy.deepcopy(path[-1])node.turn = 1 - path[-1].agent.turnnode.agent.update_board(row, col)path[-1].add_child(node)path.append(path[-1].childs[0])return pathdef simulation(self, path):root = copy.deepcopy(path[-1])while 1:if root.judge_terminal():return 1 if root.agent.turn != self.turn else 0x, y = root.agent.next_state()if not x.shape[0]:return 0else:root.agent.update_board(x,y)root.agent.turn = 1 - root.agent.turndef backward(self,path,reward):for node in path:node.n += 1node.reward += reward

    by CyrusMay 2022 04 04

    生命是華麗錯覺
    時間是賊偷走一切
    ————五月天(如煙)————

    總結

    以上是生活随笔為你收集整理的强化学习—— 蒙特卡洛树(Monte Carlo Tree Search, MCTS)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 夜夜春夜夜爽 | 伊人网大香 | 日韩在线视频在线观看 | 成人免费观看视频网站 | 中文字幕在线视频一区二区 | www.亚洲一区二区三区 | 日韩精品久久 | 国产精品久久一区 | 毛片毛片毛片毛片 | 好吊妞在线 | 日韩在线观看视频免费 | 欧美特级黄色 | xnxx国产 | www亚洲色图 | 不卡成人 | 亚洲国产大片 | 97精品人妻麻豆一区二区 | 日韩高清在线观看一区 | 亚洲欧美网 | 亚洲免费综合 | 国产精品亚洲无码 | 蜜臀久久99精品久久久久久 | 91高潮大合集爽到抽搐 | 久久中文免费视频 | 不卡视频一区二区三区 | 伊人久久色 | 久久婷婷亚洲 | 色屁屁一区二区三区视频 | 日韩av自拍| 夜夜成人 | 善良的老师伦理bd中字 | ww黄色| 欧美亚洲天堂网 | 国产黑丝在线 | 久久精品天堂 | 一起草视频在线播放 | 三级视频在线看 | 久久精品国产99精品国产亚洲性色 | 成年人国产 | 不卡av在线播放 | 久久亚洲网 | 日韩av三级在线观看 | 亚洲激情久久久 | 欧日韩不卡在线视频 | 少妇人妻偷人精品一区二区 | 伊人色综合久久久 | 午夜福利电影 | 国产精品久久久久蜜臀 | 日韩乱码一区二区三区 | 国产免费一级 | 阿v免费视频 | 亚洲电影在线观看 | 黄色一级一级 | 亚洲AV无码成人精品国产一区 | 99久久99久久精品国产片 | 国产ts人妖系列高潮 | 日韩精品123 | 国产三级精品三级 | 在线艹| 调教一区二区三区 | 国产精品熟妇一区二区三区四区 | 美女四肢被绑在床扒衣 | 色综合久久av | 神马一区二区三区 | 免费无码毛片一区二区app | 善良的女邻居在线观看 | 大地资源影视在线播放观看高清视频 | 少妇xxxxxx| 久久久久久久久久99 | 黑人中文字幕一区二区三区 | 艹少妇视频 | 经典杯子蛋糕日剧在线观看免费 | 国产精品视频a | 激情五月在线观看 | 99久久婷婷国产综合精品电影 | 寡妇高潮一级视频免费看 | 黑色丝袜吻戏亲胸摸腿 | www.爱色av.com| 欧美美女一级片 | 国产精品人人妻人人爽人人牛 | 浓精喷进老师黑色丝袜在线观看 | 夫妻露脸自拍[30p] | 精品久久久久一区二区国产 | 日韩毛片网| 久操视频网站 | 久久人成 | 色婷婷午夜 | 无遮挡裸光屁屁打屁股男男 | 国产美女视频一区 | 亚洲人成色777777老人头 | 变态另类ts人妖一区二区 | 亚洲一卡二卡在线 | 亚洲熟妇国产熟妇肥婆 | 日日噜噜夜夜爽爽 | 麻豆网 | 国产精品黑人一区二区三区 | 精品久久久久久无码人妻 | 欧美性潮喷xxxxx免费视频看 | 神马久久久久久久久久久 |