【问题标题】:All possible paths所有可能的路径
【发布时间】:2014-01-02 17:45:54
【问题描述】:

我目前正在开发用于玩 Dots 游戏的 AI (link)。目标是通过用一条线连接相似颜色的点来去除尽可能多的点。我浏览了黑板并将每组相邻的点用相同的颜色分组。当前所有组都共享相同的突出显示颜色(黑色)。因此,例如,左上角的四个红点形成一个组,右上角的三个黄点也是如此。

我需要计算通过其中一个组的所有可能路径。谁能想到一个好的算法?如何避免创建重复路径?

我听说在这种情况下稍微修改 DFS 会很好。但是,允许路径在节点处交叉,但不能重用边。如何相应地修改 DFS?

【问题讨论】:

  • 什么构成重复路径?如果 A、B、C、D 是 2x2 正方形模式中的节点,这些路径中是否有任何重复用于您的目的? A-B-C-D、B-C-D-A、C-D-A-B、D-C-B-A。
  • 我想所有这些路径都是等效的。但是,如果拐角处有第五个红点,某些路径将无法包含它。因此,在完成详尽的搜索之前,我似乎不应该担心重复,然后考虑适当修剪。
  • 如果我的回答有帮助,别忘了标记为答案。

标签: java artificial-intelligence path-finding depth-first-search


【解决方案1】:

这里有一些伪代码可以帮助您入门。这就是我可能会这样做的方式。使用边代替节点可以巧妙地解决交叉路径的情况,但检索边比节点更难。您需要将边缘索引映射到节点索引。

您将获得每条路径两次,因为一条路径可以从两个方向遍历。 如果点组变大,请考虑修剪最不感兴趣的路径。内存需求以 4^n 呈指数增长,其中 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();  // NOTE: check if the built-in clone() function does a shallow copy
        ps.addLast( right );
        paths.add( recurse(ps) );
    }
    if( bottom && !path.contains(bottom) ) {
        ...
    }
    if( left && !path.contains(left) ) {
        ...
    }
    if( top && !path.contains(top) ) {
        ...
    }
    return path;
}

【讨论】:

  • 这基本上就是我最终所做的。完成后我会发布更多详细信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多