Sie sind auf Seite 1von 2

Introduccin.

Los programas matemticos implican a un conjunto de variables relacionadas por un conjunto de ecuaciones matemticas (restricciones) y una funcin objetivo que contiene a las variables y que debe maximizarse respetando las restricciones dadas, de aqu que si todas las ecuaciones en juego son simples combinaciones lineales de las variables, se tenga un programa lineal. Para resolver este tipo de ecuaciones, o programas lineales se emplea el mtodo simplex el cual consiste en una regin convexa definida por intersecciones de semiplanos, este mtodo consiste en agregar variables de holgura a cada un de las ecuaciones lineales con la finalidad de convertirlas en igualdades, luego se hace una tabla con los coeficientes de estas igualdades incluyendo a la funcin objetivo a la cual se le cambia el signo, formando as un matriz de coeficientes. De esta matriz se selecciona un elemento [p][q], despus se multiplica la p-sima fila por un escalar apropiado y se suma a todas las filas restantes para llenar la q-esima columna de ceros excepto el elemento de la fila q que se pone a 1y as sucesivamente hasta que se llega a una matriz que tiene en su diagonal principal solamente 1 maximizando as la funcin objetivo. Lo siguiente es un algoritmo que nos permite implementar el mtodo simplex en donde primero se toman los valores de los coeficientes, se crea la matriz se obtienen la columna del pivote y posteriormente la fila, se guardan los elementos se transforman y se imprimen para finalizar liberando el espacio de las variables. Algoritmo en C del Mtodo Simplex. int main ( ) { unsigned n,e,*x; float *c,**a,*h,*v; unsigned i,j,bi,bj; Toma de datos. printf ("Num. var.: "); scanf ("%u",&n); printf ("Num. inec.: "); scanf ("%u",&e); c = calloc ( n+1, sizeof( float)); a = calloc ( e+1, sizeof( float*)); x = calloc ( e+1, sizeof( unsigned)); h = calloc ( n+1, sizeof( float)); v = calloc ( e+1, sizeof( float)); for ( i=0;i<n;i++) { printf ("Coef. x(%u) en la ec. del Maximo:",i+1); scanf ("%f",&c[i]); } for ( j=0;j<e;j++) { a[j] = calloc ( n+1, sizeof(float)); for ( i=0;i<n;i++) { printf ("Coef. x(%u) en la %u ec.:",i+1,j+1); scanf ("%f",&a[j][i]); } printf ("Term.Indep. de la %u ec.:",j+1); scanf ("%f",&a[j][n]); printf ("Subindice de variable aux. de la inecuacion h(i)"); scanf ("%u",&x[j]); x[j]--; } Preparacin de la matriz de datos. for ( i=0; i<=n;i++ ){ a[e][i]=-c[i]; for ( j=0;j<e;j++){ a[e][i]+=a[j][i]*c[x[j]]; } } for (i=0; i< n; i++ ){ printf ("c(%u)= %7.2f\n", i+1,c[i]); } Obtencin de la columna del elemento pivote. bi=1; for ( i=0;i<n;i++){ if ( a[e][i]< a[e][bi] ) bi=i; } if ( a[e][bi]>=0 ) break; Obtencin de la fila del elemento pivote. bj=1; for ( j=0;j<e;j++){ if ( a[j][n]*a[bj][bi] < a[bj][n]*a[j][bi] ) bj=j; } printf ("+"); for ( i=0;i<n+2;i++) printf ("--------"); printf ("+\n"); for ( j=0; j< e; j++){ printf ("| x%u | %7.2f | ",x[j]+1,a[j][n] ); for ( i=0; i<n; i++ ){ if ((i==bi)&&(j==bj)) { printf ("%7.2f*",a[j][i] ); } else { printf ("%7.2f ",a[j][i] ); } } printf("|\n"); } printf ("+"); for ( i=0;i<n+2;i++) printf ("--------"); printf ("+\n"); printf (" | %7.2f | ",a[e][n] ); for ( i=0; i<n; i++ ){ printf ("%7.2f ",a[e][i] ); } printf("|\n\n"); Guardar los datos de la fila y columna.

for (i=0;i<=n;i++ ){ h[i]=a[bj][i]; } for ( j=0;j<=e;j++ ){ v[j]=a[j][bi]; } for (i=0;i<=n;i++ ){ for ( j=0;j<=e;j++ ){ a[j][i] -= h[i]*v[j]/h[bi]; } } for (i=0;i<=n;i++ ){ a[bj][i]=h[i]/v[bj]; } x[bj]= bi; } Se muestra la solucin. printf ("+"); for ( i=0;i<n+2;i++) printf ("--------"); printf ("+\n"); for ( j=0; j< e; j++){ printf ("| x%u | %7.2f | ",x[j] +1,a[j][n] ); for ( i=0; i<n; i++ ){ printf ("%7.2f ",a[j][i] ); } printf("|\n"); }printf ("+"); for ( i=0;i<n+2;i++) printf ("--------"); printf ("+\n"); printf (" | %7.2f | ",a[e][n] ); for ( i=0; i<n; i++ ){ printf ("%7.2f ",a[e][i] ); } printf("|\n\n"); printf ("\nSolucion:\n"); for ( j=0; j<e; j++){ printf ("x%u=%7.2f\n",x[j]+1,a[j][n]); } Se libera el espacio de variables. for ( j=0; j<=e; j++) free(a[j]); free(c); free(a); free(x); free(h); free(v); return 0;}

Das könnte Ihnen auch gefallen