广度优先搜索算法java8-puzzle
我正在尝试实现8字谜游戏的宽度优先算法。我知道这不是一个新的案例,网络上有很多解决方案,但我想按照我的思路来做 此代码已找到节点结果,该结果为广度优先搜索算法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
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 );
}
}
}