问题陈述

给出了以下图像中所有蓝色方块的图表,其中每个蓝色方形都连接到所有4个基本方向的其他蓝色方向。

给出任何起始节点。

允许查找最长(ISH)路径的算法。

考虑只能访问每个节点一次。

考虑到我们不在乎路径结束的位置。

考虑到速度比必然访问每个节点更重要。

示例

我已经跟踪了下面的图像中所需结果的示例。如您所见,路径不访问每个节点,这很好。我正在寻找一个快速算法,可以给我这个图表上最长的路径之一。80%的覆盖范围或更多是我拍摄的。

有帮助吗?

解决方案 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”寻找许多引用。由于您愿意接受次优解决方案,您可能会寻找启发式或近似算法(例如,使用本地搜索算法)。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top