|
| 1 | +//Escrevendo o script com valores fixos para facilitar |
| 2 | + |
| 3 | +//1º passo -> Escrever as variaveis da funcao objetiva invertidas |
| 4 | + |
| 5 | +var z = [ |
| 6 | + {var: 'x1', val: -10, col: 'z'}, |
| 7 | + {var: 'x2', val: -20, col: 'z'}, |
| 8 | + {var: 'x3', val: -30, col: 'z'}, |
| 9 | + {var: 'f1', val: 0, col: 'z'}, |
| 10 | + {var: 'f2', val: 0, col: 'z'}, |
| 11 | + {var: 'f3', val: 0, col: 'z'}, |
| 12 | + {var: 'f4', val: 0, col: 'z'}, |
| 13 | + {var: 'base', val: 0, col: 'z'} |
| 14 | +] |
| 15 | + |
| 16 | +//2º passo -> Definir as restricoes e transformar desigualdades em igualdades acrescentando variáveis de folga. |
| 17 | + |
| 18 | +var sa1 = [ |
| 19 | + {var: 'x1', val: 2, col: 'f1'}, |
| 20 | + {var: 'x2', val: 2, col: 'f1'}, |
| 21 | + {var: 'x3', val: 4, col: 'f1'}, |
| 22 | + {var: 'f1', val: 1, col: 'f1'}, |
| 23 | + {var: 'f2', val: 0, col: 'f1'}, |
| 24 | + {var: 'f3', val: 0, col: 'f1'}, |
| 25 | + {var: 'f4', val: 0, col: 'f1'}, |
| 26 | + {var: 'base', val: 300, col: 'f1'} |
| 27 | +] |
| 28 | + |
| 29 | +var sa2 = [ |
| 30 | + {var: 'x1', val: 0, col: 'f2'}, |
| 31 | + {var: 'x2', val: 4, col: 'f2'}, |
| 32 | + {var: 'x3', val: 3, col: 'f2'}, |
| 33 | + {var: 'f1', val: 0, col: 'f2'}, |
| 34 | + {var: 'f2', val: 1, col: 'f2'}, |
| 35 | + {var: 'f3', val: 0, col: 'f2'}, |
| 36 | + {var: 'f4', val: 0, col: 'f2'}, |
| 37 | + {var: 'base', val: 200, col: 'f2'} |
| 38 | +] |
| 39 | + |
| 40 | +var sa3 = [ |
| 41 | + {var: 'x1', val: 1, col: 'f3'}, |
| 42 | + {var: 'x2', val: 0, col: 'f3'}, |
| 43 | + {var: 'x3', val: 0, col: 'f3'}, |
| 44 | + {var: 'f1', val: 0, col: 'f3'}, |
| 45 | + {var: 'f2', val: 0, col: 'f3'}, |
| 46 | + {var: 'f3', val: 1, col: 'f3'}, |
| 47 | + {var: 'f4', val: 0, col: 'f3'}, |
| 48 | + {var: 'base', val: 20, col: 'f3'} |
| 49 | +] |
| 50 | + |
| 51 | +var sa4 = [ |
| 52 | + {var: 'x1', val: 4, col: 'f4'}, |
| 53 | + {var: 'x2', val: 3, col: 'f4'}, |
| 54 | + {var: 'x3', val: 0, col: 'f4'}, |
| 55 | + {var: 'f1', val: 0, col: 'f4'}, |
| 56 | + {var: 'f2', val: 0, col: 'f4'}, |
| 57 | + {var: 'f3', val: 0, col: 'f4'}, |
| 58 | + {var: 'f4', val: 1, col: 'f4'}, |
| 59 | + {var: 'base', val: 50, col: 'f4'} |
| 60 | +] |
| 61 | + |
| 62 | +//3º passo -> Preencher a tabela SIMPLEX com os dados das equacoes |
| 63 | + |
| 64 | +var simplex = [ |
| 65 | +{name: 'z', data: z}, |
| 66 | +{name: 'f1', data: sa1}, |
| 67 | +{name: 'f2', data: sa2}, |
| 68 | +{name: 'f3', data: sa3}, |
| 69 | +{name: 'f4', data: sa4} |
| 70 | +] |
| 71 | + |
| 72 | +for(var i = 0; i < simplex.length; i++) { |
| 73 | + //console.log(simplex[i]); |
| 74 | +} |
| 75 | + |
| 76 | +//4º passo -> Escolher a coluna pivô: Olhar na linha Z qual eh o numero + negativo |
| 77 | + |
| 78 | +var valuesZ = z.map((item) => {return item.val}) |
| 79 | + |
| 80 | +var minZ = Math.min(...valuesZ); |
| 81 | + |
| 82 | +var minElement = z.filter((item) => {return item.val === minZ}) |
| 83 | + |
| 84 | +//posicao da coluna pivo (usarei mais tarde para pegar o numero pivo) |
| 85 | +var posCP = valuesZ.indexOf(minZ) |
| 86 | + |
| 87 | +//variavel que vai entrar na base |
| 88 | +var varIn = minElement[0].var; |
| 89 | + |
| 90 | + |
| 91 | +//5º passo -> Escolher a linha pivô: Menor resultado para base/coluna pivô (com excessao da linha z) |
| 92 | + |
| 93 | +var results = []; |
| 94 | + |
| 95 | +//comecando no 1 porque a linha Z nao conta |
| 96 | +for(var i = 1; i < simplex.length; i++) { |
| 97 | + let dataCP = simplex[i].data.filter((item) => {return item.var === varIn}) |
| 98 | + let dataBASE = simplex[i].data.filter((item) => {return item.var === 'base'}) |
| 99 | + |
| 100 | + if(dataBASE[0].val != 0 && dataCP[0].val != 0){ |
| 101 | + results.push({val:dataBASE[0].val / dataCP[0].val, col: simplex[i].name}); |
| 102 | + } |
| 103 | + else{ |
| 104 | + results.push({val: 0, col: simplex[i].name}) |
| 105 | + } |
| 106 | +} |
| 107 | + |
| 108 | +//console.log(results) |
| 109 | + |
| 110 | +var removeNegatives = results.filter((item) => {return item.val > 0}) |
| 111 | + |
| 112 | +var onlyNumbers = removeNegatives.map((item) => {return item.val}) |
| 113 | +var minRow = Math.min(...onlyNumbers) |
| 114 | + |
| 115 | +var outElement = removeNegatives.filter((item) => {return item.val === minRow}) |
| 116 | + |
| 117 | +var varOut = outElement[0].col; |
| 118 | + |
| 119 | +console.log(varIn) |
| 120 | +console.log(varOut) |
| 121 | + |
| 122 | +//Dividir linha pivo pelo numero pivo e o resultado vai para nova var que vai entrar |
| 123 | + |
| 124 | +var varEntrada = []; |
| 125 | + |
| 126 | +var linhaPivo = simplex.filter((item) => {return item.name === varOut}); |
| 127 | +linhaPivo = linhaPivo[0].data; |
| 128 | + |
| 129 | +//pegando a interscecao da linha pivo com coluna pivo |
| 130 | +var pivo = linhaPivo[posCP].val; |
| 131 | + |
| 132 | +for(var i = 0; i < linhaPivo.length; i++) { |
| 133 | + let newValue = 0; |
| 134 | + if(linhaPivo[i].val != 0 && pivo != 0) { |
| 135 | + newValue = (linhaPivo[i].val / pivo).toFixed(2); |
| 136 | + } |
| 137 | + varEntrada.push({var: linhaPivo[i].var, val: parseFloat(newValue), col: varIn}) |
| 138 | +} |
| 139 | + |
| 140 | +//console.log(varEntrada); |
| 141 | + |
| 142 | +//Passo 7 -> Para cada nova linha preenchida, pegar linha antiga e subtrair o coeficiente da coluna pivo multiplicando pela nova linha pivo. |
| 143 | +// -(coeficiente da linha) x coeficiente da coluna pivo - valor a ser substituido |
| 144 | + |
| 145 | +var numbersEntrada = varEntrada.map((item) => {return item.val}) |
| 146 | + |
| 147 | +for(var i = 0; i < simplex.length; i++) { |
| 148 | + if(simplex[i].name != varOut) { |
| 149 | + var numbers = simplex[i].data.map((item) => {return item.val}) |
| 150 | + |
| 151 | + //pegando coeficiente linha e invertendo o sinal |
| 152 | + var coeficienteLinha = 0; |
| 153 | + if(numbers[posCP] != 0) { |
| 154 | + coeficienteLinha = numbers[posCP] * -1; |
| 155 | + } |
| 156 | + |
| 157 | + for(j = 0; j < numbersEntrada.length; j++) { |
| 158 | + |
| 159 | + if(coeficienteLinha != 0 && numbersEntrada[j] != 0){ |
| 160 | + var valueLinha = Math.round((coeficienteLinha * numbersEntrada[j])); |
| 161 | + } |
| 162 | + else { |
| 163 | + var valueLinha = 0; |
| 164 | + } |
| 165 | + |
| 166 | + if(numbers[j] < 0) { |
| 167 | + //valueLinha += numbers[j] |
| 168 | + } |
| 169 | + else { |
| 170 | + //valueLinha -= numbers[j] |
| 171 | + } |
| 172 | + |
| 173 | + console.log(valueLinha) |
| 174 | + } |
| 175 | + |
| 176 | + console.log("------") |
| 177 | + } |
| 178 | +} |
| 179 | + |
0 commit comments