Skip to content

Commit cf44c47

Browse files
JeanHFerreiraJeanHFerreira
JeanHFerreira
authored and
JeanHFerreira
committed
Desenvolvimento variaveis de folga restrição <=
1 parent 6924e07 commit cf44c47

14 files changed

+131
-73
lines changed

SPX

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 6924e0778d5c5d3e73a4eb437d33d78846ae41e4

build/built-jar.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Wed, 09 Dec 2015 10:04:05 -0200
1+
#Thu, 10 Dec 2015 00:44:10 -0200
22

33

4-
/home/gusmao/NetBeansProjects/SPX=
4+
C\:\\Users\\Jean_H_xD\\workspace\\LSR=

build/classes/Loader.class

0 Bytes
Binary file not shown.

build/classes/Matriz.class

0 Bytes
Binary file not shown.

build/classes/PPL.class

388 Bytes
Binary file not shown.

build/classes/SimplexSolver.class

1.46 KB
Binary file not shown.

build/classes/Solver.class

60 Bytes
Binary file not shown.

dist/README.TXT

Lines changed: 0 additions & 32 deletions
This file was deleted.

dist/SPX.jar

-17.8 KB
Binary file not shown.

dist/lib/Jama-1.0.2.jar

-32 KB
Binary file not shown.

nbproject/private/private.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ do.depend=false
33
do.jar=true
44
javac.debug=true
55
javadoc.preview=true
6-
user.properties.file=/home/gusmao/.netbeans/8.0.2/build.properties
6+
user.properties.file=C:\\Users\\Jean_H_xD\\AppData\\Roaming\\NetBeans\\8.0\\build.properties

src/PPL.java

