Select Git revision
Simplex.java
Simplex.java 4.59 KiB
import java.util.Arrays;
public class Simplex {
private Matrix matEcart;
private Matrix tabAux;
private int nbSousCondition;
private int x;
private int y;
private int nbPivot;
public Matrix getTabAux() {
return tabAux;
}
public Matrix getMatEcart() {
return matEcart;
}
public int getNbPivot() {
return nbPivot;
}
public Simplex(int x, int y, int nbSousCondition) {
this.x = x;
this.y = y;
this.matEcart = new Matrix(x, y);
this.nbSousCondition = nbSousCondition;
this.tabAux = new Matrix(x + 2, y + nbSousCondition + 1);
this.nbPivot = 0;
}
void createSimplex(Equation eq, int nbContraintes) {
// Matrice Amxn
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 {
this.matEcart.setData(i, j, j - nbContraintes == i ? 1.0 : 0.0);
}
}
}
// Membre de droite
for (int i = 0; i <= this.x - 1; i++)
this.matEcart.setData(i, this.y - 1, eq.getRightVec().get(i));
// Fonction obj
this.matEcart.matrixRealloc(this.matEcart.getX() + 1, this.matEcart.getY());
for (int i = 0; i < nbContraintes; i++)
this.matEcart.setData(this.x, i, eq.getFuncObj().get(i));
}
/**
* Si b[i] < 0 phase 1 sinon phase 2
*
* @return true = phase 1 | false = phase 2
*/
int which_phase() {
int res = -1;
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.y + this.nbSousCondition + 1];
Arrays.fill(tabRes, 1.0);
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.x; i++)
tabRes[j] -= this.matEcart.getData(i, j);
tabRes[j] -= 1;
}
tabRes[tabRes.length - 1] = tabRes[tabRes.length - this.nbSousCondition - 2];
for (int i = 0; i < this.tabAux.getX(); i++) {
for (int j = 0; j < this.tabAux.getY(); j++) {
if (i < this.matEcart.getX() && j < this.matEcart.getY())
this.tabAux.setData(i, j, this.matEcart.getData(i, j));
else if(i == this.tabAux.getX() - 1)
this.tabAux.setData(i, j, tabRes[j]);
else
this.tabAux.setData(i, j, this.matEcart.getData(i, j-5));
}
}
if(signe(this.tabAux.getData(this.tabAux.getX(), this.tabAux.getY()))) {
}
}
int getFirstNeg() {
for (int j = 0; j < this.y; j++) {
if (signe(this.matEcart.getData(this.x, j))) return j;
}
return -1;
}
void pivot() {
this.nbPivot += 1;
int firstNeg = getFirstNeg();
if (firstNeg == -1) return; // si pas de négatif
boolean has_neg = false;
int id = ligneSortante(firstNeg);
double pivot = this.matEcart.getData(id, firstNeg);
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.x + 1; i++) {
pivot = this.matEcart.getData(i, firstNeg);
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.y; j++)
if (signe(this.matEcart.getData(this.x, j))) {
has_neg = true;
}
if (has_neg)
pivot();
}
int ligneSortante(int y) {
int id = 0;
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;
}
}
return id;
}
public void printSimplex(Matrix mat, String s, int precision) {
mat.matrixPrint(s, precision);
}
boolean signe(Double x) {
return x < 0;
}
}