gpt4 book ai didi

java - 使用 DFS 优化解决 8-Puzzle

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:53 27 4
gpt4 key购买 nike

我正在使用 Java 解决使用 DFS 的 8 拼图问题。

这是我想出的:

    public static boolean found = false;

public void solveDepthFirst(EightPuzzle currentState, int lastMove){

if(currentState.goal()){
System.out.println(currentState);
found = true;//to stop DFS when a solution is found (even if not optimal)
return;
}

for(int i=0;i<numMoves;++i){
if(found) return;

EightPuzzle e = currentState.move(i);//0 = up, 1 = down, 2 = left, 3= right

if(!e.equals(currentState) && i != lastMove
&& !visitedNodes.contains(e.toString())){
solveDepthFirst(e, i);
}
if(!visitedNodes.contains(currentState.toString())){
visitedNodes.add(currentState.toString());
}
}
}

!e.equals(currentState) 检查是否可以移动。 (如果 currentState.move(i) 越界 move() 返回相同的状态)

i != lastMove 确保如果你在上一步中向右移动,你现在不会向左移动(因为它没有意义)

visitedNodes 是已访问节点的哈希集。

堆栈空间不足。当我使用 -xss10m 将堆栈空间从 128k 增加到 10m 时,算法运行良好。但是,我确信可以进行大量其他优化。

如有任何提示,我们将不胜感激。

最佳答案

首先你可以做一个堆栈而不是递归调用。将 lastMove 添加到 EightPuzzle 类。

这是你得到的:

// Queue<EightPuzzle> queue = new PriorityQueue<EightPuzzle>();
Stack<EightPuzzle> stack = new Stack<EightPuzzle>();

public void solveDepthFirst() {

while (true) {
EightPuzzle currentState = stack.pop(); // queue.poll();
if (currentState.goal()) {
System.out.println(currentState);
found = true;// to stop DFS when a solution is found (even if
// not
// optimal)
return;
}

for (int i = 0; i < 4; ++i) {
if (found)
return;

EightPuzzle e = currentState.move(i);// 0 = up, 1 = down, 2 =
// left,
// 3= right

if (!e.equals(currentState) && i != currentState.getLastMove()
&& !visitedNodes.contains(e)) {
stack.push(e); // queue.add(e);
}
if (!visitedNodes.contains(currentState.toString())) {
visitedNodes.add(currentState);
}
}
}
}

当您使用递归调用而不是迭代设计时,性能会显着下降。

之后您可以使用 PriorityQueue 进一步优化(但它不会是真正的 DFS)。使用的启发式可以是曼哈顿距离。这样第一个要搜索的解决方案就是最接近目标的。它更高效但不是严格的 DFS。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/PriorityQueue.html

关于java - 使用 DFS 优化解决 8-Puzzle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com