启发式搜索期间的OutOfMemoryError

时间:2012-02-08 23:02:20

标签: out-of-memory priority-queue heuristics

我正在编写一个程序来解决AI类的8个平铺滑动拼图。从理论上讲,这很容易,但生成的节点状态数量非常大(估计为180,000左右)。我们在课堂上比较不同的启发式函数,所以我的代码必须能够处理一些非常低效的函数。使用java的PriorityQueue类时,我得到“OutOfMemoryError:Java堆空间”。继承了我的求解器函数的相关代码:(错误在openList.add(temp);行)

public void solve(char[] init,int searchOrder)
{
    State initial = new State(init,searchOrder); //create initial state
    openList = new PriorityQueue<State>();       //create open list
    closedList = new LinkedList<State>();        // create closed list
    generated = new HashSet();                   //Keeps track of all nodes generated to cut down search time

    openList.add(initial);                       //add initial state to the open list
    State expanded,temp = null,solution = null;  //State currently being expanded
    int nodesStored = 0, nodesExpanded = 0;
    boolean same;                                //used for checking for state redundancy
    TreeGeneration:
    while(openList.size() > 0)
    {
        expanded = openList.poll();
        closedList.addLast(expanded);
        for (int k = 0; k < 4; k++)
        {
            if (k == 0)
            {
                temp = expanded.moveLeft();
            }
            else if (k == 1)
            {
                temp = expanded.moveRight();

            }
            else if (k == 2)
            {
                temp = expanded.moveAbove();
            }
            else 
            {
                temp = expanded.moveBelow();
            }                          

            if(temp.isSolution())
            {
                solution = temp;
                nodesStored = openList.size() + closedList.size();
                nodesExpanded = closedList.size();
                break TreeGeneration;
            }
            if(!generated.contains(temp))
            {
            //    System.out.println(temp.toString());
                openList.add(temp); // error here
                generated.add(temp);
            }
           // System.out.println(openList.toString());
        }
    }

我在这里做错了什么,或者我应该使用别的东西来处理这些数据?感谢。

1 个答案:

答案 0 :(得分:0)

默认情况下,JVM以64 MB堆空间开始,您可以通过传递如下参数来增加此数量;

java -Xmx1024m YOUR_CLASS 

这会在内存中提供1024 MB的堆空间,您可以根据需要更改内存量。

如果您使用的是NetBeans,Netbeans不会自动扩展堆空间,您可以通过以下步骤实现此目的;

1-右键单击您的项目

2-导航到设置配置 - &gt;定制

3 - 将-Xmx256m添加到VM选项中,然后单击确定

现在,您可以使用自定义堆空间运行项目。