Как установить dowhile для итерации узла

моя цель - повторить логику поиска узлов, которую я создал. Для этого я реализовал условие do...while. В do{} я говорю "выберите действие, которое удовлетворяет предварительному условию с меньшей стоимостью" из начального состояния и начального узла. Когда он найден, установите начальное состояние и узел с новыми. В while() я выражаю условие «пока состояние не будет равно целевому состоянию», продолжайте.

Проблема в том, что когда я запускаю это, печатается только результат первой итерации, но кажется, что он все еще продолжает вычислять без остановки.

это код

private static Node nodeStatus;

static  Action loadPlaneP1 = new Action("loadPlaneP1",pkg1Location[1], pkg2Location[0], truckLocation[0], planeLocation[0], cityLocation[0], 30);
static  Action loadPlaneP2 = new Action("loadPlaneP2", pkg1Location[0], pkg2Location[1], truckLocation[0], planeLocation[0], cityLocation[0], 40);
....//other actions



 State state = new State(0, pkg1Location[0], pkg2Location[0], truckLocation[0], planeLocation[0], cityLocation[0]);
 State newState = new State(0, pkg1Location[0], pkg2Location[0], truckLocation[0], planeLocation[0], cityLocation[0]);
 static State goal = new State(0, pkg1Location[5], pkg2Location[4], truckLocation[3], planeLocation[2], cityLocation[1]);

 static Action[] acts = {loadPlaneP1, loadPlaneP2, fly, unloadPlaneP1, unloadPlaneP2, loadTruckP1, loadTruckP2, drive, unloadTruckP1, unloadTruckP2 };

Node startNode = new Node(state, 0);

int[] costs = {loadPlaneP1.getActionCost(), loadPlaneP2.getActionCost(), fly.getActionCost(), unloadPlaneP1.getActionCost(), unloadPlaneP2.getActionCost(), loadTruckP1.getActionCost(), loadTruckP2.getActionCost(), drive.getActionCost(), unloadTruckP1.getActionCost(),unloadTruckP2.getActionCost()};      



 do{

         if(nodeStatus != startNode) {
               nodeStatus = startNode;
            }
             else {
               nodeStatus = startNode;
                  }


         if(nodeStatus == startNode) {


         System.out.println("Old state parameters are " + "pkg1Location: " + state.getStateParameter1() + " pkg2Location: " + state.getStateParameter2() + " truckLocation: "+ state.getStateParameter3() + " planeLocation: " + state.getStateParameter4() + " cityLocation:"+ state.getStateParameter5());




            for(int i = 0; i < acts.length; i++) {


                if(acts[i].getActionCost() == getMinValue(costs)) {

                   System.out.println("PRE The first parameter is : " + acts[i].getActParameter1() + acts[i].name +" "+ acts[i].actionCost);



                      if(acts[i].loadPlaneP1Precondition() == true) {

                          System.out.println("POST The first parameter is : " + acts[i].getActParameter1());
                          System.out.println("Precondition satysfied" + " with action name: " + acts[i].name);

                      if(acts[i].getActParameter1() != state.getStateParameter1()) {

                          newState.setStateParameter1(acts[i].getActParameter1());
                         }

                      if(acts[i].getActParameter2() != state.getStateParameter2()) {
                         if(acts[i].getActParameter2() != State.pkg2Location[1]) {

                         newState.setStateParameter2(acts[i].getActParameter2());
                            } 
                         }

                      if(acts[i].getActParameter3() != state.getStateParameter3()) {

                         newState.setStateParameter3(acts[i].getActParameter3());
                         }

                      if(acts[i].getActParameter4() != state.getStateParameter4()) {

                         newState.setStateParameter4(acts[i].getActParameter4());
                         }

                      if(acts[i].getActParameter5() != state.getStateParameter5()) {

                         newState.setStateParameter5(acts[i].getActParameter5());
                         }

                         acts[i].setActCost(100);
            } 

               ................................//checking other preconditions



            Node child = new Node("Node "+ i, newState, startNode, acts[i].getActionCost(), acts[i].name);



            startNode = child;
            state = newState;




            System.out.println("Costs array: "+  Arrays.toString(costs));
            System.out.println("ActionID" +" " +  i);
            System.out.println("The action choosen is " + acts[i].name +" "+ acts[i].actionCost +" "+ acts[i].getActParameter1());
            System.out.println("State parameters updated are " + "pkg1Location: " + state.getStateParameter1() + " pkg2Location: " + state.getStateParameter2() + " truckLocation: "+ state.getStateParameter3() + " planeLocation: " + state.getStateParameter4() + " cityLocation:"+ state.getStateParameter5());
            System.out.println("The node created is : " + child.getNodeName());
                }


            }


        }



    }while(state == goal);

