#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <conio.h>
#define INFINITY -999
#include <windows.h>
#define N 10
#define M 20
/***************************************************/
/***** Resuelve LPP por DUAL SIMPLEX *****/
/****** Autores*******/
/***** Chrystian Viteri 452 *******/
/***** Welington Tapuy 352 *******/
/***** Rebeca Tenenaula 175 *******/
/***************************************************/
void minimum(float *arr,int *arrminpos,int n);
/* Calcula el minimo posicion valorada entre la matriz arr tiene n elementos. */
void maximum(float *arr,int *arrminpos,int n);
/* Calcula el minimo posicion valorada entre la matriz arr tiene n elementos. */
void display (float c[],float b[],float a[][M],int basic[]);
/* Muestra la tabla */
void displayframe(float c[M]);
/* Muestra el marco de la tabla */
void calctemp(float *,float [][M],float [],int []);
/* Calcula Zj-Cj */
int ingresar;
int restricc;
void gotoxy(int x,int y){
HANDLE hcon;
hcon = GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X = x;
dwPos.Y= y;
SetConsoleCursorPosition(hcon,dwPos);
}
int main()
{
{
int x,y,i,d;
for(i=0;i<80;i++)
{
gotoxy(i,0);
printf("%c",205);
gotoxy(i,3);
printf("%c",205);
}
char pass[20];
printf("Ingrese Contrasena: ");
scanf("%s",pass);
if( strcmp(pass,"123456")==0)
{
//printf("\n\nCONTRASEA CORRECTA");
}
else
{
printf("\n\nCONTRASEA INCORRECTA, PORFAVOR VERIFIQUE");
}
system("pause > null");
getch();
gotoxy(30,2);
printf("DUAL SIMPLEX");
gotoxy(28,3);
printf("INVESTIGACION OPERATIVA");
gotoxy(7,4);
printf("INTEGRANTES:");
gotoxy(7,5);
printf("CHRYSTIAN VITERI");
gotoxy(7,6);
printf("WELINTON TAPUY");
gotoxy(7,7);
printf("REBECA TENENAULA");
// system("\npause\n");
using namespace std;
}
system("color 06");
float c[M];
/*Tiene coeficiente de la funcion objetivo Max (z) */
float a[N][M];
/* Almacena el co-eficiente de las limitaciones */
float b[N];
/*Almacena los valores de RHS de restricciones */
float temp[M];
/* Almacena los valores de Zj-Cj*/
int bminpos;
/* Almacena la posicion minima valorado
de {Zj-Cj} es decir, que viene en la variable */
float maxratio[M]; /* Almacena el valor de la relacion Zj-Cj / a [i] [j] */
int maxratiomaxpos; /* Almacena la posicion minima valioso de
b [i] / a [i] [j] es decir, salir variables */
float key;
/*Guarda el elemento clave */
int gooutcol;
/* Almacena el numero de columna que sale */
int incomingcol;
float z;
/* Almacena el valor de la funcion objetivo */
float x[M];
/* Almacena el valor de las variables*/
int i,j;
/* variables de bucle */
int basic[N];
/* Almacena la variable basica */
int flag=0;
/* variable bandera de finalizacion */
/*** La inicializacion de variables basicas ***/
for(i=0;i<M;i++)
c[i]=x[i]=temp[i]=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
a[i][j]=0;
/*** Inputing cantidad necesaria de datos ***/
gotoxy(7,9);
printf("INTRODUZCA EL NUMERO DE TERMINOS DE Z: ");
scanf("%d",&ingresar);
printf("\nINTRODUZCA SUS COEFICIENTES\n");
for(i=0;i<ingresar;i++)
scanf("%f",&c[i]);
printf("\nFUNCION INGRESADA:-\n");
printf("\nMax o Min z = ");
for(i=0;i<ingresar;i++)
{
if(i==0)
printf("%g*x%d",c[i],i+1);
else
printf(" + %g*x%d",c[i],i+1);
}
printf("\nINTRODUZCA EL NUMERO DE RESTRICCIONES: ");
scanf("%d",&restricc);
printf("\nINTRODUZCA LOS COEFICIENTES DE LAS RESTRICCIONES:\n");
for(i=0;i<restricc;i++)
for(j=0;j<ingresar;j++)
scanf("%f",&a[i][j]);
printf(" %g*x%d ",a[i]);
for(i=0;i<restricc;i++)
a[i][j++]=1;
printf("\nINTRODUZCA LOS TERMINOS DE bi\n");
for(i=0;i<restricc;i++)
scanf("%f",&b[i]);
for(i=0;i<ingresar+restricc;i++)
basic[i]=(i+ingresar);
printf("\nFUNCION INGRESADA:\n");
for(i=0;i<restricc;i++)
{
for(j=0;j<ingresar;j++)
{
if(j==0)
printf(" %g*x%d ",a[i][j],j+1);
else
printf(" + %g*x%d ",a[i][j],j+1);
}
printf(" <= %g\n",b[i]);
}
getchar();
/*** Calculo de la tabla actual ***/
do
{
/*** Condicion de fin ***/
for(i=0;i<restricc;i++)
{
flag=1;
if(b[i]<=0)
{
flag=0;
break;
}
}
z=0;
calctemp(temp,a,c,basic);
printf("\n");
display(c,b,a,basic);
printf("\n\tZj-Cj\t\t");
for(i=0;i<restricc+ingresar;i++)
printf("%0.3g\t",temp[i]);
printf("\n\n");
/*** Columna Saliente ***/
minimum(b,&bminpos,restricc);
gooutcol=basic[bminpos];
/*** Columna Entrante ***/
for(i=0;i<M;i++)
maxratio[i]=INFINITY;
for(i=0;i<restricc+ingresar;i++)
{
if(a[bminpos][i]==0)
{
maxratio[i]=INFINITY;
continue;
}
if(a[bminpos][i]>0)
{
maxratio[i]=INFINITY;
continue;
}
maxratio[i]=temp[i]/a[bminpos][i];
}
maximum(maxratio,&maxratiomaxpos,2*restricc);
incomingcol=maxratiomaxpos;
for(i=0;i<restricc+ingresar;i++)
x[i]=0;
for(i=0;i<restricc;i++)
{
x[basic[i]]=b[i];
printf("x[%d]=%0.3g\n",basic[i]+1,b[i]);
}
for(i=0;i<restricc;i++)
z=z+c[i]*x[i];
printf("Max(z) = %g",z*-1);
printf("\nVARIABLE ENTRANTE= X%d\t",incomingcol+1);
printf("VARIABLE SALIENTE = X%d\n",gooutcol+1);
/*** Verificar variables basicas y no basicas ***/
basic[bminpos]=incomingcol;
/*** Realizar las operaciones para traer expresiones similares en
variables entrantes y salientes por operaciones de filas ***/
key=a[bminpos][incomingcol];
b[bminpos]=b[bminpos]/key;
for(i=0;i<restricc+ingresar;i++)
a[bminpos][i]=a[bminpos][i]/key;
for(i=0;i<restricc;i++)
{
if(bminpos==i)
continue;
key=a[i][incomingcol];
for(j=0;j<(restricc+ingresar);j++)
a[i][j]=a[i][j]-a[bminpos][j]*key;
b[i]=b[i]-b[bminpos]*key;
}
getchar();
}while(flag==0);
printf("\nGRACIAS POR USAR EL PROGRAMA\n\n");
printf("\nPresione cualquier tecla para salir.....\n");
getchar();
}
void calctemp(float *temp,float a[N][M],float c[M],int basic[N])
{
int i,j;
for(i=0;i<restricc+ingresar;i++)
{
temp[i]=0;
for(j=0;j<restricc;j++)
temp[i]=temp[i]+c[basic[j]]*a[j][i];
temp[i]=temp[i]-c[i];
}
}
void maximum(float *arr,int *arrmaxpos, int n)
{
int i;
float arrmax;
arrmax=arr[0];
*arrmaxpos=0;
for(i=0;i<n;i++)
if(arr[i]>arrmax)
{
arrmax=arr[i];
*arrmaxpos=i;
}
}
void minimum(float *arr,int *arrminpos, int n)
{
int i;
float arrmin;
arrmin=arr[0];
*arrminpos=0;
for(i=0;i<n;i++)
if(arr[i]<arrmin)
{
arrmin=arr[i];
*arrminpos=i;
}
}
void display (float c[N],float b[N],float a[N][M],int basic[N])
{
int i,j;
displayframe(c);
for(i=0;i<restricc;i++)
{
printf("\n%0.3g\tX%d\t%0.3g\t",c[basic[i]],basic[i]+1,b[i]);
for(j=0;j<restricc+ingresar;j++)
printf("%0.3g\t",a[i][j]);
printf("\n");
}
}
void displayframe(float c[M])
{
int i;
printf("\t\tc[j]\t");
for(i=0;i<restricc+ingresar;i++)
printf("%0.2g\t",c[i]);
printf("\n");
printf("\nc[B]\tB\tb\t");
for(i=0;i<restricc+ingresar;i++)
printf("a[%d]\t",i+1);
printf("\n");
}