diff --git a/src/Matrix.java b/src/Matrix.java index f9cdc83a1356fd0e1c921801f74d36a04c5e0c40..72d4fddf696937ebd6d6019dcf31a279728cc37a 100644 --- a/src/Matrix.java +++ b/src/Matrix.java @@ -36,7 +36,7 @@ public class Matrix { this.data = new double[x][y]; } - public void matrixFill(int x, int y, double[][] tab) throws RuntimeException{ + public void matrixFill(int x, int y, double[][] tab) throws IndexOutOfBoundsException{ for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { this.data[i][j] = tab[i][j]; @@ -44,12 +44,22 @@ public class Matrix { } } + public void matrixInitFromArray(double[] tab) throws IndexOutOfBoundsException { + int id = 0; + for (int i = 0; i < x; i ++) { + for (int j = 0; j < y; j ++) { + this.data[i][j] = tab[id]; + id++; + } + } + } + public void matrixRealloc(int x, int y) { double[][] tmp = this.data; - this.data = new double[x][y]; - matrixFill(x, y, tmp); this.x = x; this.y = y; + this.data = new double[x][y]; + matrixFill(x, y, tmp); } public void matrixPrint(String s) { diff --git a/src/Simplex.java b/src/Simplex.java index 4390649296492eb6142ed74bd9fbbf9917960f96..7befd71fbe995cfeeee6ef3653ffbe0ca30595e1 100644 --- a/src/Simplex.java +++ b/src/Simplex.java @@ -3,14 +3,17 @@ import java.util.Arrays; public class Simplex { private final Matrix matEcart; private final Matrix tabAux; - private final int nbLines; + private final int x; + private final int y; public double[][] getTabAux() { return tabAux.getDatas(); } public Simplex(int x, int y, int nbLines) { + this.x = x; + this.y = y; this.matEcart = new Matrix(x, y); this.nbLines = nbLines; this.tabAux = new Matrix(x + nbLines + 1, y + 1); @@ -19,8 +22,8 @@ public class Simplex { void createSimplex(Equation eq) { int nbContraintes = eq.getNbContraintes(); // Matrice Amxn - for (int i = 0; i < this.matEcart.getX(); i++) { - for (int j = 0; j < this.matEcart.getY(); j++) { + for (int i = 0; i < this.x; i++) { + for (int j = 0; j < this.y; j++) { if (j < nbContraintes) { this.matEcart.setData(i, j, eq.getMatAtId(i, j)); } else { @@ -30,15 +33,15 @@ public class Simplex { } // Membre de droite - for (int i = 0; i <= this.matEcart.getX()-2; i++) - this.matEcart.setData(i, this.matEcart.getY()-1, eq.getRightVec().get(i)); + for (int i = 0; i <= this.x - 2; i++) + this.matEcart.setData(i, this.y - 1, eq.getRightVec().get(i)); // Fonction obj for (int i = 0; i < nbContraintes; i++) - this.matEcart.setData(this.matEcart.getX()-1, i, eq.getFuncObj().get(i)); + this.matEcart.setData(this.x-1, i, eq.getFuncObj().get(i)); - // overwrite la matrice en bas à droite qui est à 1 - this.matEcart.setData( this.matEcart.getX() - 1, this.matEcart.getY() - 1, 0.0); + // overwrite la matrice en bas à droite qui est à 1. + this.matEcart.setData( this.x - 1, this.y - 1, 0.0); } /** @@ -47,38 +50,37 @@ public class Simplex { */ int which_phase(){ int res = -1; - for (int i = 0; i < this.matEcart.getX(); i++) { - if(signe(this.matEcart.getData(i, this.matEcart.getY() - 1))) - res = i; + for (int i = 0; i < this.x; i++) { + if(signe(this.matEcart.getData(i, this.y - 1))) res = i; } return res; } void tabAux(int line) { - Double[] tabRes = new Double[this.matEcart.getY()]; + Double[] tabRes = new Double[this.y]; Arrays.fill(tabRes, 0.0); - for (int j = 0; j < this.matEcart.getY(); j ++) { + for (int j = 0; j < this.y; j ++) { if(this.matEcart.getData(line, j) != 0.0) { double res = this.matEcart.getData(line, j) * -1; this.matEcart.setData(line, j, res); } - for (int i = 0; i < this.matEcart.getX()-1; i ++) + for (int i = 0; i < this.x-1; i ++) tabRes[j] -= this.matEcart.getData(i, j); } - for (int i = 0; i < this.matEcart.getX() + nbLines + 1; i ++) { - for (int j = 0; j < this.matEcart.getY() + 1; j ++) { - if(i < this.matEcart.getX() && j < this.matEcart.getY()) + for (int i = 0; i < this.x + nbLines + 1; i ++) { + for (int j = 0; j < this.y + 1; j ++) { + if(i < this.x && j < this.y) this.tabAux.setData(i, j, this.matEcart.getData(i, j)); - else if(i >= this.matEcart.getX()) + else if(i >= this.x) this.tabAux.setData(i, j, this.matEcart.getData(i - 5, j)); - else if (j == this.matEcart.getY()) + else if (j == this.y) this.tabAux.setData(i, j, tabRes[i]); } } } int getFirstNeg() { - for (int j = 0; j < this.matEcart.getY(); j++) { - if(signe(this.matEcart.getData(this.matEcart.getX() - 1, j))) return j; + for (int j = 0; j < this.y; j++) { + if(signe(this.matEcart.getData(this.x - 1, j))) return j; } return -1; } @@ -89,19 +91,19 @@ public class Simplex { boolean has_neg = false; int id = ligneSortante(firstNeg); double pivot = this.matEcart.getData(id, firstNeg); - for (int i = 0; i < this.matEcart.getY(); i++) { + for (int i = 0; i < this.y; i++) { this.matEcart.setData(id, i, this.matEcart.getData(id, i) / pivot); } - for (int i = 0; i < this.matEcart.getX(); i++) { + for (int i = 0; i < this.x; i++) { pivot = this.matEcart.getData(i, firstNeg); - for (int j = 0; j < this.matEcart.getY(); j++) { + for (int j = 0; j < this.y; j++) { if (i != id) { this.matEcart.setData(i, j, this.matEcart.getData(i, j) - pivot * this.matEcart.getData(id, j)); } } } - for (int j = 0; j < this.matEcart.getY(); j++) - if (signe(this.matEcart.getData(this.matEcart.getX() - 1, j))) { + for (int j = 0; j < this.y; j++) + if (signe(this.matEcart.getData(this.x - 1, j))) { has_neg = true; } if (has_neg) pivot(); @@ -110,9 +112,9 @@ public class Simplex { int ligneSortante(int y) { int id = 0; - double tmp = this.matEcart.getData(id, this.matEcart.getY() - 1) / this.matEcart.getData(id, y); - for (int i = 1; i < this.matEcart.getX() - 1; i++) { - double tmp_s = this.matEcart.getData(i, this.matEcart.getY() - 1) / this.matEcart.getData(i, y); + double tmp = this.matEcart.getData(id, this.y - 1) / this.matEcart.getData(id, y); + for (int i = 1; i < this.x - 1; i++) { + double tmp_s = this.matEcart.getData(i, this.y - 1) / this.matEcart.getData(i, y); if(tmp_s < tmp) { id = i; tmp = tmp_s;