Estoy haciendo un algorithmo simplex siguiendo el libro "introduction to algorithms" de cormen y ya lo he acabado. El problema es que no me da el resultado correcto y creo que es por que he interpretado el pseudocodigo mal. Os pongo lo que he escrito junto con el pseudo a ver si le podeis echar un ojo, os lo agradeceria por que me estoy volviendo loco.
Gracias!!
Código:
pseudocodigo:void pivot(vector<vector<double>> &A, vector<double> &b, vector<double> &c, vector<double> &N, vector<double> &B, int l, int &v, int e) { vector<vector<double>> Ainv(A.size(), vector<double>(A.size())); vector<double> binv(b.size()), cinv(c.size()); binv[e] = b[l] / A[l][e]; for (int j = 0; j<N.size(); j++) { if (j != e) Ainv[e][j] = A[l][j] / A[l][e]; } Ainv[e][l] = 1 / A[l][e]; for (int i = 0; i<B.size(); i++) { if (i != l) { binv[i] = b[i] - A[i][e] * binv[e]; for (int j = 0; j<N.size(); j++) { if (j != e) { Ainv[i][j] = A[i][j] - A[i][e] * Ainv[e][j]; } } Ainv[i][l] = -A[i][e] * Ainv[e][l]; } } v = v + c[e] * binv[e]; for (int j = 0; j<N.size(); j++) { if (j != e) cinv[j] = c[j] - c[e] * Ainv[e][j]; } cinv[l] = -c[e] * Ainv[e][l]; for (int j = 0; j<N.size(); j++) { N[j] = N[j]; B[j] = B[j]; if (j == e )N[j] = l; if (j == l )B[j] = e; } A = Ainv; b = binv; c = cinv; }
Código:
pseudocodigovector<double> simplex(vector<vector<double>> &A, vector<double> &b, vector<double> &c) { int V, m, n, minval, l = 0; parser(A, b, c, m, n); vector<double> B(m), K(n), x(m + 1), N(n); if (!initialize_simplex(b, N, B, V)) { cout << "Negative value on Vector b"; x.clear(); return x; } for (int i = 0; i<N.size(); i++) { if (c[i]>0) { for (int j = 0; j<B.size(); j++) { if (A[j][i]>0) { K[j] = b[j] / A[j][i]; } else K[j] = LONG_MAX; if (K[j] != LONG_MAX) { l = j; } } if (K[l] == LONG_MAX)cout << "Error"<<endl; else { pivot(A, b, c, N, B, l, V, i); } } } for (int i = 1; i <= n; i++) { if (i <= B.size())x[i] = b[i]; else x[i] = 0; } x[x.size() - 1] = V; return x; }