
11/01/2016, 05:37
|
| | Fecha de Ingreso: agosto-2011
Mensajes: 13
Antigüedad: 13 años, 7 meses Puntos: 0 | |
Problema pasando pseudocodigo a c++ Buenos dias,
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:
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;
}
pseudocodigo:
Código:
vector<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;
}
pseudocodigo |