广度优先搜索算法java8-puzzle

广度优先搜索算法java8-puzzle,java,algorithm,artificial-intelligence,puzzle,breadth-first-search,Java,Algorithm,Artificial Intelligence,Puzzle,Breadth First Search,我正在尝试实现8字谜游戏的宽度优先算法。我知道这不是一个新的案例,网络上有很多解决方案,但我想按照我的思路来做 此代码已找到节点结果,该结果为 123 456 780 但要做到这一点需要35万个步骤 任何想法都将不胜感激! =) //此方法接收“Nodo”对象的集合,每个对象都将被检查并与finalGoal进行比较 公共void percorreNodos(集合节点库) { //在这个类中,a有一个数组,其中包含已经检查过的所有IDs os节点 //节点的ID表示为:123456780、354

我正在尝试实现8字谜游戏的宽度优先算法。我知道这不是一个新的案例,网络上有很多解决方案,但我想按照我的思路来做

此代码已找到节点结果,该结果为

123
456
780
但要做到这一点需要35万个步骤

任何想法都将不胜感激! =)

//此方法接收“Nodo”对象的集合,每个对象都将被检查并与finalGoal进行比较
公共void percorreNodos(集合节点库)
{
//在这个类中,a有一个数组,其中包含已经检查过的所有IDs os节点
//节点的ID表示为:123456780、354126870等。。
System.out.println(“idsPercorrido.size()=”+idsPercorridos.size());
//检查集合nodosBase是否包含finalGoal
迭代器迭代器=nodosBase.Iterator();
while(iterator.hasNext())
{
Nodo nodoBase=(Nodo)迭代器.next();
//如果当前节点已被检查,则无需再次检查
add(nodoBase.getId());
//只需打印节点(sysout)
nodoBase.print();
contPassos++;
System.out.println(“\n”+contPassos+”步骤(检查的节点数)…”;
//检查此节点是否为最终目标
if(nodoBase.isobjetiviofinal())
{
//设置指示已找到结果的变量
encontrouObjetivo=真;
System.out.println(“Resultado alcancado EM”+contPassos+“PASSOS…”);
nodoBase.print();
打破
}
}
//现在我们知道nosoBase集合中没有一个节点是最终目标,我们将生成下一个要检查的子节点,并递归调用此函数
//确认我们没有找到目标
if(encontrouObjetivo==false)
{
//创建下一个边界
集合novaFronteira=newhashset();
for(Nodo nodoPai:nodosBase)
{
//生成每个节点的子节点并将其添加到名为“novaFronteira”的集合中
Collection filhos=nodoPai.gerarFilhos();
对于(Nodo filho:filhos)
{
//idsPercorridos是一个包含我们检查过的所有节点ID的集合,我们不想多次检查一个节点!
if(idsPercorridos.contains(filho.getId())==false)
{
新增(菲罗);
}
}
}
这是percorreNodos(Novaronteira);
}
}

根据
9/2=181440
此谜题可能的可解组合。如果您针对这些组合中的每一个检查每个节点(您没有检查,但这会使计算更容易),则会执行大约
(9!/2)*9=1632960
步骤。因此,如果你的算法需要350000个步骤,我看不出有什么问题,因为计算机可以非常快地完成这些步骤。

根据那里的
9/2=181440
此谜题可能的可解组合。如果您针对这些组合中的每一个检查每个节点(您没有检查,但这会使计算更容易),则会执行大约
(9!/2)*9=1632960
步骤。因此,如果你的算法需要350000个步骤,我看不出有什么问题,因为计算机可以非常快地完成这些步骤。

根据那里的
9/2=181440
此谜题可能的可解组合。如果您针对这些组合中的每一个检查每个节点(您没有检查,但这会使计算更容易),则会执行大约
(9!/2)*9=1632960
步骤。因此,如果你的算法需要350000个步骤,我看不出有什么问题,因为计算机可以非常快地完成这些步骤。

根据那里的
9/2=181440
此谜题可能的可解组合。如果您针对这些组合中的每一个检查每个节点(您没有检查,但这会使计算更容易),则会执行大约
(9!/2)*9=1632960
步骤。因此,如果需要您的算法
350000
步骤,我看不出有什么问题,因为计算机可以非常快地完成这些步骤。

您可以确保不会将重复元素添加到
novaFronteira

没有任何东西阻止此代码:

for(Nodo nodoPai : nodosBase)
{
    Collection<Nodo> filhos = nodoPai.gerarFilhos();
    for(Nodo filho : filhos)
    {
        if( idsPercorridos.contains( filho.getId() ) == false )
        {
            novaFronteira.add( filho );
        }
    }
}
for(Nodo nodoPai:nodosBase)
{
Collection filhos=nodoPai.gerarFilhos();
对于(Nodo filho:filhos)
{
if(idsPercorridos.contains(filho.getId())==false)
{
新增(菲罗);
}
}
}
从添加多个重复节点到
novaFronteira

如果要在If语句中添加到
idsPercorridos
,这将防止这种情况发生,并减少步骤,不过,根据数据和数据结构的具体情况,此调用的附加运行时间实际上可能会使其花费的时间比最初更长


如果问题是运行时间,您应该确保
idspecorridos
TreeSet
HashSet
,因为它们允许高效的
包含
调用,而
数组列表
链接列表
则不允许


如果没有
for(Nodo nodoPai : nodosBase)
{
    Collection<Nodo> filhos = nodoPai.gerarFilhos();
    for(Nodo filho : filhos)
    {
        if( idsPercorridos.contains( filho.getId() ) == false )
        {
            novaFronteira.add( filho );
        }
    }
}