当前位置: 首页 > 知识库问答 >
问题:

水壶问题Java.lang.OutofMemoryError:Java堆空间

秦宏盛
2023-03-14

为我的人工智能类编写一段代码,它旨在列出所有可能的状态,给出三个水壶的水壶问题(你可以装满任何一个水壶,或者把一个水壶倒入另一个水壶,或者清空任何一个水壶,你想要多少次就多少次,以任何顺序),从空水壶开始。

出于某种原因,在记录了88个看似不同的状态后,第89个状态与第一个状态相同,我最终用完了空间,因为它在循环。

我想这与我如何检查状态是不同的有关,但我不能弄清楚。任何帮助都将不胜感激。

import java.util.ArrayList;
    import java.util.List;

public class AI {
    private static final int[] start=new int[]{0,0,0};
    private static int[] jugs;
    public static void main(String[] args){
        jugs=new int[]{Integer.parseInt(args[0]), Integer.parseInt(args[1]),Integer.parseInt(args[2])};

    String out="";
    out=out.concat("{");
    for (int[] state:addStates(start,new ArrayList<>())) {
        out=out.concat("{"+state[0]+","+state[1]+","+state[2]+"}");
    }
    out=out.substring(0,out.length()-2).concat("}");
    System.out.println(out);

}

private static List<int[]> addStates(int[] start, List<int[]> states) {


    states.add(start);

    int[][] newStates={
            fillA(start),
            fillB(start),
            fillC(start),
            emptyA(start),
            emptyB(start),
            emptyC(start),
            pour(start,0,1),
            pour(start,0,2),
            pour(start,1,0),
            pour(start,1,2),
            pour(start,2,0),
            pour(start,2,1)
    };

    for (int[] child:newStates) {
        if (!has(states,child)) {
            states.addAll(addStates(child,states));
        }
    }
    System.out.println("close");
    return states;
}
private static boolean has(List<int[]> list, int[] e) { //finds out if list contains something with the same values as e
    for (int[] el:list) {
        boolean is=true;
        for(int i=0;i<e.length;i++){
            if (el[i]!=e[i]){
                is=false;
            }
        }
        if(is){
            return true;
        }
    }
    return false;
}

private static int[] fillA(int[] state) {
    return new int[]{jugs[0],state[1],state[2]};
} //fills A
private static int[] fillB(int[] state) {
    return new int[]{state[0],jugs[1],state[2]};
} //fills B
private static int[] fillC(int[] state) {
    return new int[]{state[0],state[1],jugs[2]};
} //fills C
private static int[] emptyA(int[] state) {
    return new int[]{0,state[1],state[2]};
} //empties A
private static int[] emptyB(int[] state) {
    return new int[]{state[0],0,state[2]};
} //empties B
private static int[] emptyC(int[] state) {
    return new int[]{state[0],state[1],0};
} //empties C
private static int[] pour(int[] state, int from, int into) {
    int currentInto=state[into];
    int currentfrom=state[from];
    if (currentInto+currentfrom>jugs[into]){
        currentfrom-=(jugs[into]-currentInto);
        currentInto=jugs[into];
    } else {
        currentInto+=currentfrom;
        currentfrom=0;
    }

    int[] newState= new int[3];
    newState[from]=currentfrom;
    newState[into]=currentInto;
    newState[3-from-into]=state[3-from-into];

    return newState;
} //moves as much water from "from" into "into"

}

共有1个答案

郭恩
2023-03-14

问题是我同时使用了states.add(start)states.addall(addStates(child,states)),这意味着我添加每个元素的次数非常多。修复了这个问题后,代码运行得非常好。

 类似资料:
  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 问题内容: 我得到这个例外: 在此代码: 我连续2次查询。如果我评论其中之一,其他工作正常。 如果我删除交易,那么事物异常便消失了。这是怎么回事?这是内存泄漏之类的吗?提前致谢。 问题答案: 我从这种事情的多年痛苦中得到了一个提示:答案通常会仔细地隐藏在堆栈跟踪的前10行中的某个位置。始终多次读取堆栈跟踪,如果没有提供足够的帮助,请读取发生故障的方法的源代码。 在这种情况下,问题出在Hiberna

  • 当我使用spark运行一个模型训练管道时,我产生了上面的错误 oom错误由org.apache.spark.util.Collection.ExternalSorter.WritePartitionedFile(ExternalSorter.Scala:706)触发(在堆栈跟踪的底部) 日志: 任何建议都会很棒:)

  • 问题内容: 如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误? 问题答案: 最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。 因此,考虑

  • 问题内容: 我在Java Web应用程序中有一个线程,它导致 java.lang.OutOfMemoryError:Java堆空间 异常,但是try / catch块无法捕获该错误。 样例代码: 输出: 背景: 我最近接手了这个Java项目,并试图跟上Java和这个项目的发展。我是C#开发人员,所以我还不熟悉这个项目或Java。我知道我可以使用- Xmx设置来修复该错误,但我有兴趣捕获此错误,因此

  • null 从这些状态,它可以生成其他状态,直到结束状态(X,D)或(D,Y)。 那么,我能估计这个问题的启发式函数吗?如何知道哪个州比其他州好? 谢谢大家。