|
8 | 8 | public class SimplexRevisado {
|
9 | 9 |
|
10 | 10 | private final double FATOR_TOLERANCIA = 1.2; //20% maior
|
11 |
| - public static int nIteracoes; |
12 | 11 | private int qtdeVarArificiais;
|
| 12 | + private int qtdeIteracoes; |
13 | 13 |
|
14 | 14 | private PPL problema; //instancia de um problema de programação linear
|
15 | 15 | private PPL simplex; //tabelaSimplex
|
16 | 16 | private int[] base; //variáveis da base
|
17 | 17 | private Matrix matriz;
|
18 | 18 | private double[] funcaoObjetivo; //funcaoObjetivo atual
|
19 | 19 | private double[] colunaPivot; //coluna do pivot
|
| 20 | + private double[] ladoDireito; //lado direito do simplex |
20 | 21 |
|
21 | 22 | public SimplexRevisado(PPL problema) {
|
22 |
| - qtdeVarArificiais = 0; |
| 23 | + this.qtdeVarArificiais = 0; |
| 24 | + this.qtdeIteracoes = 0; |
23 | 25 | this.problema = problema;
|
24 |
| - nIteracoes = 0; |
25 | 26 | if (problema.getQtdeRestricoes() > problema.getQtdeVariaveis() * FATOR_TOLERANCIA) {
|
26 |
| - //this.problema = problema.gerarDual(); |
| 27 | + this.problema = problema.gerarDual(); |
27 | 28 | }
|
28 | 29 | this.simplex = this.problema;
|
29 | 30 | //Etapa 01: construção da solução inicial viável
|
30 | 31 | this.insertVariaveisArtificiais();
|
31 | 32 | this.insereElementosDaMatriz();
|
32 | 33 | this.insereBase();
|
| 34 | + this.insereCoeficientesDaFuncaoObjetivo(); |
| 35 | + //Etapa 02: calcular a matriz inversa na iteração i |
| 36 | + for (int i = 0; i < simplex.getNUMERO_MAXIMO_ITERACOES(); i++) { |
| 37 | + |
| 38 | + } |
33 | 39 | }
|
34 | 40 |
|
35 | 41 | //Etapa 01: construção da solução inicial viável
|
@@ -72,19 +78,56 @@ private void insereElementosDaMatriz() {
|
72 | 78 |
|
73 | 79 | private void insereBase() {
|
74 | 80 | //guardando os índices das variáveis da base inicial
|
75 |
| - for (int i = 0; i < simplex.getQtdeVariaveis() - qtdeVarArificiais; i++) { |
| 81 | + int qtdeBase = simplex.getQtdeVariaveis() - qtdeVarArificiais; |
| 82 | + base = new int[qtdeBase]; |
| 83 | + for (int i = 0; i < qtdeBase; i++) { |
76 | 84 | base[i] = qtdeVarArificiais + i - 1;
|
77 | 85 | }
|
78 | 86 | }
|
79 | 87 |
|
80 | 88 | private void insereCoeficientesDaFuncaoObjetivo() {
|
| 89 | + //guardando os valores dos coeficientes da funcao objetivo inicial |
| 90 | + funcaoObjetivo = new double[simplex.getQtdeVariaveis()]; |
81 | 91 | for (int i = 0; i < simplex.getQtdeVariaveis(); i++) {
|
82 |
| - |
| 92 | + funcaoObjetivo[i] = simplex.getFuncaoObjetivo()[i]; |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + private void insereLadoDireiro() { |
| 97 | + //guardando os valores do lado direito iniciais |
| 98 | + ladoDireito = new double[base.length]; |
| 99 | + for (int i = 0; i < base.length; i++) { |
| 100 | + ladoDireito[i] = simplex.getQtdeVariaveis(); |
83 | 101 | }
|
84 | 102 | }
|
85 | 103 |
|
86 |
| - //Etapa 02: calcular a inversa de B utilizando decomposição |
| 104 | + //Etapa 02: calcular a inversa na iteracao i |
87 | 105 | private void calculaInversa() {
|
| 106 | + //encontra valor mais negativo |
| 107 | + boolean hasNegativo = false; |
| 108 | + double menor = 0.0; |
| 109 | + int maisNegativo = -1; |
| 110 | + for (int i = 0; i < simplex.getQtdeVariaveis(); i++) { |
| 111 | + if (funcaoObjetivo[i] < 0.0) { |
| 112 | + hasNegativo = true; |
| 113 | + menor = funcaoObjetivo[i]; |
| 114 | + maisNegativo = i; |
| 115 | + } |
| 116 | + } |
| 117 | + if (!hasNegativo) { //se não houver valores negativos, chegou a solução ótima |
| 118 | + printSucesso(); |
| 119 | + } else { |
| 120 | + //terminar |
| 121 | + } |
| 122 | + } |
| 123 | + |
| 124 | + private void printSucesso() { |
| 125 | + System.out.println("================================================================="); |
| 126 | + System.out.println("Solução viável encontrada após " + qtdeIteracoes + " iterações.\n"); |
| 127 | + int variaveisDoProblema = simplex.getQtdeVariaveis() - qtdeVarArificiais; |
| 128 | + for (int i = 0; i < variaveisDoProblema; i++) { |
| 129 | + System.out.print("X" + i + ": " + ladoDireito[i] + "\n"); |
| 130 | + } |
88 | 131 | }
|
89 | 132 |
|
90 | 133 | private void insertFolga(double coeficiente, int i) {
|
|
0 commit comments