Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
tp-math
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Math
2e-annee
tp-math
Commits
40314ab8
Commit
40314ab8
authored
2 years ago
by
thibault.capt
Browse files
Options
Downloads
Patches
Plain Diff
Final push before doc
parent
f9249216
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/Main.java
+11
-3
11 additions, 3 deletions
src/Main.java
src/Matrix.java
+40
-1
40 additions, 1 deletion
src/Matrix.java
src/Simplex.java
+40
-10
40 additions, 10 deletions
src/Simplex.java
with
91 additions
and
14 deletions
src/Main.java
+
11
−
3
View file @
40314ab8
...
...
@@ -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
);
}
...
...
This diff is collapsed.
Click to expand it.
src/Matrix.java
+
40
−
1
View file @
40314ab8
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
);
...
...
This diff is collapsed.
Click to expand it.
src/Simplex.java
+
40
−
10
View file @
40314ab8
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
=
0
E
-
7
;
private
int
nbContraintes
;
private
static
final
double
EPSILON
=
0
E
-
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
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment