所有可能的路径

我目前正在开发一个用于玩游戏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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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