我在循环中检查res的内容(给定动作a的下一个状态)并且它们是正确的。它确实添加到前沿列表,但值都是相同的,res的最后一次迭代。
let inline listMax xs = List.reduce max xs
答案 0 :(得分:1)
我猜您已尝试实施Breadth-first search。
从您的实施中看起来您错过了这一步:if n is not in S:
因此,如果您的图表中没有循环,它就可以正常工作。在其他情况下,你会陷入无限循环。
此外,此代码中存在很多错误:
public State BFSearch(){
State initial = new State(array);
LinkedList<State> frontier = new LinkedList<State>();
frontier.add(initial); <-- initially you have 1 element in list
while(!frontier.isEmpty()){
State currentState = new State(); <-- You don't need to create new instance because you'll overwrite it on next step
currentState = frontier.removeFirst(); <-- you remove initial element
if(goalTest(currentState)){
System.out.println("goal");
return currentState;
}
else{
for (Point a : Actions(currentState)) { <-- I guess Actions is method which returns N points
State res = new State(); <-- You don't need to create instance because you overwrite it on next step
res = Result(currentState,a); <-- is it method with just return state or you just missed `new`
<-- here should be check for existent `res` in `frontier` -->
frontier.add(res); <-- there you put N new steps
}
}
}
return null;
}
您的实施可能如下:
public State BFSearch() {
State initial = new State(arrays);
List<State> frontier = new LinkedList<>();
frontier.add(initial);
while (!frontier.isEmpty()) {
State currentState = frontier.removeFirst();
if (goalTest(currentState)) {
System.out.println("goal");
return currentState;
} else {
for (Point a : actions(currentState)) {
State res = result(currentState, a);
if (!frontier.contains(res)) {
frontier.add(res);
}
}
}
}
return null;
}
重要强>
确保您在equals
实施中正确实施了hashCode
和State
方法
答案 1 :(得分:0)
这在声明currentState = frontier.removeFirst();
中非常明显
因为它在while循环中,最终所有元素都被删除。
如果您不想删除,可以尝试peekFirst()
方法。
答案 2 :(得分:0)
很难完全按照你的行为做什么或你的问题是什么,但是从我收集你的东西中删除第一个元素(从最初可能是单个元素列表的列表中删除),然后你&#39 ;重新检查以查看它是否符合条件,如果不是,您将从函数返回它,如果不是,则根据另一个集合填充元素。然后重复上述内容,直到第一个元素是你想要的元素?您是否尝试过打印&#34;结果(currentState,a)&#34;在循环中,看看它给你什么?或者在进入下一次迭代之前打印出列表?