0

I find topic about Simplex method here Alter Simplex Algorithm to Minimize on objective function NOT maximize But answer didn`t help. When I change from

double[] variables = {  13.0,  23.0 };

to

double[] variables = { -13.0, -23.0 };

The program dont calculate(no Exception), it print first step and that`s all. Could somebody help me with alter simplex method from maximize to minimize?

code:

import java.util.*;

public class Simplex
{
private static final double EPSILON = 1.0E-10;
private double[][] tableaux;
private int numOfConstraints;
private int numOfVariables;

private int[] basis;
/**
 * Constructor for objects of class Simplex
 */
public Simplex()
{


    double[][] thisTableaux = {
        {  5.0, 15.0 },
        {  4.0,  4.0 },
        { 35.0, 20.0 },
    };

    double[] constraints = { 480.0, 160.0, 1190.0 };

    double[] variables = {  -13.0,  -23.0 };

    numOfConstraints = constraints.length;
    numOfVariables = variables.length;

    tableaux = new double[numOfConstraints+1][numOfVariables+numOfConstraints+1];

    //adds all elements from thisTableaux to tableaux
    for(int i=0; i < numOfConstraints; i++)
    {
        for(int j=0; j < numOfVariables; j++)
        {
            tableaux[i][j] = thisTableaux[i][j];
        }
    } 


    //adds a slack variable for each variable there is and sets it to 1.0
    for(int i=0; i < numOfConstraints; i++)
    {
        tableaux[i][numOfVariables+i] = 1.0;
    }


    //adds variables into the second [] of tableux
    for(int j=0; j < numOfVariables; j++)
    {
        tableaux[numOfConstraints][j] = variables[j];
    }



    //adds constraints to first [] of tableaux
    for(int k=0; k < numOfConstraints; k++)
    {
        tableaux[k][numOfConstraints+numOfVariables] = constraints[k];
    }



    basis = new int[numOfConstraints];

    for(int i=0; i < numOfConstraints; i++)
    {
        basis[i] = numOfVariables + i;
    }

    show();

    optimise();

    assert check(thisTableaux, constraints, variables);


}

public void optimise() {
    while(true) {

        int q = findLowestNonBasicCol();

        if(q == -1) {
            break;
        }

        int p = getPivotRow(q);
        if(p == -1) throw new ArithmeticException("Linear Program Unbounded");

        pivot(p, q);

        basis[p] = q;
    }

}

public int findLowestNonBasicCol() {

    for(int i=0; i < numOfConstraints + numOfVariables; i++)
    {
        if(tableaux[numOfConstraints][i] > 0) {


            return i;
        }
    }

    return -1;


}

public int findIndexOfLowestNonBasicCol() {

    int q = 0;
    for(int i=1; i < numOfConstraints + numOfVariables; i++)
    {
        if(tableaux[numOfConstraints][i] > tableaux[numOfConstraints][q]) {
            q = i;
        }
    }

    if(tableaux[numOfConstraints][q] <= 0) {
        return -1;
    }

    else {
        return q;
    }
}

/**
 * Finds row p which will be the pivot row using the minimum ratio rule.
 * -1 if there is no pivot row
 */
public int getPivotRow(int q) {

    int p = -1;

    for(int i=0; i < numOfConstraints; i++) {

        if (tableaux[i][q] <=0) {
            continue;
        }

        else if (p == -1) {
            p = i;
        }

        else if((tableaux[i][numOfConstraints+numOfVariables] / tableaux[i][q] < tableaux[p][numOfConstraints+numOfVariables] / tableaux[p][q])) {
            p = i;
        }
    }
user3650408
  • 139
  • 1
  • 12
  • 2
    where is your code ? and you just want to multiple them with `-1` ? – jmj May 18 '14 at 19:01
  • 4
    Welcome to StackOverflow. You have to be aware that we cannot read your mind. You need to include enough information so we can reproduce the problem you are having and you should provide the answer you expect. When you say `dont calculate` you have to say what it does do. Also I suggest you try debugging your programs as this is often faster than having to explain what your problem is in enough detail. – Peter Lawrey May 18 '14 at 19:03
  • after debugging I find that change form (13, 23) to ( - 13, -23) not help. This problem is linked with method findLowestNonBasicCol(), when exist check for positive number if (tableaux[numOfConstraints][i] > 0) – user3650408 May 18 '14 at 19:49

2 Answers2

1

You might want to look into the Dual Simplex Method (or Duality Theory). If the standard form of the primal problem is:

Maximize = 13*X1 + 23*X2;

with constraints:

5*X1    +   15*X2   <= 480;
4*X1    +   4*X2    <= 160;
35*X1   +   20*X2   <= 1190;
X1 >= 0;
X2 >= 0;

Then the dual problem is:

Minimize = 480*Y1 + 160*Y2 + 1190*Y3;

with constraints:

5*Y1    +   4*Y2    +   35*Y3   >= 13;
15*Y1 +     4*Y2    +   20*Y3   >= 23;
Y1 >= 0;
Y2 >= 0;
Y3 >= 0;

I tested both of these problems in LINGO and get the same answer for both (Z = 800, X1 = 12, X2 = 28 -- Y1 = 1, Y2 = 2, Y3 = 0).

JasonArg123
  • 188
  • 1
  • 1
  • 14
-1

I guess the program did nothing because the initial solution is the optimal solution.

Maurice Perry
  • 32,610
  • 9
  • 70
  • 97