diff --git a/doc/background.png b/doc/background.png new file mode 100644 index 0000000000000000000000000000000000000000..c797938e5dcd26cf96882b5d8375138429ab7297 Binary files /dev/null and b/doc/background.png differ diff --git a/doc/doc.md b/doc/doc.md new file mode 100644 index 0000000000000000000000000000000000000000..33554e0c52281b64769824a3f19547181794e47a --- /dev/null +++ b/doc/doc.md @@ -0,0 +1,93 @@ +--- +title: 'Tp Simplex' +author: [Juliano Souza Luz, Thibault Capt] +date: "18.01.2023" +subject: "TP Simplex" +subtitle: "Résoudre un programme linéaire grâce à la méthode du simplex\r\nhttps://gitedu.hesge.ch/math/2e-annee/tp-math" +titlepage: true +titlepage-color: "ffffff" +titlepage-background: "background.png" +toc-own-page: true +footnotes-pretty: true +--- + +# TP Simplex + +## Choix du langage + +Nous avons donc utilisé le Java afin de résoudre ce travail pratique. En effet, python est un langage qui est très lent +à l'exécution, car celui-ci est un langage **interprété**. Nous pouvons ainsi essayer de gagner du temps d'exécution pour +la résolution du problème. + +## Astuces utilisées + +Ensuite, dans la plupart des cas, nous avons utilisé des **array** à 1 ou 2 dimension(s) qui +est bien plus rapide que les Listes Java. (https://stackoverflow.com/questions/716597/array-or-list-in-java-which-is-faster). + +Nous avons aussi opté pour que l'utilisateur puisse choisir un mode débogage ou non, ce qui permet de supprimer presque +tous les prints en mode non-débogage et gagner énormément de temps d'exécution. + +## Analyse des performances + +Nous avons reçu plusieurs fichiers à tester pour vérifier le bon fonctionnement de notre code (nous approfondirons les +résultats à "null" dans les problèmes rencontrés) : + +- input.txt + - Valeur obj : -34.25 + - nombre de pivots : 2 + - Temps d'exécution : 17ms +- input_test.txt + - Valeur obj : null + - nombre de pivots : null + - Temps d'exécution : null +- input_test2.txt + - Valeur obj : null + - nombre de pivots : null + - Temps d'exécution : null +- inputNonAdmissible.txt + - Valeur obj : -34.25 + - nombre de pivots : 3 + - Temps d'exécution : 20ms +- flow_1.txt + - Valeur obj : 78768 + - nombre de pivots : 9 + - Temps d'exécution : 33ms +- network1.txt + - Valeur obj : 78768 + - nombre de pivots : 9 + - Temps d'exécution : 30ms +- network2.txt + - Valeur obj : 0 + - nombre de pivots : 10 + - Temps d'exécution : 55ms +- network3.txt + - Valeur obj : 84077 + - nombre de pivots : 45 + - Temps d'exécution : 162ms +- network4.txt + - Valeur obj : null + - Nombre de pivots : null + - Temps d'exécution : null +- network5.txt + - Valeur obj : NaN + - Nombre de pivots: 1255 + - Temps d'exécution : 26066ms + +Le temps d'exécution est, dans l'ensemble, assez faible, bien qu'il soit encore possible de l'améliorer. + +## Problèmes rencontrés + +Nous avons rencontré plusieurs problèmes au cours de ce travail pratique. + +Premièrement, lors de la phase 1, nous ne gérions pas tous les négatifs des membres de droite. En effet, nous passions +en paramètre la ligne où nous trouvions un négatif et remplaçait cette ligne en question. Le problème étant que s'il y +avait plusieurs négatifs dans les membres de droite, il y resterait. + +Deuxièmement et n'est pas résolu, nous pouvons voir que nous avons des résultats à null. En effet, ce problème survient +lorsque notre résultat du tableau auxiliaire de la phase 1 (avant le pivot) est négatif. Par exemple, prenons le fichier +input_test, nous ne trouvons pas de résultat. Nous avons essayé de changer la valeur de notre epsilon (initialement à +1E-7) mais cela n'y change rien. + +Troisièmement, le fichier network5 affiche des NaN (not a number). Il y a donc des divisions par 0 quelque part pour ce +fichier. Le problème est qu'il y a ~1400 pivots pour ce fichier et ainsi le débogage est bien trop long pour regarder +pivot par pivot. diff --git a/doc/enonce_tp_Splx_2.pdf b/doc/enonce_tp_Splx_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59b34ec75a68f97b32a6f8104b7ed1d9a87b21c5 Binary files /dev/null and b/doc/enonce_tp_Splx_2.pdf differ diff --git a/src/Main.java b/src/Main.java index a0dcae37ae2df194eb90944e4aa9d20c6c487335..c6eeab03d2b65d89eece471d3716722011d7cfb3 100644 --- a/src/Main.java +++ b/src/Main.java @@ -91,7 +91,7 @@ public class Main { Simplex spx = new Simplex(eq.getMat().getLine(), eq.getMat().getLine() + eq.getMat().getCol() + 1, line, contraintes, debugging); spx.createSimplex(eq, contraintes); - spx.printSimplex(spx.getMatEcart(), "Tableau initial"); + if(debugging) spx.printSimplex(spx.getMatEcart(), "Tableau initial"); // true = phase 1 membres de droite pas admissible | false = phase 2 membres de droite admissible if (spx.which_phase()) { diff --git a/src/Matrix.java b/src/Matrix.java index 7dcf1f662bd47382e30481f0944a014c8472ff54..146fc5cbf9c1ef76701378868308ca9d429791f5 100644 --- a/src/Matrix.java +++ b/src/Matrix.java @@ -83,7 +83,7 @@ public class Matrix { // 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]); + System.out.format("%10f", this.data[i][j]); } System.out.println(); } diff --git a/src/Simplex.java b/src/Simplex.java index 96d3e25fe40acae31ab52c9b33ca9a4cc9006041..b338745439e8807a7fba18c759a88514ed31ef64 100644 --- a/src/Simplex.java +++ b/src/Simplex.java @@ -8,7 +8,7 @@ public class Simplex { private final int ligne; // Ligne private final int colonne; // Colonne private int nbPivot; - private static final double EPSILON = 0E-7; + private static final double EPSILON = 1E-20; private final int nbContraintes; public Matrix getMatEcart() {