OutOfMemoryError во время эвристического поиска - PullRequest
0 голосов
/ 09 февраля 2012

Я пишу программу, чтобы решить головоломку с 8 плитками для класса ИИ.в теории это довольно просто, но число генерируемых состояний узлов довольно велико (примерно 180 000 или около того).Мы сравниваем разные эвристические функции в классе, поэтому мой код должен уметь обрабатывать даже некоторые очень неэффективные функции.Я получаю "OutOfMemoryError: пространство кучи Java" при использовании класса PriorityQueue 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 голосов
/ 09 февраля 2012

По умолчанию JVM запускается с 64 МБ кучи, вы можете увеличить эту величину, передав параметр, как показано ниже:

java -Xmx1024m YOUR_CLASS 

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

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

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

2- Перейдите к Настройке -> Настроить

3-Добавьте -Xmx256m в параметры виртуальной машины, затем нажмите Ok

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...