diff --git a/.gitignore b/.gitignore index 3065496c5294eb5cc75f057b2a2b3aa6a6d63009..c29e2c70ccb18ec9a6aca36e39c9baace2c909dd 100644 --- a/.gitignore +++ b/.gitignore @@ -218,4 +218,5 @@ replay_pid* # End of https://www.toptal.com/developers/gitignore/api/jetbrains,intellij,java *.Identifier -log.txt \ No newline at end of file +log.txt +/.idea/ diff --git a/src/Main.java b/src/Main.java index 0a163e39f20b6a777bb4f2d121bc5b3d269dfdbd..1cbf06d437356ea2d010fd17d10cb58ee292079a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -5,7 +5,6 @@ import java.util.Scanner; import java.util.concurrent.TimeUnit; public class Main { - /** * Compter le nombre d'inéquations S.C * @param sc scanner @@ -34,64 +33,65 @@ public class Main { * Fonction main * @param args arguments en entrées */ - public static void main(String[] args) { + public static void main(String[] args) throws Exception { long start = System.nanoTime(); - try { - File f = new File("src/input.txt"); - Scanner sc = new Scanner(f); - String[] elements; - int widthMat = nbLines(sc); - sc = new Scanner(f); // remettre le scanner à la première ligne - int contraintes = nbContraintes(sc); - sc = new Scanner(f); // remettre le scanner à la première ligne - int line = 0; - Equation eq = new Equation(widthMat*2, contraintes); // lignes supp au cas où, il y a des "=" + File f = new File("src/input.txt"); + Scanner sc = new Scanner(f); + String[] elements; + int widthMat = nbLines(sc); + sc = new Scanner(f); // remettre le scanner à la première ligne + int contraintes = nbContraintes(sc); + sc = new Scanner(f); // remettre le scanner à la première ligne + int line = 0; + Equation eq = new Equation(widthMat*2, contraintes); // lignes supp au cas où, il y a des "=" - // Max / Min + function obj - String firstLine = sc.nextLine(); - elements = firstLine.split(";"); - eq.setFirstLine(elements); + // Max / Min + function obj + String firstLine = sc.nextLine(); + elements = firstLine.split(";"); + eq.setFirstLine(elements); - // S.C. - while (sc.hasNextLine()) { - String tmp = sc.nextLine(); - elements = tmp.split(";"); + // S.C. + while (sc.hasNextLine()) { + String tmp = sc.nextLine(); + elements = tmp.split(";"); - switch (eq.getSens()) { - case "min", "max" -> - // création de l'équation dans le sens min - line = eq.createEq(elements, line); - default -> { - System.err.println("Le sens n'a pas été entré."); - System.exit(1); - } + switch (eq.getSens()) { + case "min", "max" -> + // création de l'équation dans le sens min + line = eq.createEq(elements, line); + default -> { + System.err.println("Le sens n'a pas été entré."); + System.exit(1); } - line++; } - // Print - eq.printEq(line); + line++; + } + // Print + eq.printEq(line); - // Tableau initiale - Simplex2 spx = new Simplex2(widthMat, line+1, line + 3); - spx.createSimplex(eq); - spx.printSimplex("Tableau"); + // Tableau initiale + Simplex2 spx = new Simplex2(widthMat, line+1, line + 3); + spx.createSimplex(eq); + spx.printSimplex("Tableau"); - // true = phase 1 membres de droite pas admissible | false = phase 2 membres de droite admissible - int phase = spx.which_phase(); - if (phase != -1) { - /*spx.tabAux(phase); - System.out.println("Tableau Auxiliaire:"); - System.out.println(Arrays.deepToString(spx.getTabAux()));*/ - } - else { - spx.pivot(); - spx.printSimplex("pivot"); - } + // Tableau initiale + //Simplex spx = new Simplex(line+1, line + 3, widthMat); + //spx.createMatEcart(eq); + //spx.printSimplex("Tableau"); - sc.close(); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); + // true = phase 1 membres de droite pas admissible | false = phase 2 membres de droite admissible + int phase = spx.which_phase(); + if (phase != -1) { + /*spx.tabAux(phase); + System.out.println("Tableau Auxiliaire:"); + System.out.println(Arrays.deepToString(spx.getTabAux()));*/ } + else { + spx.pivot(); + spx.printSimplex("pivot"); + } + + sc.close(); long stop = System.nanoTime(); long duration = TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS); System.out.println("Temps d'exécution: " + duration + " ms"); diff --git a/src/Simplex2.java b/src/Simplex2.java index c84b2870f944d5ccf33b2946e81206b466dcf097..5f3705862760743929d3c6daeb366ae8c78f8af5 100644 --- a/src/Simplex2.java +++ b/src/Simplex2.java @@ -19,7 +19,7 @@ public class Simplex2 { this.nbLines = nbLines; this.x = x; this.y = y; - this.simplex = new ArrayList<ArrayList<Double>>(); + this.simplex = new ArrayList<>(); } public void printSimplex(String title) { @@ -51,7 +51,7 @@ public class Simplex2 { } // Membre de droite - for (int i = 0; i < x - 1; i ++) + for (int i = 0; i < x - 1; i++) simplex.get(i).set(y - 1, eq.getRightVec().get(i)); // Fonction obj @@ -84,10 +84,9 @@ public class Simplex2 { private int ligneSortante(int y) { int id = 0; - int i = 0; double tmp = simplex.get(id).get(this.y-1) / simplex.get(id).get(y); - for (ArrayList<Double> doubles : simplex) { - double tmp_s = doubles.get(this.y-1) / doubles.get(y-1); + for (int i = 1; i < this.x - 1; i++) { + double tmp_s = simplex.get(i).get(this.y -1) / simplex.get(i).get(y); if(tmp_s < tmp) { id = i; tmp = tmp_s; @@ -98,20 +97,27 @@ public class Simplex2 { } void pivot() { + // TODO Verif pivot id fausse int firstNeg = getFirstNeg(); if(firstNeg == -1) return; boolean has_neg = false; int id = ligneSortante(firstNeg); double pivot = simplex.get(id).get(firstNeg); + ArrayList<Double> tmp = new ArrayList<>(); for (Double d : simplex.get(id)) - d /= pivot; + tmp.add(d / pivot); + simplex.set(id, tmp); + + tmp = new ArrayList<>(); + int id_tmp = 0; for (ArrayList<Double> doubles : simplex) { pivot = doubles.get(firstNeg); for (Double d : doubles) { - if(doubles.indexOf(d) != id) { - d -= pivot * simplex.get(id).get(doubles.indexOf(d)); - } + if(doubles.indexOf(d) != id) + tmp.add(pivot * simplex.get(id).get(doubles.indexOf(d))); + id_tmp ++; } + simplex.set(id_tmp, tmp); } for (Double d : simplex.get(x-1)) { if(signe(d)) {