Lines changed: 60 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
32
/**
43
* Problema de Programação Linear
54
*
@@ -10,11 +9,11 @@ public class PPL {
109
private final double COEFICIENTE_INVALIDO = Double.MAX_VALUE;
1110
private final int NUMERO_MAXIMO_ITERACOES;
1211

13-
private final int MAIOR = 2;
14-
private final int MAIOR_IGUAL = 1;
15-
private final int IGUAL = 0;
16-
private final int MENOR_IGUAL = -1;
17-
private final int MENOR = -2;
12+
public static final int MAIOR = 2;
13+
public static final int MAIOR_IGUAL = 1;
14+
public static final int IGUAL = 0;
15+
public static final int MENOR_IGUAL = -1;
16+
public static final int MENOR = -2;
1817

1918
private boolean maximizacao; //é um problema de maximização?
2019
private int qtdeRestricoes; //quantidade de restrições deste problema
@@ -41,7 +40,11 @@ public class PPL {
4140
* @param naoNegatividadeMaiorIgual
4241
* @param naoNegatividadeReais
4342
*/
44-
public PPL(boolean maximizacao, int qtdeRestricoes, int qtdeVariaveis, double[] funcaoObjetivo, double[][] restricoes, int[] sinalRestricoes, int[] naoNegatividadeMenorIgual, int[] naoNegatividadeMaiorIgual, int[] naoNegatividadeReais) {
43+
public PPL(boolean maximizacao, int qtdeRestricoes,
44+
int qtdeVariaveis, double[] funcaoObjetivo,
45+
double[][] restricoes, int[] sinalRestricoes,
46+
int[] naoNegatividadeMenorIgual, int[] naoNegatividadeMaiorIgual,
47+
int[] naoNegatividadeReais) {
4548
this.maximizacao = maximizacao;
4649
this.qtdeRestricoes = qtdeRestricoes;
4750
this.qtdeVariaveis = qtdeVariaveis;
@@ -65,7 +68,8 @@ public PPL(boolean maximizacao, int qtdeRestricoes, int qtdeVariaveis, double[]
6568
* @param restricoes
6669
* @param naoNegatividade
6770
*/
68-
public PPL(String tipo, int qtdeRestricoes, int qtdeVariaveis, String funcaoObjetivo, String[] restricoes, String[] naoNegatividade) {
71+
public PPL(String tipo, int qtdeRestricoes, int qtdeVariaveis,
72+
String funcaoObjetivo, String[] restricoes, String[] naoNegatividade) {
6973
if (tipo.equalsIgnoreCase("max")) { //Se for Max, set True.. se não, continue false
7074
this.maximizacao = true;
7175
}
@@ -104,14 +108,14 @@ public void print() {
104108
System.out.print(" " + restricoes[i][j] + "X" + (j + 1));
105109
}
106110
}
107-
switch (sinalRestricoes[i]) {
108-
case -1:
111+
switch (getSinalRestricoes()[i]) {
112+
case PPL.MENOR_IGUAL:
109113
System.out.print(" <= " + restricoes[i][j]);
110114
break;
111-
case 0:
115+
case PPL.MAIOR_IGUAL:
112116
System.out.print(" >= " + restricoes[i][j]);
113117
break;
114-
case 1:
118+
case PPL.IGUAL:
115119
System.out.print(" = " + restricoes[i][j]);
116120
break;
117121
}
@@ -153,7 +157,7 @@ public void print() {
153157

154158
private void insertRestricoes(String[] restricoes) {
155159
this.restricoes = new double[qtdeRestricoes][qtdeVariaveis + 1];
156-
this.sinalRestricoes = new int[qtdeRestricoes];
160+
this.setSinalRestricoes(new int[qtdeRestricoes]);
157161
String atual;
158162
String numero;
159163
char c;
@@ -185,13 +189,13 @@ private void insertRestricoes(String[] restricoes) {
185189
} else if (numero.charAt(0) == '<' || numero.charAt(0) == '>' || numero.charAt(0) == '=') {
186190
switch (numero.charAt(0)) {
187191
case '<': //<=
188-
this.sinalRestricoes[i] = this.MENOR_IGUAL;
192+
this.getSinalRestricoes()[i] = this.getMENOR_IGUAL();
189193
break;
190194
case '>':
191-
this.sinalRestricoes[i] = this.MAIOR_IGUAL; //>=
195+
this.getSinalRestricoes()[i] = this.getMAIOR_IGUAL(); //>=
192196
break;
193197
case '=':
194-
this.sinalRestricoes[i] = this.IGUAL; //=
198+
this.getSinalRestricoes()[i] = this.getIGUAL(); //=
195199
break;
196200
}
197201
numero = "";
@@ -310,42 +314,42 @@ public PPL gerarDual() {
310314
for (int i = 0; i < this.qtdeVariaveis; i++) {
311315
if (!isMaximizacao()) { //PRIMAL DE MAXIMIZACAO
312316
if (this.naoNegatividadeMenorIgual[i] == 1) {
313-
sinalRestricoesDual[i] = this.MAIOR_IGUAL;
317+
sinalRestricoesDual[i] = this.getMAIOR_IGUAL();
314318
}
315319
if (this.naoNegatividadeMaiorIgual[i] == 1) {
316-
sinalRestricoesDual[i] = this.MENOR_IGUAL;
320+
sinalRestricoesDual[i] = this.getMENOR_IGUAL();
317321
}
318322
if (this.naoNegatividadeReais[i] == 1) {
319-
sinalRestricoesDual[i] = this.IGUAL;
323+
sinalRestricoesDual[i] = this.getIGUAL();
320324
}
321325
} else { //PRIMAL DE MINIMIZACAO
322326
if (this.naoNegatividadeMenorIgual[i] == 1) {
323-
sinalRestricoesDual[i] = this.MENOR_IGUAL;
327+
sinalRestricoesDual[i] = this.getMENOR_IGUAL();
324328
}
325329
if (this.naoNegatividadeMaiorIgual[i] == 1) {
326-
sinalRestricoesDual[i] = this.MAIOR_IGUAL;
330+
sinalRestricoesDual[i] = this.getMAIOR_IGUAL();
327331
}
328332
if (this.naoNegatividadeReais[i] == 1) {
329-
sinalRestricoesDual[i] = this.IGUAL;
333+
sinalRestricoesDual[i] = this.getIGUAL();
330334
}
331335
}
332336
}
333337
//add nao negatividade
334338
for (int i = 0; i < this.qtdeRestricoes; i++) {
335339
if (!isMaximizacao()) { //PRIMAL DE MAXIMIZACAO
336-
switch (this.sinalRestricoes[i]) {
337-
case MENOR_IGUAL:
340+
switch (this.getSinalRestricoes()[i]) {
341+
case PPL.MENOR_IGUAL:
338342
naoNegatividadeMenorIgualDual[i] = 1;
339343
break;
340-
case MAIOR_IGUAL:
344+
case PPL.MAIOR_IGUAL:
341345
naoNegatividadeMaiorIgualDual[i] = 1;
342346
break;
343-
case IGUAL:
347+
case PPL.IGUAL:
344348
naoNegatividadeReaisDual[i] = 1;
345349
break;
346350
}
347351
} else { //PRIMAL DE MINIMIZACAO
348-
switch (this.sinalRestricoes[i]) {
352+
switch (this.getSinalRestricoes()[i]) {
349353
case MENOR_IGUAL:
350354
naoNegatividadeMaiorIgualDual[i] = 1;
351355
break;
@@ -383,11 +387,7 @@ public void setMaximizacao(boolean maximizacao) {
383387
* change the state of maximizacao
384388
*/
385389
public void changeMaximizacao() {
386-
if (isMaximizacao()) {
387-
this.maximizacao = false;
388-
} else {
389-
this.maximizacao = true;
390-
}
390+
this.maximizacao = !isMaximizacao();
391391
}
392392

393393
/**
@@ -495,4 +495,32 @@ public int getNUMERO_MAXIMO_ITERACOES() {
495495
return NUMERO_MAXIMO_ITERACOES;
496496
}
497497

498+
public int[] getSinalRestricoes() {
499+
return sinalRestricoes;
500+
}
501+
502+
public void setSinalRestricoes(int[] sinalRestricoes) {
503+
this.sinalRestricoes = sinalRestricoes;
504+
}
505+
506+
public int getMAIOR() {
507+
return MAIOR;
508+
}
509+
510+
public int getMAIOR_IGUAL() {
511+
return MAIOR_IGUAL;
512+
}
513+
514+
public int getIGUAL() {
515+
return IGUAL;
516+
}
517+
518+
public int getMENOR_IGUAL() {
519+
return MENOR_IGUAL;
520+
}
521+
522+
public int getMENOR() {
523+
return MENOR;
524+
}
525+
498526
}

src/SimplexSolver.java

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,77 @@ public class SimplexSolver {
1313

1414
public SimplexSolver(PPL problema) {
1515
this.problema = problema;
16-
if (problema.getQtdeRestricoes() > problema.getQtdeVariaveis() * FATOR_TOLERANCIA) {
17-
this.problema = problema.gerarDual();
18-
}
16+
/*if (problema.getQtdeRestricoes() > problema.getQtdeVariaveis() * FATOR_TOLERANCIA) {
17+
this.problema = problema.gerarDual();
18+
}*/
1919

2020
}
2121

22-
private void insertVariaveisArtificiais() {
22+
public void insertVariaveisArtificiais() {
2323
//Se houver restrição <= , precisa de M
2424
//Verificando se há restrições do tipo <=
2525
for (int i = 0; i < this.problema.getQtdeRestricoes(); i++) {
26-
26+
//Garantia que o lado direito é positivo
27+
if (this.problema.getRestricoes()[i][this.problema.getQtdeVariaveis()] < 0.0) {
28+
for (int j = 0; j <= this.problema.getQtdeVariaveis(); j++) {
29+
this.problema.getRestricoes()[i][j] *= -1; // Troca osinal das restrições
30+
}
31+
this.problema.getSinalRestricoes()[i] *= -1; //Troca a direção do sinal
32+
}
33+
switch (this.problema.getSinalRestricoes()[i]) {
34+
case PPL.MAIOR_IGUAL:
35+
break;
36+
case PPL.MENOR_IGUAL:
37+
int novaQtdRestricoes = problema.getQtdeRestricoes();
38+
int novaQtdVariaveis = problema.getQtdeVariaveis() + 1;
39+
double[][] novasRestricoes = new double[novaQtdRestricoes][novaQtdVariaveis + 1];
40+
for (int k = 0; k < novaQtdRestricoes; k++) {
41+
for (int l = 0; l < novaQtdVariaveis - 1; l++) {
42+
//Mantém as restrições
43+
//System.out.println("["+k+"] ["+l+"] "+problema.getRestricoes()[k][l]);
44+
novasRestricoes[k][l] = problema.getRestricoes()[k][l];
45+
}
46+
//Seta o valor da variável de folga
47+
novasRestricoes[i][novaQtdVariaveis-1]=1;
48+
//Move o lado direito para a direita
49+
novasRestricoes[k][novaQtdVariaveis] = problema.getRestricoes()[k][problema.getQtdeVariaveis()];
50+
}
51+
problema.getSinalRestricoes()[i] = PPL.IGUAL;
52+
//Copia a função objetivo + nova variável de foga com coeficiente 0
53+
double[] novaFuncaoObjetivo = new double[novaQtdVariaveis];
54+
for (int k = 0; k < novaQtdVariaveis - 1; k++) {
55+
novaFuncaoObjetivo[k] = problema.getFuncaoObjetivo()[k];
56+
}
57+
novaFuncaoObjetivo[novaQtdVariaveis - 1] = 0;
58+
//Copia a restrição de não negatividade
59+
int[] novaNaoNegatividadeMenorIgual = new int[novaQtdVariaveis];
60+
for (int k = 0; k < novaQtdVariaveis - 1; k++) {
61+
novaNaoNegatividadeMenorIgual[k] = problema.getNaoNegatividadeMenor()[k];
62+
}
63+
novaNaoNegatividadeMenorIgual[novaQtdVariaveis - 1] = 0;
64+
65+
int[] novaNaoNegatividadeMaiorIgual = new int[novaQtdVariaveis];
66+
for (int k = 0; k < novaQtdVariaveis - 1; k++) {
67+
novaNaoNegatividadeMaiorIgual[k] = problema.getNaoNegatividadeMaior()[k];
68+
}
69+
novaNaoNegatividadeMaiorIgual[novaQtdVariaveis - 1] = 1;
70+
71+
int[] novaNaoNegatividadeReais = new int[novaQtdVariaveis];
72+
for (int k = 0; k < novaQtdVariaveis - 1; k++) {
73+
novaNaoNegatividadeReais[k] = problema.getNaoNegatividadeIgual()[k];
74+
}
75+
novaNaoNegatividadeReais[novaQtdVariaveis - 1] = 0;
76+
problema.setRestricoes(novasRestricoes);
77+
problema.setFuncaoObjetivo(novaFuncaoObjetivo);
78+
problema.setNaoNegatividadeMaior(novaNaoNegatividadeMaiorIgual);
79+
problema.setNaoNegatividadeIgual(novaNaoNegatividadeReais);
80+
problema.setNaoNegatividadeMenor(novaNaoNegatividadeMenorIgual);
81+
problema.setQtdeRestricoes(novaQtdRestricoes);
82+
problema.setQtdeVariaveis(novaQtdVariaveis);
83+
break;
84+
case PPL.IGUAL:
85+
break;
86+
}
2787
}
2888
}
2989

src/Solver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ public static void main(String[] args) {
7474
instancia = new PPL(tipo, qtdeRestricoes, qtdeVariaveis, funcaoObjetivo, restricoes, naoNegatividade);
7575
SimplexSolver simplexSolver = new SimplexSolver(instancia);
7676
simplexSolver.getProblema().print();
77-
77+
simplexSolver.insertVariaveisArtificiais();
78+
simplexSolver.getProblema().print();
7879
// System.out.println("\nRealizando DUAL\n");
7980
// instancia = instancia.gerarDual();
8081
// instancia.print();

0 commit comments

Comments
 (0)