0
我正在編寫一個程序來解決AI類的8瓦滑動拼圖。理論上這很容易,但是生成的節點狀態數量非常大(估計約爲180,000)。我們在類中比較不同的啓發式函數,所以我的代碼必須能夠處理一些非常低效的函數。當使用Java的PriorityQueue類時,我得到「OutOfMemoryError:Java堆空間」。繼承人的相關代碼withing我的求解器功能(錯誤是在openList.add(TEMP);行)啓發式搜索中的OutOfMemoryError
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());
}
}
難道我在這裏做得不對,或者我應該用別的東西來處理這個量數據?謝謝。
我使用NetBeans這個項目,它通過我的理解會自動縮放堆空間給系統RAM,它應當已經在我的補償2GB左右的比例,我的導師補償我肯定會少,所以我真的需要在代碼中處理這個問題。有關如何將不勝感激的建議。 – dragoncmd 2012-02-08 23:29:44
您可以再次檢查答案,我加入NetBeans的說明 – emin 2012-02-08 23:38:42
是啊,被搞亂與那些因爲你先貼後,我在想,我要去一些錯誤在我的代碼,沒有我的同學也有類似的問題。我要再次檢查我的邏輯。 – dragoncmd 2012-02-08 23:46:27