我正在尝试生成8-N problem的所有可能状态的树,没有重复。我可以在纸上做,但在代码我不能。
这是我的递归函数:
......
...
..
root = new TreeNode(startingState);
visitedStates.add(root.getData().getStateValues());
generateStateSpaceRecursive(root);
}
public void generateStateSpaceRecursive(TreeNode node){
List<TreeNode> nextStatesNodes = getNextStates(node);
for (TreeNode childNode : nextStatesNodes){
if(!stateVisited(childNode.getData().getStateValues())) {
visitedStates.add(childNode.getData().getStateValues());
node.addChild(childNode);
generateStateSpaceRecursive(childNode);
}
}
}
为什么不停止?
如果我正确地理解了问题,那么
实施以下类型的搜索(尝试)解决此问题 问题:深度优先,广度优先,迭代深化,某种形式 启发式搜索。
但我首先需要国家空间吗?或者我可以直接应用算法并生成状态?
编辑:
private List<TreeNode> getNextStates(TreeNode node) {
List<TreeNode> nextStates = new ArrayList<>();
if(agent.canMoveLeft(node)){
nextStates.add(agent.moveLeft(node));
}
if(agent.canMoveRight(node)){
nextStates.add(agent.moveRight(node));
}
if(agent.canMoveUp(node)){
nextStates.add(agent.moveUp(node));
}
if(agent.canMoveDown(node)){
nextStates.add(agent.moveDown(node));
}
return nextStates;
}
答案 0 :(得分:1)
你的状态太大而无法适应筹码。测试你的算法:
答案 1 :(得分:1)
您应该编辑generateStateSpaceRecursive:
public void generateStateSpaceRecursive(TreeNode node)
{
if(!testGoal)
{
//Goal node is not seen
List<TreeNode> nextStatesNodes = getNextStates(node);
...
}
else
//Goal Node Visited
}
创建这样的新功能:
private bool testGoal(TreeNode node)
{
if(node == goalNode) return true;
else return false;
}