diff --git a/src/Main.java b/src/Main.java index 344975b5e1f37f502e64cd5ddda00f16f7522c5b..a0dcae37ae2df194eb90944e4aa9d20c6c487335 100644 --- a/src/Main.java +++ b/src/Main.java @@ -17,7 +17,7 @@ public class Main { count++; sc.nextLine(); } - return count - 1; // A cause de la premiere ligne + return count - 1; // À cause de la premiere ligne } /** @@ -38,20 +38,22 @@ public class Main { * @param args arguments en entrées */ public static void main(String[] args) throws FileNotFoundException, RuntimeException { + // Definition des variables, récupération du fichier à utiliser saisi par l'utilisateur et mode débogage Scanner readFile = new Scanner(System.in); - System.out.println("Entrez le nom du fichier à tester SANS EXTENSION, il doit se situer dans le dossier src. (Ex: input)"); + System.out.println("Entrez le nom du fichier à tester SANS EXTENSION, " + + "il doit se situer dans le dossier src. (Ex: input)"); String nameFile = readFile.nextLine(); File f = new File("src/" + nameFile + ".txt"); System.out.println("Souhaitez vous activer le débogage ? y / n"); String readingDebug = readFile.nextLine(); boolean debugging = false; - switch (readingDebug) { case "y" -> debugging = true; case "n" -> debugging = false; default -> System.err.println("Une erreur a été détectée lors de la saisie du débogage"); } + // Calcule du temps d'exécution et création de l'équation long start = System.nanoTime(); Scanner sc = new Scanner(f); String[] elements; @@ -93,12 +95,17 @@ public class Main { // true = phase 1 membres de droite pas admissible | false = phase 2 membres de droite admissible if (spx.which_phase()) { + // Création du tableau auxiliaire et pivot dessus Matrix m = spx.tabAux(); + // Calcul du temps d'exécution long stop = System.nanoTime(); long duration = TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS); + // Affichage des résultats spx.resultPrint(m, duration); } else { + // Juste le pivot sur la matrice d'écart spx.pivot(spx.getMatEcart(), false); + // Si mode débogue, afficher chaque pivot if(debugging) { spx.printSimplex(spx.getMatEcart(), "Résultat"); System.out.println("Nombre de pivot: " + spx.getNbPivot()); @@ -106,6 +113,7 @@ public class Main { // Mesure du temps long stop = System.nanoTime(); long duration = TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS); + // Affichage du résultat spx.resultPrint(spx.getMatEcart(), duration); } diff --git a/src/Matrix.java b/src/Matrix.java index d7f3202c9f51745a79d46c7d94dd3aab9427cb1c..7dcf1f662bd47382e30481f0944a014c8472ff54 100644 --- a/src/Matrix.java +++ b/src/Matrix.java @@ -1,5 +1,5 @@ public class Matrix { - private int line; // Lignes + private int line; private int col; // Colonnes private double[][] data; @@ -23,32 +23,64 @@ public class Matrix { this.data[line][col] = d; } + /** + * Constructeur d'une matrice + * + * @param line le nombre de lignes + * @param col le nombre de colonnes + */ public Matrix(int line, int col) { this.line = line; this.col = col; this.data = new double[line][col]; } + /** + * Remplir la matrice grâce à une autre matrice + * + * @param line nombre de lignes de la matrice passée en paramètre + * @param col nombre de colonnes de la matrice passée en paramètre + * @param tab la matrice qui sert à remplir celle de la classe + * @throws IndexOutOfBoundsException Si matrice passée en paramètre en + grande que celle de la classe + */ public void matrixFill(int line, int col, double[][] tab) throws IndexOutOfBoundsException { + // Parcourir for (int i = 0; i < line; i++) { for (int j = 0; j < col; j++) { + // Si index contenu dans la matrice de la classe, ajouter la valeur dans celle-ci if (i < tab.length && j < tab[i].length) this.data[i][j] = tab[i][j]; } } } + /** + * Réallouer la matrice (changer le nombre de ligne(s) / colonne(s)) + * + * @param line nombre de lignes + * @param col nombre de colonnes + */ public void matrixRealloc(int line, int col) { + // Stocker temporairement les données double[][] tmp = this.data; + // Réallouer le nb de ligne(s) / colonne(s) this.line = line; this.col = col; this.data = new double[line][col]; + // Remplir la nouvelle matrice avec les anciennes valeurs (le reste à 0) matrixFill(line, col, tmp); } + /** + * Print une matrice + * + * @param s Titre d'une matrice + */ public void matrixPrint(String s) { + // Titre System.out.println(); System.out.println(s + ": "); + // Parcourir la matrice et afficher les valeurs arrondies au centième for (int i = 0; i < line; i++) { for (int j = 0; j < col; j++) { System.out.format("%10.2f", this.data[i][j]); @@ -57,6 +89,13 @@ public class Matrix { } } + /** + * Print du tableau auxiliaire comme dans l'énnoncé + * @param s le titre + * @param nbX nombre de X + * @param nbZ nombre de Z + * @param nbAux nombre d'auxiliaires + */ public void printTabAux(String s, int nbX, int nbZ, int nbAux) { System.out.println("---------------------------"); System.out.println(s); diff --git a/src/Simplex.java b/src/Simplex.java index e102f07bc18299483eeab7e566b9a0618fdd81e7..2fe6e0c0aa40fbbd1da652fdee19ba4af81875f4 100644 --- a/src/Simplex.java +++ b/src/Simplex.java @@ -1,15 +1,15 @@ import java.util.Arrays; public class Simplex { - private boolean debugging; - private Matrix matEcart; - private Matrix tabAux; - private int nbSousCondition; - private int ligne; // Ligne - private int colonne; // Colonne + private final boolean debugging; // booléen de debug + private final Matrix matEcart; // matrice d'écart + private final Matrix tabAux; // matrice auxiliaire (tableau auxiliaire en phase 1) + private final int nbSousCondition; + private final int ligne; // Ligne + private final int colonne; // Colonne private int nbPivot; - private static double EPSILON = 0E-7; - private int nbContraintes; + private static final double EPSILON = 0E-7; + private final int nbContraintes; public Matrix getMatEcart() { return matEcart; @@ -109,7 +109,7 @@ public class Simplex { System.out.println("Il n'y a pas de solutions admissibles pour ce problème."); } if (Math.abs(solutionOptimale) < EPSILON || solutionOptimale == 0) { - // Il y a une solution optimale + // Il y a une solution optimale. // Il faut enlever les variables auxilaires Matrix res = new Matrix(matEcart.getLine(), matEcart.getCol()); res.matrixFill(res.getLine(), res.getCol(), tabAux.getDatas()); @@ -136,7 +136,7 @@ public class Simplex { * @param mat Matrix * @param phase true => phase 1 | false => phase 2 */ - void pivot(Matrix mat, boolean phase) { + void pivot(Matrix mat, boolean phase) { this.nbPivot += 1; int firstNeg = getFirstNeg(mat); if (firstNeg == -1) return; // si pas de négatif @@ -171,30 +171,60 @@ public class Simplex { pivot(mat, phase); } + /** + * Récupérer l'id de la ligne du pivot + * @param mat le tableau auxiliaire + * @param y la colonne où l'on va chercher le pivot + * @param phase la phase dans laquelle on se situe + * @return l'id de la ligne du pivot + */ int ligneSortante(Matrix mat, int y, boolean phase) { + // phase 1 on ne va pas chercher dans les deux dernières lignes + // phase 2, on ne va pas chercher dans la dernière ligne int depth = phase ? mat.getLine() - 2 : mat.getLine() - 1; + // On commence à chercher à l'id 0 int id = 0; + // La première vérification permet de s'assurer qu'on ne tombe pas sur un 0 + // La 2ᵉ vérification permet de vérifier qu'au plus profond de la matrice il s'agit bien d'un négatif while (!(mat.getData(id, y) > 0) && mat.getData(id, depth) >= 0) { id++; } + + // On divise le membre de droite par la valeur de la matrice en question double tmp = mat.getData(id, mat.getCol() - 1) / mat.getData(id, y); double tmp_s; + // On parcourt toutes la ligne for (int i = 1; i < depth; i++) { + // Si la valeur est plus grande que 0 if (mat.getData(i, y) > 0) { + // On divise le membre de droite par la valeur de la matrice en question tmp_s = mat.getData(i, mat.getCol() - 1) / mat.getData(i, y); + // Si la valeur actuelle est plus petite que la valeur stockée précedement, + // on sauvegarde l'id de celui-ci if (tmp_s < tmp) { id = i; tmp = tmp_s; } } } + // On retourne l'id return id; } + /** + * Print les informations des matrices pour le mode débogage + * @param mat la matrice souhaitée + * @param s le titre + */ public void printSimplex(Matrix mat, String s) { mat.matrixPrint(s); } + /** + * Print du résultat comme dans l'énnoncé + * @param m la matrice + * @param time le temps de l'exécution + */ public void resultPrint(Matrix m, long time) { int line = m.getLine() - 1; int col = m.getCol() - 1;