我正在尝试写一个关于河问题的启发式搜索。问题是,我有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/

10-10 17:05