Как я могу распечатать результат для каждой итерации?


person Mike994    schedule 04.11.2019    source источник
comment
Прочтите, как создать минимально воспроизводимый пример. Затем используйте ссылку редактировать, чтобы улучшить свой вопрос (не добавляйте дополнительную информацию через комментарии). В противном случае мы не сможем ответить на ваш вопрос и помочь вам. Помимо этого: пожалуйста, найдите время, чтобы красиво отформатировать/сделать отступы во всем вашем коде. Вы хотите, чтобы другие тратили свое свободное время, чтобы помочь вам с вашей проблемой, поэтому вы, пожалуйста, потратьте 5 минут, которые потребуются, чтобы придумать хорошо понятный для человека ввод.   -  person GhostCat    schedule 04.11.2019
comment
Я обновил идентификацию кода и сократил код, что еще нужно? Спасибо   -  person Mike994    schedule 04.11.2019
comment
Это все еще не воспроизводится. Что такое nodeStatus, например.   -  person nicomp    schedule 04.11.2019
comment
Я добавил все определения параметров   -  person Mike994    schedule 04.11.2019
comment
Извините, у вас все еще есть много бесполезных новых строк, и ваш отступ дальше вниз все еще в значительной степени испорчен. И, как сказано: пожалуйста, прочитайте эту ссылку: нам нужно понять весь путь, который ведет к вашей проблеме. Например, у нас есть ноль информации о примерах данных, с которыми ваш код не работает. Еще раз: пожалуйста, прочитайте ту ссылку, которую я вам дал. Осторожно.   -  person GhostCat    schedule 04.11.2019


Ответы (2)


В конце цикла вы проверяете while(state == goal).
Попробуйте что-нибудь вроде while (state.equals(goal));.

Вы должны использовать метод equals при сравнении экземпляров объектов (за исключением случаев, когда они являются перечислениями, что, похоже, не в вашем случае).

Кстати, вы сказали "до тех пор, пока состояние не станет равным целевому состоянию", продолжайте.
Это будет переведено в while (!state.equals(goal)); (не равно).

ОБНОВЛЕНИЕ.
Кроме того, в начале цикла у вас есть следующий код:

if(nodeStatus != startNode) {
               nodeStatus = startNode;
            }
             else {
               nodeStatus = startNode;
                  }


         if(nodeStatus == startNode) {

Прежде всего, здесь вы также сравниваете 2 объекта с помощью знака равенства вместо метода равенства.
Кроме того, в любом случае вы присваиваете startNode nodeStatus. Последующее условие if всегда будет истинным.

person Robert Kock    schedule 04.11.2019
comment
Отличный улов. Сила групп поразительна. - person nicomp; 04.11.2019
comment
Если я пишу так, пока (!state.equals(goal)); никогда не удовлетворяет предварительному условию, и повторяю без остановки, напечатанный результат System.out.println("Old state parameters are " + "pkg1Location: " + state.getStateParameter1() + " pkg2Location: " + state.getStateParameter2() + " truckLocation: "+ state.getStateParameter3() + " planeLocation: " + state.getStateParameter4() + " cityLocation:"+ state.getStateParameter5()); - person Mike994; 04.11.2019
comment
Вы реализовали метод State.equals()? В противном случае это похоже на использование знака равенства. - person Robert Kock; 04.11.2019
comment
Я видел это спасибо. Я обновил метод equals. Смысл этой части в том, что при запуске node status равно startNode и после первой итерации, из-за обновления startNode, сбросить также nodeStatus с новым значением - person Mike994; 04.11.2019
comment
Но я получаю тот же результат, что и раньше - person Mike994; 04.11.2019
comment
Ваш код далек от завершения. Мне не хватает реализации классов Node, Action и State. Что такое переменные pkg1Location, truckLocation и т. д.? - person Robert Kock; 04.11.2019
comment
Я знаю, что это немного долго, и по этой причине я не опубликовал все. В любом случае, я решил кое-что благодаря вам - person Mike994; 04.11.2019

Вы должны попробовать решение Роберта Кока.

Вам необходимо проверить:

  1. Если класс State создан вами, вы должны переопределить метод equals (чтобы вы не сравнивали адреса объектов).
  2. И следуйте решению Роберта Кока while (!state.equals(goal));
person Rando Shtishi    schedule 04.11.2019