所有可能的路径

我目前正在开发一个用于玩游戏Dots的人工智能(链接)。游戏的目标是通过用线连接颜色相同的点来移除尽可能多的点。我已经遍历了棋盘,并将每组相邻且颜色相同的点进行了分组。目前所有组都使用相同的突出显示颜色(黑色)。例如,左上角的四个红色点形成了一个组,右上角的三个黄色点也形成了一个组。

我需要计算通过这些组中的每一个的所有可能路径。谁能想到一个好的算法?我怎样才能避免创建重复的路径?

我听说在这种情况下稍微修改后的深度优先搜索(DFS)会很好。然而,路径允许在节点处交叉,但不能重复使用边。我该如何相应地修改DFS?

GUI截图


回答:

这里有一些伪代码来帮助你开始。这是我可能会采用的方法。使用边而不是节点可以巧妙地解决路径交叉的问题,但获取边比获取节点更困难。你需要将边的索引映射到节点的索引上。

你会得到每条路径两次,因为一条路径可以从两个方向遍历。如果点组变得很大,考虑修剪最不重要的路径。内存需求随着组中点的数量n的增加以4^n的指数增长。我想不出在不允许重复的情况下添加不完整路径的好方法,但也许你对提前结束的路径不感兴趣?

private LinkedList<Edge> recurse(LinkedList<Edge> path) {    Edge last = path.getLast();    Edge right = <get Edge to the right of last>;    Edge bottom = <get Edge below last>;    Edge left = <get Edge to the left of last>;    Edge top = <get Edge above last>;    if( right && !path.contains(right) ) {        LinkedList<Edge> ps = path.clone();  // 注意:检查内置的clone()函数是否进行浅拷贝        ps.addLast( right );        paths.add( recurse(ps) );    }    if( bottom && !path.contains(bottom) ) {        ...    }    if( left && !path.contains(left) ) {        ...    }    if( top && !path.contains(top) ) {        ...    }    return path;}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注