public Solver() { super(); try { data = new Data(filename); printer = new PrintStream("out.txt"); // Dimensionando vetores mi = new double[data.nLinks]; mi_new = new double[data.nLinks]; mi_diff = new double[data.nLinks]; gama = new double[data.nLinks]; // Resolvo o modelo com todos os Y=1 para iniciar o loop ModelY1 modely1 = new ModelY1(data); UB = modely1.getUB(); modely1.finalizeModel(); // Resolvo o modelo linear, ou seja, y do tipo numvar ModelLinear modellinear = new ModelLinear(data); linearObjectiveValue = modellinear.getOV(); modellinear.finalizeModel(); printer.println( String.format("%-15s", "Linear Objective Value:") + String.format("%15.2f", linearObjectiveValue)); // Lower Bound comeca igual a -infinito LB = -Double.MAX_VALUE; // Crio meu modelo Lagrange ModelLagrange model = new ModelLagrange(data); for (int k = 0; k < K; k++) { model.buildAndSolveObjectiveFunction(mi); // Atualizo o LB double lb = model.getLB(); if (lb > LB) { LB = lb; // zero contabilizacao de ocorrencia de progresso beta = 0; } // Acho gama gama = model.getGama(); // atualizacao do UB se o gama for viavel if (model.isFeasible(gama) && (model.getUB() < UB)) { UB = model.getUB(); } // Calculo o Teta teta = (lambda * (UB - model.getLB())) / Math.pow(Util.calculaNorma(gama), 2); // Calculo o MI(k+1) e o MI(k+1 - k) for (int i = 0; i < data.nLinks; i++) { mi_new[i] = Math.max(0, mi[i] + (teta * gama[i])); mi_diff[i] = mi_new[i] - mi[i]; } if (Util.calculaNorma(mi_diff) < EPSLON) { break; } if (beta == BETA) { lambda = (lambda / 2); beta = 0; } else { beta++; } updateLog(gama, mi, teta, lambda, k, UB, LB, model); for (int i = 0; i < data.nLinks; i++) { mi[i] = mi_new[i]; } } } catch (IOException exc1) { System.err.println(exc1); } catch (IloException exc2) { System.err.println(exc2); } catch (OutOfMemoryError exc3) { System.err.println(exc3); } }