public void runSimplexe() throws MatrixException
    {
        Matrice Nbarre;
        Matrice bBarre;
        Matrice delta;
        Matrice ciDansB = new Matrice(this.A.getNbLines(), 1);
        Matrice iDansB = new Matrice(this.A.getNbLines(), 1);
        Matrice temp = new Matrice(this.A.getNbLines(), 1);
        boolean nonOptimale = true;
        int s;
        int r;
        double teta;
        double zBarre = 0;
        int etape = 0;
        System.out.println("\n=====>SIMPLEXE<=====");
        initSimplexe(ciDansB, iDansB);
        
        while(nonOptimale)
        {
            System.out.println("\n===> Etape : "+etape);
            Nbarre = this.getNbarre();
            bBarre = this.getBbarre();
            
            setAbarre(iDansB, Nbarre);
            System.out.println("\nA barre :");
            this.Abarre.printMatrice();
            
            delta = getDelta(ciDansB);
            System.out.println("\nDelta :");
            delta.printMatrice();
            
            if(etape == 0)
                {
                    zBarre = initZbarre(ciDansB, bBarre);
                }

            System.out.println("Zbarre : "+zBarre+"\n");
            
            if(checkOptimal(delta))
            {
                nonOptimale = false;
                System.out.println("Solution optimale, tous les deltas sont >= 0 !");
                System.out.println("Pour X valant :");
                this.X.printMatrice();
            }
            
            //VERIFIER CLAUSE OPTIMUM = -infini
            else if(checkOptimumInfini(delta))
            {
                nonOptimale = false;
                System.out.println("Optimum = -infini !");
            }
            
            else
            {
                System.out.println("Solution non optimale, tous les deltas ne sont pas >= 0 !\n");
                s = getMinDeltaPos(delta);
                r = (int)getTeta(s, bBarre)[1];
                teta = getTeta(s, bBarre)[0];
                System.out.println("s = "+s+"; r = "+r+"; teta = "+teta+"\n");

                determineX(r, s, teta, bBarre);
                System.out.println("Nouveaux X :\n");
                this.X.printMatrice();
                
                zBarre += delta.getValueAt(0, s)*teta;
                
                //On met r à la place de s
                copyColumn(r, 0, this.Abarre, temp);
                copyColumn(s, r, this.Abarre, this.Abarre);
                copyColumn(0, r, temp, this.Abarre);
                updateCiDansB(ciDansB, iDansB, s, r);
               
                //Mettre B et N à jour par rapport à A barre
                updateBN(iDansB);
                this.b.setData(bBarre.getData());
            }
            
            etape++;
        }
        
    }