在图表中找到汉密尔顿智人路径
-
29-09-2020 - |
解决方案 2
我最终使用了 uct(mcts with ucb1)算法,但是用扭曲。
通常,在UCT中,模拟阶段是与随机选择的动作的游戏模拟的游戏。如果模拟的游戏在Wine中结束,则节点的分数,从播放模拟的位置,并且所有父母的父母的分数一直返回到根,递回1。在我的实现中,模拟的“播放”实际上只是随机沿着尚未访问过的邻近瓷砖的树。一旦模拟到达终端节点(死端),它会分配S= D / M的分数,其中D是树中的终端节点的深度,M是最大可能的深度。
在15 x 15网格上没有障碍物,您将设置m到225,因为最长的路径会访问每个瓷砖。我已经将矿井略低于我需要算法概括并在随机生成的地图上工作,通常具有10-30块覆盖的障碍物。
而不是递增父母的分数,如果它高于当前分数,则回溯算法将每个父母的分数设置为新计算的分数。换句话说,节点的分数总是表示到达此节点到达的最长路径的长度。
Uct使用UCB1才能选择一个节点以利用或探索一旦当前节点的每个子节点扩展,并且我很大程度上都保持了。我所做的唯一修改是剥削术语。在UCB1中,开发术语是W / V,其中W是节点累计得分,并且v是访问节点的时间次数。这在一个您想要选择最大化获胜机会的游戏中的游戏中有效。在我的情况下,由于分数反映了Win= 1的二进制函数,而且失去= 0但是为0=超短路径Vs 1=可能最长的路径,我想下降算法找到的最长路径,我只需将开发术语设置为s= score=从此节点到达的最长路径。
在我必须使用此算法的情况下,我使用此算法在NodeJS环境中允许大约40 ms的计算时间,然后在我必须选择移动之前。这通常在我的机器上提供大约785棵树遍历。平均而言,在此时间内,在OP中显示的地图上,该算法将找到一个70个节点的路径。这对于我的目的而言,这是我的目的,因为我再次运行算法再次运行下一回合。在实践中,当使用该算法选择下一个移动时,我最终在击中死端之前长达100-110步的路径,我覆盖了一部很大的蓝色瓷砖。
为了有趣,我已经耗尽了算法长得多,并且在300 000次遍历(我的机器上30秒),平均而言,再次在OP中所示的地图上,它找到了一个是125个节点的路径,这很漂亮靠近此地图上的最大深度。其他提示
这是最长的路径问题。它很难找到一般图中的最长路径。您可以尝试应用任何标准算法来查找最长路径。搜索本网站的“最长路径”和“HAMILTONIAN PATH”寻找许多引用。由于您愿意接受次优解决方案,您可能会寻找启发式或近似算法(例如,使用本地搜索算法)。