0

I'm trying to write a simple simplex solver for linear optimization problems, but I'm having trouble getting it working. Every time I run it I get a vector subscript out of range (which is quite easy to find), but I think that its probably a core issue somewhere else in my impl.

Here is my simplex solver impl:

bool pivot(vector<vector<double>>& tableau, int row, int col) {
    int n = tableau.size();
    int m = tableau[0].size();
    double pivot_element = tableau[row][col];
    if (pivot_element == 0) return false;
    for (int j = 0; j < m; j++) {
        tableau[row][j] /= pivot_element;
    }
    for (int i = 0; i < n; i++) {
        if (i != row) {
            double ratio = tableau[i][col];
            for (int j = 0; j < m; j++) {
                tableau[i][j] -= ratio * tableau[row][j];
            }
        }
    }
    return true;
}

int simplex(vector<vector<double>>& tableau, vector<double>& basic, vector<double>& non_basic) {
    int n = tableau.size() - 1;
    int m = tableau[0].size() - 1;
    while (true) {
        int col = -1;
        for (int j = 0; j < m; j++) {
            if (tableau[n][j] > 0) {
                col = j;
                break;
            }
        }
        if (col == -1) break;
        int row = -1;
        double min_ratio = numeric_limits<double>::infinity();
        for (int i = 0; i < n; i++) {
            if (tableau[i][col] > 0) {
                double ratio = tableau[i][m] / tableau[i][col];
                if (ratio < min_ratio) {
                    row = i;
                    min_ratio = ratio;
                }
            }
        }
        if (row == -1) return -1;
        if (!pivot(tableau, row, col)) return -1;
        double temp = basic[row];
        basic[row] = non_basic[col];
        non_basic[col] = temp;
    }
    return 1;
}
GalBrot
  • 35
  • 5

0 Answers0