Skip to content
Snippets Groups Projects
Select Git revision
  • 6478954a906aeb19633ddc6b12f5ac51bb0b1556
  • main default protected
  • thibault.capt-main-patch-72132
3 results

Simplex.java

Blame
  • 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;
        }
    }