gpt4 book ai didi

java - 树结构中的递归回溯

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:31 25 4
gpt4 key购买 nike

我有这个算法,我想使用递归回溯实现图形搜索。

首先是我的代码:

 public static boolean buildTree(GenericTreeNode<String> inputNode){

while(!interruptFlag)
{
try { Thread.sleep(200); } catch(InterruptedException e) {}

gui.frame.MainWindow.progress.setText("Iterations Deployment: " + c);
gui.panel.ResultMatrix.setResult(mappingList);
Multimap<String,String> openList = LinkedHashMultimap.create();

openList = UtilityClasses.getOpenList.getOpenList(dataMap, ApplicationList, HardwareList, mappingList);

if(openList.isEmpty() && !mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI))
{
gui.frame.MainWindow.labelSuccess.setText("Mapping not succesful!");
return false;

}
if(openList.isEmpty() && mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI))
{
System.out.println(calculateOverallCost.getOverallCosts());
System.out.println("Mapping done:" + " " + mappingList);
gui.panel.ResultMatrix.setResult(mappingList);

return true;
}

if(!openList.isEmpty() && (!mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI)))
{

for(String s : openList.keySet())
{
for(String h : openList.get(s))
{
GenericTreeNode<String> child = new GenericTreeNode<String>(s + ":" + h);
inputNode.addChild(child);
child.setCosts(UtilityClasses.CostFunction.calculateCostFunction(s, h));
}
}
List<GenericTreeNode<String>> childlist = inputNode.getChildren();
Collections.sort(childlist);

for(int i = 0; i < childlist.size() ; i++)
{
inputNode = childlist.get(i);
// do something
if (buildTree(inputNode))
{
return true;
}
else
{
// undo something
}

}

这就是我目前的代码。它在每一步中构建树。树中的每个 Node 都是一个可能的解决方案,由启发式成本函数排序。前 2 个 if 子句是终止和返回的条件。如果有解决方案,它会很顺利地找到它。但如果没有快速解决方案,我需要撤消最后一步并尝试其他组合。在最坏的情况下,应对每个组合进行测试。

childlist 包含每个子 Node ,按它们的成本函数排序。成本函数最小的一个将被选择用于扩展。构建树是递归完成的,但我在回溯方面遇到了问题。我没有得到返回后退一步并尝试第二个最佳 Node 等的搜索。使用新计算的 openList 每一步扩展该图。如果有帮助的话,我保存了对父 Node 的引用。

openlist 是一个列表,其中包含所有可能的下一步 -> Node 。

也许这张图片有助于更好地解释我的问题: enter image description here这或多或少是我想要实现的搜索。但是我到目前为止的代码,无论是否找到解决方案,都停留在休假结束时。我尝试了很多不同的方法,但这种回溯似乎对我的问题不起作用,或者至少我无法让它继续下去。

最佳答案

如果我没理解错的话,这需要一个 pre-order tree vist .

我省略了一些细节,但我认为这段代码会对你有所帮助(我还没有测试过):

public static boolean buildTree(GenericTreeNode<String> inputNode) {
if (interruptFlag) {
// search was interrupted
// answer has not be found yet
return false;
}

boolean something = openList.isEmpty() && !mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI);
if (something) {
// ... Mapping not succesful!
// answer can't be found
return false;

}

boolean answerFound = openList.isEmpty() && (mappingList.keySet().containsAll(XMLParser.ApplicationsListGUI));
if (answerFound) {
// ...
return true;
}

// answer has not been found
// visit each children
// order children list by cost
// ...
List<GenericTreeNode<String>> childlist = // ...
Collections.sort(childlist);

for (int i = 0; i < childlist.size(); i++) {
inputNode = childlist.get(i);
// do something
boolean childHasAnswer = buildTree(inputNode);
if (childHasAnswer) {
// answer was found
return true;
} // else: our children do not have the answer
}

// neither we or our children have the answer, let's go to the parent
return false;
}

我主要删了第一个while,删了最后一个else。

关于java - 树结构中的递归回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078644/

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