2012-02-08 45 views
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()); 
     } 
    } 

難道我在這裏做得不對,或者我應該用別的東西來處理這個量數據?謝謝。

回答

0

默認情況下,JVM以64 MB堆空間開始,您可以通過傳遞如下參數來增加此數量;

java -Xmx1024m YOUR_CLASS 

這給內存1024 MB堆空間,您可以根據需要更改內存量。

如果您使用的是NetBeans,Netbeans的不自動縮放堆空間,您可以通過以下步驟實現這一目標;

1-右鍵點擊你的項目

2-導航設置配置 - >自定義

3添加-Xmx256m到VM選項,然後單擊OK現在

,您可以運行項目自定義堆空間。

+0

我使用NetBeans這個項目,它通過我的理解會自動縮放堆空間給系統RAM,它應當已經在我的補償2GB左右的比例,我的導師補償我肯定會少,所以我真的需要在代碼中處理這個問題。有關如何將不勝感激的建議。 – dragoncmd 2012-02-08 23:29:44

+0

您可以再次檢查答案,我加入NetBeans的說明 – emin 2012-02-08 23:38:42

+0

是啊,被搞亂與那些因爲你先貼後,我在想,我要去一些錯誤在我的代碼,沒有我的同學也有類似的問題。我要再次檢查我的邏輯。 – dragoncmd 2012-02-08 23:46:27