public double[] runBranchAndBound(Problem problem, int ciudadesSize) {
   Nodo nodoInicial = new Nodo(problem);
   stack.push(nodoInicial);
   while (!stack.isEmpty()) {
     Nodo nodoActual = stack.pop();
     double Z;
     double[] Nx = new double[ciudadesSize];
     double[] Ny = new double[ciudadesSize];
     Z = nodoActual.getZ();
     for (int i = 0; i < ciudadesSize; i++) {
       Nx[i] = nodoActual.getNxi(i);
       Ny[i] = nodoActual.getNyi(i);
     }
     int variablesNoEnteras = 0;
     double epsilon = 0.0000001;
     for (int i = 0; i < ciudadesSize; i++) {
       if (!(Math.abs(Math.floor(Nx[i]) - Nx[i]) <= epsilon)) {
         variablesNoEnteras++;
       }
       if (!(Math.abs(Math.floor(Ny[i]) - Ny[i]) <= epsilon)) {
         variablesNoEnteras++;
       }
     }
     if (Z != -1 || Z < cota || variablesNoEnteras == 0) {
       if (variablesNoEnteras == 0 && Z > cota) {
         cota = Z;
         Bx = nodoActual.getBx();
         By = nodoActual.getBy();
       }
     } else {
       int variable = -1;
       boolean isX = false;
       for (int i = 0; i < ciudadesSize; i++) {
         if (!(Math.abs(Math.floor(Nx[i]) - Nx[i]) <= epsilon)) {
           isX = true;
           variable = i;
           i = ciudadesSize;
         }
         if (!(Math.abs(Math.floor(Ny[i]) - Ny[i]) <= epsilon)) {
           isX = false;
           variable = i;
           i = ciudadesSize;
         }
       }
       Problem p1 = nodoActual.getProblem();
       Problem p2 = nodoActual.getProblem();
       if (variable != -1) {
         if (isX) {
           double valueFloor = Math.floor(Nx[variable]);
           double valueCeil = Math.ceil(Nx[variable]);
           p1.setVarLowerBound("Nx" + variable, valueFloor);
           p2.setVarUpperBound("Nx" + variable, valueCeil);
           Nodo nodoNuevo1 = new Nodo(p1);
           Nodo nodoNuevo2 = new Nodo(p2);
           stack.add(nodoNuevo1);
           stack.add(nodoNuevo2);
         } else {
           double valueFloor = Math.floor(Ny[variable]);
           double valueCeil = Math.ceil(Ny[variable]);
           p1.setVarLowerBound("Ny" + variable, valueFloor);
           p2.setVarUpperBound("Ny" + variable, valueCeil);
           Nodo nodoNuevo1 = new Nodo(p1);
           Nodo nodoNuevo2 = new Nodo(p2);
           stack.add(nodoNuevo1);
           stack.add(nodoNuevo2);
         }
       }
     }
   }
   double[] salida = new double[3];
   salida[0] = Bx;
   salida[1] = By;
   salida[2] = cota;
   return salida;
 }