#include <stdio.h>
void imprimirTabla(double tabla[20][20], int filas, int columnas) {
int i, j;
for (i = 0; i < filas; i++) {
for (j = 0; j < columnas; j++) {
printf("%.2lf\t", tabla[i][j]);
}
printf("\n");
}
printf("\n");
}
void pivotar(double tabla[20][20], int pivoteFila, int pivoteColumna, int filas, int columnas) {
int i, j;
double pivote = tabla[pivoteFila][pivoteColumna];
for (j = 0; j < columnas; j++) {
tabla[pivoteFila][j] /= pivote;
}
for (i = 0; i < filas; i++) {
if (i != pivoteFila) {
double factor = tabla[i][pivoteColumna];
for (j = 0; j < columnas; j++) {
tabla[i][j] -= factor * tabla[pivoteFila][j];
}
}
}
}
int encontrarColumnaPivote(double tabla[20][20], int filas, int columnas) {
int j;
double minimo = tabla[0][1]; // Supongamos que el elemento (0,1) es el mínimo
int columnaPivote = 1;
for (j = 2; j < columnas - 1; j++) {
if (tabla[0][j] < minimo) {
minimo = tabla[0][j];
columnaPivote = j;
}
}
return columnaPivote;
}
int encontrarFilaPivote(double tabla[20][20], int columnaPivote, int filas, int columnas) {
int i;
double minimo = -1;
int filaPivote = -1;
for (i = 1; i < filas; i++) {
if (tabla[i][columnaPivote] > 0) {
double cociente = tabla[i][columnas - 1] / tabla[i][columnaPivote];
if (minimo == -1 || cociente < minimo) {
minimo = cociente;
filaPivote = i;
}
}
}
return filaPivote;
}
void simplex(double tabla[20][20], int filas, int columnas) {
while (1) {
int columnaPivote = encontrarColumnaPivote(tabla, filas, columnas);
if (columnaPivote == -1) {
break; // Ya no hay columnas negativas, terminar
}
int filaPivote = encontrarFilaPivote(tabla, columnaPivote, filas, columnas);
if (filaPivote == -1) {
printf("Problema no acotado.\n");
return;
}
printf("Pivote en (%d, %d)\n", filaPivote, columnaPivote);
pivotar(tabla, filaPivote, columnaPivote, filas, columnas);
imprimirTabla(tabla, filas, columnas);
}
}
int main() {
int filas, columnas, i, j;
printf("Ingrese el número de filas: ");
scanf("%d", &filas);
printf("Ingrese el número de columnas: ");
scanf("%d", &columnas);
double tabla[20][20];
printf("Ingrese los coeficientes de la función objetivo:\n");
for (j = 0; j < columnas - 1; j++) {
scanf("%lf", &tabla[0][j]);
}
printf("Ingrese los coeficientes de las restricciones y los lados derechos:\n");
for (i = 1; i < filas; i++) {
for (j = 0; j < columnas; j++) {
scanf("%lf", &tabla[i][j]);
}
}
printf("Ingrese la fila de la función objetivo:\n");
for (j = 0; j < columnas - 1; j++) {
scanf("%lf", &tabla[0][j]);
tabla[0][j] *= -1; // Multiplicar por -1 para maximizar
}
imprimirTabla(tabla, filas, columnas);
simplex(tabla, filas, columnas);
printf("Solución encontrada:\n");
for (j = 0; j < columnas - 1; j++) {
int esCero = 1;
for (i = 1; i < filas; i++) {
if (tabla[i][j] != 0) {
esCero = 0;
break;
}
}
if (esCero) {
printf("x%d = 0\n", j + 1);
} else {
printf("x%d = %.2lf\n", j + 1, tabla[encontrarFilaPivote(tabla, j, filas, columnas)][columnas - 1]);
}
}
return 0;
}