我正在编写一个程序来解决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());
}
}
我在这里做错了什么,或者我应该使用别的东西来处理这些数据?感谢。
答案 0 :(得分:0)
默认情况下,JVM以64 MB堆空间开始,您可以通过传递如下参数来增加此数量;
java -Xmx1024m YOUR_CLASS
这会在内存中提供1024 MB的堆空间,您可以根据需要更改内存量。
如果您使用的是NetBeans,Netbeans不会自动扩展堆空间,您可以通过以下步骤实现此目的;
1-右键单击您的项目
2-导航到设置配置 - &gt;定制
3 - 将-Xmx256m
添加到VM选项中,然后单击确定
现在,您可以使用自定义堆空间运行项目。