Skip to content
Snippets Groups Projects
Commit 40314ab8 authored by thibault.capt's avatar thibault.capt
Browse files

Final push before doc

parent f9249216
Branches
No related tags found
No related merge requests found
......@@ -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);
}
......
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);
......
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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment