0% encontró este documento útil (0 votos)
89 vistas6 páginas

Implementación de DUAL SIMPLEX en C++

Este programa resuelve problemas de programación lineal mediante el método de simplex dual para encontrar el valor óptimo de una función objetivo. El programa inicializa variables, solicita la entrada de datos del problema (función objetivo, restricciones, coeficientes), calcula la tabla simplex inicial y realiza iteraciones del método dual simplex hasta encontrar la solución óptima. El programa también incluye funciones para mostrar la tabla, calcular valores temporales y encontrar valores máximos y mínimos necesarios para el método.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
89 vistas6 páginas

Implementación de DUAL SIMPLEX en C++

Este programa resuelve problemas de programación lineal mediante el método de simplex dual para encontrar el valor óptimo de una función objetivo. El programa inicializa variables, solicita la entrada de datos del problema (función objetivo, restricciones, coeficientes), calcula la tabla simplex inicial y realiza iteraciones del método dual simplex hasta encontrar la solución óptima. El programa también incluye funciones para mostrar la tabla, calcular valores temporales y encontrar valores máximos y mínimos necesarios para el método.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

#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");
}

También podría gustarte