我正在尝试写一个关于河问题的启发式搜索。问题是,我有X个体重X的人,X可以乘筏子,他们都必须从河的一侧到达另一侧。
我试图写以下内容; https://pastebin.com/h4adeVnv
public int heuristic(State state){
PersonState sState = (PersonState) state;
if(sState.isBoatIsSouth()){
return sState.isGoal() ? 0 : Collections.max(sState.listPersonsSouth).getWeight();
}
else {
return sState.isGoal() ? 0 : Collections.min(sState.listPersonsNorth).getWeight();
}
}
这使我脱离了预期答案的1个节点,并且在成本方面减少了1个节点。
我知道代码并没有真正检查当前状态与目标状态,但是我不确定如何编写。
对于替代方法的任何建议或我可以做出的任何调整将不胜感激!
最佳答案
您是否尝试过平均重量?由于木筏只能容纳
可能看起来像这样(编写伪代码,因为我没有完整的代码):
Raft raft = getRaft();
Double maxWeight = raft.getMaxWeight();
Double maxCapacity = raft.getMaxCapacity();
People[] people = getAllPeople();
Double optimalWeight = maxCapacity / maxWeight;
while(people > 0){
Person heaviestPerson = people.getHeaviestPerson();
Person lightestPerson = people.getLightestPerson();
Person secondLightestPerson = people.getSecondLightestPerson();
if((optimalWeight * 3 - (heaviestPerson.weight + lightestPerson.weight + secondLightestPerson.weight))
< (optimalWeight * 2 - (heaviestPerson.weight + lightestPerson.weight))){
raft.add(heaviestPerson);
raft.add(lightestPerson);
people.remove(heaviestPerson);
people.remove(lightestPerson);
}else{
raft.add(heaviestPerson);
raft.add(secondLightestPerson);
raft.add(lightestPerson);
people.remove(heaviestPerson);
people.remove(lightestPerson);
people.remove(secondLightestPerson);
}
}
如果您将最重和最轻的人配对,则会从最佳权重中移除方差最大的人,并将所述方差抵消为更“正常”。这样一来,将人员添加到木筏中就变得越来越容易,因为在删除每个方差较大的人员时,剩下的人员就更接近于最佳体重。
您可能也可以使用给定的方法进一步优化它(可能也要与第二个最重的人进行核对,等等)。
关于java - Java启发式搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57317165/