问题是使用bfs函数构建/找到peg solitare游戏的解决方案。您将获得一个包含开始状态的节点,从该状态开始,节点将扩展为更多状态(其子节点)。一旦找到包含目标状态的节点,该函数就应该停止。
public void search(){
bfs.add(StartGoal);
while(!bfs.isEmpty()) {
node = bfs.poll();
if(node.isGoal()){System.out.println("success"); return;}
node.expand();
for(MyNode m : node.childs){
if(!m.isGoal()){
m.setVisited();
bfs.add(m);}}
node.setVisited();
}
expand函数,启动子链接列表并根据下一个可能的板状态创建子节点。
public void expand(){
if(childs != null) return;//already expanded do nothing
else{
childs= new LinkedList<MyNode>();
for(BoardState b: state.nextStates())
childs.add(new MyNode(this, b));}
}
我运行了代码并对其进行了多次改进。一旦队列达到300万以上,它就会因空间不足而崩溃。我的问题是:这最终会起作用吗?代码是否正确?
这是我的第一篇文章,很抱歉,如果我很好地格式化问题。 感谢。
答案 0 :(得分:0)
您的代码不正确。我看到两个大错误,或者一个有两个主要后果的大错误,还有一个小错误。可能还有其他我看不到的错误,还有其他一些需要改进的地方。第一个错误是
if(!m.isGoal()){
m.setVisited();
bfs.add(m);}}
你明确地永远不会将目标状态添加到队列中。
第二个错误是您从未测试是否已访问过某个节点。这可能与第一个错误相同,因为看起来它们可以通过相同的修复来修复:
if (!m.isVisited()) {
第三个错误是您只在处理第一个子节点后标记访问过的节点。如果没有子节点,您将永远不会标记访问过的节点,如果节点可能将其自身作为子节点,则在扩展父节点之前将子节点添加到队列中。这不会影响结果的正确性,但可能会影响您的效率。