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.
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.
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.
Nous commençons également à calculer le temps d'exécution après le retour du parser, soit au début des appels de fonctions du simplex, et nous terminons le calcul avant l'affichage des résultats. Nous faisons ce choix car l'affichage de matrice est assez gourmand en temps et cela se remarque de plus en plus en fonction de la taille de la matrice et du fichier original.
Nous commençons également à calculer le temps d'exécution après le retour du parseur, soit au début des appels de
fonctions du simplex, et nous terminons le calcul avant l'affichage des résultats. Nous faisons ce choix, car
l'affichage de matrice est assez gourmand en temps et cela se remarque de plus en plus en fonction de la taille de la
matrice et du fichier original.
## Analyse des performances
...
...
@@ -72,18 +79,33 @@ Temps d'exécution et pivots : Méthode 2 / Méthode 1 (Les méthodes sont expli
Le temps d'exécution est, dans l'ensemble, assez faible, bien qu'il soit encore possible de l'améliorer.
Une grande amélioration du temps que nous avons pu constater est la manière de choisir le négatif lors du choix du pivot. En effet nous pouvons choisir cela de deux manières différentes.
Une grande amélioration du temps que nous avons pu constater est la manière de choisir le négatif lors du choix du
pivot. En effet, nous pouvons choisir cela de deux façons différentes.
En premier lieu nous pouvons choisir le 1er négatif rencontré. Ce qui marche très bien pour les problèmes ne comportant pas une trop grande taille. Cependant avec cette méthode, le network5 nous retourne une boucle infinie.
En premier lieu, nous pouvons choisir le 1er négatif rencontré. Ce qui marche très bien pour les problèmes ne comportant
pas une trop grande taille. Cependant, avec cette méthode, le network5 nous retourne une boucle infinie.
En second lieu, nous pouvons choisir de comparer les négatifs obtenus et choisir le pivot sur la ligne du plus petit négatif recontré. De cette manière , tout d'abord le network5 nous retourne un résultat, mais en plus les autres input voient une diminution du temps d’exécution. C'est donc pour cela que nous choisissons donc cette méthode par défaut et notre jar généré utilise donc cette 2ème méthode.
En second lieu, nous pouvons choisir de comparer les négatifs obtenus et choisir le pivot sur la ligne du plus petit
négatif rencontré. De cette manière, tout d'abord le network5 nous retourne un résultat, mais en plus les autres inputs
voient une diminution du temps d’exécution. C'est donc pour cela que nous choisissons donc cette méthode par défaut et
notre jar généré utilise donc cette 2ᵉ méthode.
## 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 remplacions la ligne en question. Le problème étant que s'il y avait plusieurs négatifs dans les membres de droite, ils y resteraient.
Deuxièmement , nous avons utilisé pendant la quasi intégralité du temps imparti la première méthode de sélection du pivot (négatif décrits au dessus). Nous n'avions donc aucun résultat pour network5 ainsi que pour certains autres fichiers de tests que nous testions. En changeant cette méthode par la seconde, nous avons donc maintenant un résultat, qui nous l'espérons, est correct.
Troisièmement, en jouant un peu avec notre epsilon, nous avons constaté que nous pouvions parfois obtenir des résultats différents. Par exemple, le fichier lp_test.txt nous retourne le bon résultat quand notre epsilon vaut 1e-7 (qui est notre valeur par défaut que nous utilisons depuis le début et que nous avons choisie arbitrairement) . Si nous dépassons 1e14, nous remarquons que nous n'obtenons plus de résultat pour ce fichier. Il s'agit surement de la valeur de la solution optimale en phase 1 qui n'est plus considérée à partir de cette valeur. Il pourrait aussi s'agir d'un dépassement de floating après la virgule mais nous n'en sommes vraiment pas sur.
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 remplacions la ligne en question. Le problème étant que s'il y
avait plusieurs négatifs dans les membres de droite, ils y resteraient.
Deuxièmement, nous avons utilisé pendant la quasi-intégralité du temps imparti la première méthode de sélection du pivot
(négatif décrit au-dessus). Nous n'avions donc aucun résultat pour network5 ainsi que pour certains autres fichiers de
tests que nous testions. En changeant cette méthode par la seconde, nous avons ainsi maintenant un résultat, qui nous
l'espérons, est correct.
Troisièmement, en jouant un peu avec notre epsilon, nous avons constaté que nous pouvions parfois obtenir des résultats
différents. Par exemple, le fichier lp_test.txt nous retourne le bon résultat quand notre epsilon vaut 1e-7 (qui est
notre valeur par défaut que nous utilisons depuis le début et que nous avons choisie arbitrairement).
Si nous dépassons 1e14, nous remarquons que nous n'obtenons plus de résultat pour ce fichier. Il s'agit surement de
la valeur de la solution optimale en phase 1 qui n'est plus considérée à partir de cette valeur. Il pourrait aussi $
s'agir d'un dépassement de floating après la virgule, mais nous n'en sommes vraiment pas sûrs.