2012-02-08 3 views
0

Я пишу программу для решения головоломки с 8 плитами для класса AI. в теории это довольно просто, но число генерируемых состояний узлов довольно велико (около 180 000 или около того). Мы сравниваем различные эвристические функции в классе, поэтому мой код должен иметь возможность обрабатывать даже некоторые очень неэффективные функции. Я использую класс OutOfMemoryError: Java heap space при использовании класса PriorityQueue Java. Heres соответствующий код жгутов мой решатель функции: (ошибка на openList.add (темп); линия)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 МБ, вы можете увеличить это количество, передав параметр, как показано ниже;

java -Xmx1024m YOUR_CLASS 

Это дает пространство памяти объемом 1024 МБ в памяти, вы можете изменить объем памяти по мере необходимости.

Если вы используете NetBeans, Netbeans автоматически не масштабирует пространство кучи, вы можете добиться этого, выполнив следующие шаги;

1 Щелкните правой кнопкой мыши на вашем проекте

2 Перейдите Настройка конфигурации -> Настройка

3-Добавить -Xmx256m в параметры виртуальной машины нажмите кнопку ОК

Теперь вы можете запустить свой проект пользовательское пространство кучи.

+0

Я использую netbeans для этого проекта, который, по моему пониманию, автоматически масштабирует кучу пространства до процентного значения системного бара, который должен быть уже 2gb или около того на моем comp, мои инструкторы comp, я уверен, будут меньше, поэтому Мне действительно нужно обработать это в коде. Предложения относительно того, как будут оцениваться. – dragoncmd

+0

Вы можете снова проверить ответ, я добавил инструкции NetBeans – emin

+0

Да, возиться с теми, с тех пор как вы впервые отправили, я думаю, что я что-то не так в коде, ни один из моих одноклассников не имеет подобных проблем. Я собираюсь пройти и снова проверить свою логику. – dragoncmd

Смежные вопросы