Java-Tetris AI-理解广度优先搜索的问题

提问

我将俄罗斯方块作为一个有趣的辅助项目(而不是家庭作业)进行开发,并希望实现AI,以便计算机可以自己玩.我听说的方法是使用BFS搜索可用的地点,然后创建最明智的放置位置的总分…

但是我在理解算法时遇到了麻烦.到目前为止,我的理解方式是:

1)将节点添加到ArrayList

> nodeList.add(n个节点)

2)连接节点

>使用邻接矩阵:adjMatrix [sizeOfNodeList] [sizeOfNodeList]
>传入节点以进行连接:例如:connectNode(nodeA,nodeB);,它调用:connectNode(Node from,Node to):

int fromNode=nodesList.indexOf(from);
int toNode=nodesList.indexOf(to);

//connect node A to B and B to A, set that i,j position = 1
adjMatrix[fromNode][toNode]=1;
adjMatrix[toNode][fromNode]=1;

在邻接矩阵中连接节点之后…

3)遍历节点队列,并将访问者添加到队列

>创建一个新队列:队列q = new LinkedList();
>将rootNode添加到队列中:q.add(rootNode)
>将访问标记设置为true:rootNode.visited(true)

这是我不明白的部分…

>当Queue不为空时…您应该创建一个新Node并将其设置为等于Queue的已删除节点:Node n =(Node)q.remove()

但是,如果要向其添加节点q.add(rootNode)和q.add(child),何时将其为空?

>接下来,检查while子节点=未访问的子节点并且不为null,而while(((child = getUnvisitedChildNode(n))!= null),则应更改子节点的访问状态= true,然后将其添加到队列中, q.add(child)…但是你不是在(!q.isEmpty())期间做这一切吗?那么,如果要添加的话,q何时为空?

队列q的目的是什么?是结果队列吗?

谢谢

最佳答案

您的队列q包含您尚未访问的节点.您应该仅将尚未访问的q个节点添加到队列中.这样,它将变为空,您已经浏览过的节点将不会重新输入列表.

以您的图像为例,您将仅从节点A开始q.您将A标记为已访问.这就是开始的方式.

您的循环包括删除队列q的第一个节点(在本例中为A),并添加所有连接到A且尚未访问的节点.换句话说,您将遍历A的矩阵线,并发现B,C和D连接到A.对于它们中的每一个,如果visit()返回false,则将它们添加到q并将其标记为参观了.在此过程中,q将具有B,C和D,并且所有A-D将具有true的visited().

在下一次迭代中,q上的第一个节点将是B.您将使其出队,并看到它已连接到A,E和F.由于当您调用Visited()时A返回true,因此不会将其添加到q . E和F将被添加并标记为已访问.

如果继续,您将使C,D,E和F出队,而无需向q添加任何内容,因为已经访问了所有节点.之后,q.isEmpty()将返回true,并且循环结束.