如何构建资源树

Posted 一剑沁心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何构建资源树相关的知识,希望对你有一定的参考价值。


创建数据结构

CREATE TABLE `menu` (
  `id` bigint(20) unsigned NOT NULL COMMENT \'主键\',
  `name` varchar(11) NOT NULL COMMENT \'名称\',
  `sort_no` smallint(5) unsigned NOT NULL DEFAULT \'10\' COMMENT \'排序号\',
  `parent_id` bigint(20) unsigned NOT NULL COMMENT \'父节点id\',
  `icon` varchar(200) DEFAULT NULL COMMENT \'图标\',
  `remark` varchar(20) DEFAULT NULL COMMENT \'备注\',
  `url` varchar(60) DEFAULT NULL COMMENT \'菜单链接\',
  `level` tinyint(4) DEFAULT NULL COMMENT \'菜单等级\',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'菜单表\';

结束

组装树形结构

/**
  * 递归获取下级菜单
  * @param   pid
  * @param menus  所有菜单
  * @return
  */
 public List<Menu> getChild(Long pid, List<Menu> menus) 
     //子菜单列表
     List<Menu> childList = new ArrayList<>();
     for (Menu menu : menus) 
         if (pid.equals(menu.getParentId())) 
             childList.add(menu);
         
     
     //遍历 获取子菜单的子菜单
     for (Menu menu : childList) 
         List<Menu> child = getChild(menu.getId(), menus);
         menu.setChildren(child);
     
     //递归出口  childList长度为0
     if (childList.size() == 0) 
         return new ArrayList<>();
     
     return childList;
 

获取所有的资源

/**
  * 根据角色id获取对象集合信息
  */
 public List<Menu> getAllMenus()
     List<Menu> menus = this.loadAll();
     //返回的菜单树
     List<Menu> rootMenus = new ArrayList<>();
     for (Menu menu : menus) 
         //pid(上级Id)为0的是根菜单
         if (0==(menu.getParentId())) 
             rootMenus.add(menu);
         
     
     //遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
     for (Menu rootMenu : rootMenus) 
         List<Menu> child = getChild(rootMenu.getId(), menus);
         rootMenu.setChildren(child);
     
     return rootMenus;
 

蒙特卡洛树搜索 UCT 实现

【中文标题】蒙特卡洛树搜索 UCT 实现【英文标题】:Monte Carlo Tree Searching UCT implementation 【发布时间】:2012-02-21 19:35:20 【问题描述】:

你能解释一下如何构建树吗?

我非常了解节点是如何选择的,但是更好的解释确实会帮助我实现这个算法。我已经有一个代表游戏状态的棋盘,但我不知道(理解)如何生成树。

有人能给我指出一个评论很好的算法实现吗(我需要将它用于人工智能)?或者更好的解释/例子?

网上没找到很多资源,这个算法比较新……

【问题讨论】:

C++ 实现:github.com/AdamStelmaszczyk/gtsa 全面披露:我是作者。 【参考方案1】:

生成树的最佳方法是一系列随机播放。诀窍是能够在探索和利用之间取得平衡(这就是 UCT 的用武之地)。这里有一些很好的代码示例和大量研究论文参考:https://web.archive.org/web/20160308043415/http://mcts.ai:80/index.html

当我实现算法时,我使用随机播放,直到达到终点或终止状态。我有一个静态评估函数,可以计算此时的收益,然后从这一点开始的分数被传播回树。每个玩家或“团队”都假设另一团队会为自己下最好的棋,而对他们的对手来说可能是最坏的棋。

我还建议查看 Chaslot 的论文和他的博士论文,以及一些引用他的工作的研究(基本上是从那时起的所有 MCTS 工作)。


例如:玩家 1 的第一步可以模拟未来 10 步,玩家 1 和玩家 2 交替进行。每次你必须假设对方球员会尽量减少你的分数,同时最大化他们自己的分数。有一个基于此的整个领域,称为博弈论。一旦你模拟到 10 场比赛结束,你再次从起点迭代(因为只模拟一组决策没有意义)。树的每个分支都必须在分数向上传播的情况下进行评分,并且分数代表进行模拟的玩家可能获得的最佳回报,假设其他玩家也在为自己选择最佳动作。

MCTS 由四个战略步骤组成,只要有时间就重复。步骤如下。

    在选择步骤中,树从 根节点,直到我们到达节点 E,在这里我们选择一个尚未添加到树中的位置。

    接下来,在出局步骤中,移动以自我对局方式进行,直到游戏结束。这个“模拟”游戏的结果 R 在黑方获胜(LOA 中的第一个玩家)的情况下为 +1,在平局的情况下为 0,在白方获胜的情况下为 -1。

    随后,在扩展步骤中,将 E 的子级添加到树中。

    最后,在反向传播步骤中,R 沿着从 E 到根节点的路径反向传播。当时间到时,程序所下的棋步是最高值的根的子步。 (这个例子取自这篇论文 - PDF

www.ru.is/faculty/yngvi/pdf/WinandsBS08.pdf

这里有一些实现:

使用一些 MCTS 实现的库和游戏列表 http://senseis.xmp.net/?MonteCarloTreeSearch

以及一个名为 Fuego 的游戏独立开源 UCT MCTS 库 http://fuego.sourceforge.net/fuego-doc-1.1/smartgame-doc/group__sguctgroup.html

【讨论】:

这很清楚。但是树是在决策时构建的,还是之前构建的,然后 AI 使用它来确定正确的移动?你能从开始(内存中没有任何内容)到正确的移动决策写入算法执行的步骤吗? 一般来说,树是在做出一系列模拟决策的同时构建的,然后根据这些先前的决策进行“实际”播放。一个简单的方法是有一个可以存储游戏状态的方法——我注意到你已经有了这个,然后玩了 x 次(这取决于你有多少计算时间,或者所需的选择),然后恢复您模拟的初始游戏状态,并使用构建和评分的树从那里做出选择。 我还用 MCTS 的主要步骤和链接更新了我的答案 我需要在移动设备上运行它(阅读:没有太多内存,没有快速 CPU)。所以我想在我的电脑上运行多个模拟,将树(稍作修改)保存到一个文件中,然后它们在我的应用程序中实现一种可以轻松读取保存文件的方法(修改为更易于阅读,无需将其全部加载到内存)。[如果我不将更改保存回文件]我将失去它的学习部分(因为真正的玩家不会更新树的匹配),但我会得到相当不错的人工智能。费用。这是正确/可行的吗? 取决于可能的树的大小。即使是井字游戏也可能拥有惊人的大游戏树,并且您必须从根本上暴力破解每一个可能的动作。对于象棋之类的东西,这将需要很长时间。一种可能的实现是设置一个运行基于服务的 MCTS 实现的服务器。找到了!以下是一些现有的实现:senseis.xmp.net/?MonteCarloTreeSearch 和一个名为 Fuego 的独立于游戏的 UCT MCTS 库fuego.sourceforge.net/fuego-doc-1.1/smartgame-doc/…【参考方案2】:

如果你有兴趣,我写了这个:https://github.com/avianey/mcts4j

【讨论】:

【参考方案3】:

来自http://mcts.ai/code/index.html:

Below are links to some basic MCTS implementations in various
programming languages. The listings are shown with timing, testing
and debugging code removed for readability.

Java

Python

【讨论】:

以上是关于如何构建资源树的主要内容,如果未能解决你的问题,请参考以下文章

蒙特卡洛树搜索 UCT 实现

如何进行 sql 查询来构建树? [复制]

什么是词汇树以及如何构建它?

Qiime2(五)-构建进化树用于多样性分析

Web图片资源的加载与渲染时机

基于vcf文件构建进化树