Академический Документы
Профессиональный Документы
Культура Документы
Lo
he encontrado en C, pero de C++ no hay nada por ahí.
Un saludo y gracias!
/* METODO SIMPLEX
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
for(c=0;c<*var;c++)
{
printf(" c%d: ", c+1);
scanf("%lf",&funcion[c]);
fflush(stdin);
}
fflush(stdin);
for(i=0;i<rest;i++)
{
printf("Restriccion %d\n",i+1);
for(c=0;c<*var;c++)
{
printf(" c%d: ",c+1);
scanf("%lf",&restricciones[i][c]);
fflush(stdin);
}
printf("Termino independiente ");
scanf("%lf", &independiente[i]);
fflush(stdin);
}
return rest;
}
int main(void)
{
int rest, var, ni ;
int i,j, k, columna, renglon, count, cuenta;
double maximo = 0, menor, aux, mult, temp;
rest = leeDatos(&var);
ni=1;
printf("\n-----------------------------------------------");
printf("\n ITERACION %d",ni);
printf("\n-----------------------------------------------\n");
ni++;
for(i=0; i<=rest; i++) {
for(j=0; j<=rest+var; j++)
printf(" %.2lf \t", restricciones[i][j]);
printf("\n");
}
do
{
//Encontrar la variable de decision que entrara a la base
maximo = abs(restricciones[rest][0]);
columna = 0;
for(j=0; j<=rest+var; j++)
{
if( restricciones[rest][j] < 0 )
{
temp = -1 * restricciones[rest][j];
if ( maximo < temp)
{
maximo = temp;
columna = j;
}
}
else
continue;
}
count = 0;
aux = 1e20;
menor = 1e20;
for(i=0; i<rest; i++) {
if(restricciones[i][columna] > 0)
aux = restricciones[i][rest+var] / restricciones[i][columna];
else
count++;
if( menor > aux ) {
menor = aux;
renglon = i;
}
}
if(count == rest) {
printf("Soluci� no acotada");
exit(1);
}
printf("\nPivote: %.2lf, renglon %d columna %d",restricciones[renglon][columna],
renglon, columna);
}
printf("\n-----------------------------------------------");
printf("\n ITERACION %d",ni);
printf("\n-----------------------------------------------\n");
ni++;
for(i=0; i<=rest; i++) {
for(j=0; j<=rest+var; j++)
printf(" %.2lf \t", restricciones[i][j]);
printf("\n");
}
cuenta = 0;
for(j=0;j<rest+var;j++)
if(restricciones[rest][j] >= 0)
cuenta++;
if (cuenta == rest+var)
break;
} while(cuenta);
printf("---->");
La aplicación Simplex
Las variables pueden tener cualquier nombre que empiece por una letra,
seguida de cualquier número de caracteres numéricos o alfabéticos, los
números pueden tener decimales, y se puede usar el signo + o – para
enlazar los términos de las ecuaciones. Si os interesa este tema, en este
enlace podéis encontrar una serie de artículos sobre el diseño de la
gramática para un analizador de expresiones, así como un ejemplo de
implementación.
Una vez escritas las ecuaciones, se debe pulsar el botón Build para
compilarlas, y, a continuación, ya se puede pulsar el
botón Maximize o Minimize para que el programa proporcione los valores
de las variables que hacen máxima o mínima la función con las
restricciones dadas.
2x1 + 4x2 + x3
x1 + x2 + 2x3:500
10x1 + 8x2 + 5x3:2000
2x1 + x2 :100
1 1 2 1 0 0 500
10 8 5 0 1 0 2000
2 1 0 0 0 1 100
2 4 1 0 0 0 0
1 10 2 1 0 0 2
1 8 1 0 1 0 4
2 5 0 0 0 1 1
500 2000 100 0 0 0 0
Una vez construido el objeto, para realizar los cálculos basta con llamar a
la función Calculate, que devolverá el valor máximo o mínimo de la función
y dará el valor final a las distintas variables de la función objetivo.
Por último, se comprueba si todos los valores de la última fila valen 0 o son
negativos, en cuyo caso se han terminado los cálculos y se devuelve false.