Big-M Method
//Program for Big-M method of calculation in C
#include
int bk=1,g,l;
void max();
void min();
int main()
{
int i;
printf("\nNOTE: SLACK VARIABLES HELP IN FORMING THE UNIT MAQTRIX. BUT
OBJECTIVE\n");
printf("FUNCTIONS WITH <= WILL PROVIDE SLACK VARIABLES BUT THOSE
WITH >= WILL NOT.\n");
printf("HENCE TO MAKE A UNIT MATRIX, WE MUST TAKE HELP OF ARTIFICIAL
VARIABLES. THIS\n");
printf("INCLUDE ANOTHER COEFFICIENT CALLED BIG-M. ");
printf("\n OBJECTIVE? Maximization(1) or Minimization(2) or any other to Exit...:\n");
scanf("%d",&i);
if (i==1)
max();
else if (i==2)
min();
else
return 0;
}
void min()
{
int i,j,row,col,kc,kr,sub,var,flag=-1,k;
double sum,max,ba,kn;
double cj[20],basis[20],c[20],colmat[20],tab[20][20];
bk=0;
printf("\n\nTAKE \"M\" AS A BIT LARGER THAN ANY LARGEST NUMBER IN THE
printf("\nTOTAL NUMBER OF >= EQUALITIES IN SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &g);
printf("\nTOTAL NUMBER OF <= EQUALITIES IN SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &l);
printf("\nTOTAL NUMBER OF \"ARTIFICIAL VARIABLES\": %d\n",g);
printf("ENTER THE TOTAL NUMBER OF VARIABLES IN OBJECTIVE
FUNCTION:\n");
scanf("%d", &var);
printf("\nSTART ENTERING THE COEFFICIENTS OF THE OBJECTIVE FUNCTION:\n");
for(i=0;i
{
scanf("%lf", &cj[i]);
}
printf("\nENTER TOTAL NUMBER OF SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &sub);
//DECIDING TABLE DIMENSION
col=var+4;
row=sub+2;
for(i=1;i
{
printf("\nENTER ELEMENTS IN %d-th ROW:\n",i);
for(j=4;j
}
printf("\nENTER THE BASIS:\n");
for(i=0;i
scanf("%lf", &basis[i]);
printf("\nENTER THE VALUES OF \"C\" FROM OBJECTIVE FUNCTION\n");
for(i=0;i
scanf("%lf", &c[i]);
printf("\nENTER THE COLUMN MATRIX:\n");
for(i=0;i
scanf("%lf", &colmat[i]);
//INITIALIZING THE TABLE
for(i=1;i
tab[i][0]=i;
for(i=1;i
{
tab[i][1]=basis[i-1];
tab[i][2]=c[i-1];
tab[i][3]=colmat[i-1];
}
printf("\nPRINTING THE MATRIX YOU HAVE INSERTED:\n");
printf("---------------------------------------\n");
for(i=1;i
{
for(j=0;j
{
printf("%.3lf\t",tab[i][j]);
}
printf("\n");
}
printf("---------------------------------------\n");
for(i=4;i
tab[row-1][i]=0;
tab[row-1][3]=0;
//STARTING THE ITERATION
for(k=0;k<10;k++)
{
//INITIALIAZING FLAG
flag=-1.00;
//Z0
for(i=1;i
tab[row-1][3]=tab[row-1][3]+tab[i][3]*tab[i][2];
//Zj-Cj
for(i=4;i
{
sum=0;
for(j=1;j
sum=tab[j][i]*tab[j][2]+sum;
tab[row-1][i]=sum-cj[i-4];
}
//FINDING MAXIMUM IN Zj-Cj
max=tab[row-1][4];
kc=4;
for(i=4;i
{
if(max
{
max=tab[row-1][i];
kc=i;
}
}
//FINDING b/a RATIO
for(j=1;j
{
if(tab[j][kc]>0)
{
ba=(colmat[j-1]/tab[j][kc]);
goto pop;
}
}
pop:
kr=j;
for(;j
{
if((tab[j][kc]>0) && ((colmat[j-1]/tab[j][kc])
kr=j;
}
//SWAPPING KEY COLUMN WITH BASIS
tab[kr][1]=kc-3;
kn=tab[kr][kc];
tab[kr][2]=cj[kc-4];
//DIVIDING OTHER ROWS BY THE FORMULA
for(i=1;i
{
if(i==kr)
continue;
else
{
for(j=3;j
tab[i][j]=tab[i][j]-((tab[i][kc]*tab[kr][j])/kn);
}
}
printf("\n\n");
for(i=1;i
{
if(i==kr)
continue;
else
{
for(j=kc+1;j
tab[i][j]=tab[i][j]-((tab[i][kc]*tab[kr][j])/kn);
}
}
for(i=1;i
{
if(i==kr)
continue;
else
tab[i][kc]=tab[i][kc]-((tab[i][kc]*tab[kr][kc])/kn);
}
//DIVIDING KEY ROW BY KEY NUMBER
for(i=3;i
tab[kr][i]=tab[kr][i]/kn;
//CHECKING IF Zj-Cj ARE ALL NEGATIVE
for(i=4;i
{
if(tab[row-1][i]>0)
{
flag=1;
}
}
//BREAKING THE LOOP
if(flag==-1)
goto sos;
}
sos:
printf("\nTHE SOLUTION IS...\n");
for(i=1;i
printf("X%d=%lf\n",(int)tab[i][1],tab[i][3]);
}
void max()
{
int i,j,row,col,kc,kr,sub,var,flag=-1,k;
double sum,max,ba,kn;
double cj[20],basis[20],c[20],colmat[20],tab[20][20];
bk=0;
printf("\n\nTAKE \"M\" AS A BIT SMALLER THAN ANY SMALLEST NUMBER IN
THE EQUATIONS...\n\n\n");
printf("\nTOTAL NUMBER OF >= EQUALITIES IN SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &g);
printf("\nTOTAL NUMBER OF <= EQUALITIES IN SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &l);
printf("\nTOTAL NUMBER OF \"ARTIFICIAL VARIABLES\": %d\n",g);
printf("ENTER THE TOTAL NUMBER OF VARIABLES IN OBJECTIVE
FUNCTION:\n");
scanf("%d", &var);
printf("\nSTART ENTERING THE COEFFICIENTS OF THE OBJECTIVE FUNCTION:\
n");
for(i=0;i
{
scanf("%lf", &cj[i]);
}
printf("\nENTER TOTAL NUMBER OF SUBJECTIVE FUNCTIONS:\n");
scanf("%d", &sub);
//DECIDING TABLE DIMENSION
col=var+4;
row=sub+2;
for(i=1;i
{
printf("\nENTER ELEMENTS IN %d-th ROW:\n",i);
for(j=4;j
{
scanf("%lf",&tab[i][j]);
}
}
printf("\nENTER THE BASIS:\n");
for(i=0;i
scanf("%lf", &basis[i]);
printf("\nENTER THE VALUES OF \"C\" FROM OBJECTIVE FUNCTION\n");
for(i=0;i
scanf("%lf", &c[i]);
printf("\nENTER THE COLUMN MATRIX:\n");
for(i=0;i
scanf("%lf", &colmat[i]);
//INITIALIZING THE TABLE
for(i=1;i
tab[i][0]=i;
for(i=1;i
{
tab[i][1]=basis[i-1];
tab[i][2]=c[i-1];
tab[i][3]=colmat[i-1];
}
printf("\nPRINTING THE MATRIX YOU HAVE INSERTED:\n");
printf("---------------------------------------\n");
for(i=1;i
{
for(j=0;j
{
printf("%.3lf\t",tab[i][j]);
}
printf("\n");
}
printf("---------------------------------------\n");
for(i=4;i
tab[row-1][i]=0;
tab[row-1][3]=0;
//STARTING THE ITERATION
for(k=0;k<10;k++)
{
//INITIALIAZING FLAG
flag=-1.00;
//Z0
for(i=1;i
tab[row-1][3]=tab[row-1][3]+tab[i][3]*tab[i][2];
//Zj-Cj
for(i=4;i
{
sum=0;
for(j=1;j
sum=tab[j][i]*tab[j][2]+sum;
tab[row-1][i]=sum-cj[i-4];
}
//FINDING MAXIMUM IN Zj-Cj
max=tab[row-1][4];
kc=4;
for(i=4;i
{
if(max
{
max=tab[row-1][i];
kc=i;
}
}
//FINDING b/a RATIO
for(j=1;j
{
if(tab[j][kc]>0)
{
ba=(colmat[j-1]/tab[j][kc]);
goto pop;
}
}
pop:
kr=j;
for(;j
{
if((tab[j][kc]>0) && ((colmat[j-1]/tab[j][kc])
kr=j;
}
//SWAPPING KEY COLUMN WITH BASIS
tab[kr][1]=kc-3;
kn=tab[kr][kc];
tab[kr][2]=cj[kc-4];
//DIVIDING OTHER ROWS BY THE FORMULA
for(i=1;i
{
if(i==kr)
continue;
else
{
for(j=3;j
tab[i][j]=tab[i][j]-((tab[i][kc]*tab[kr][j])/kn);
}
}
printf("\n\n");
for(i=1;i
{
if(i==kr)
continue;
else
{
for(j=kc+1;j
tab[i][j]=tab[i][j]-((tab[i][kc]*tab[kr][j])/kn);
}
}
for(i=1;i
{
if(i==kr)
continue;
else
tab[i][kc]=tab[i][kc]-((tab[i][kc]*tab[kr][kc])/kn);
}
//DIVIDING KEY ROW BY KEY NUMBER
for(i=3;i
tab[kr][i]=tab[kr][i]/kn;
//CHECKING IF Zj-Cj ARE ALL POSITIVE
for(i=4;i
{
if(tab[row-1][i]<0)
flag=1;
}
//BREAKING THE LOOP
if(flag==-1)
goto sos;
}
sos:
printf("\nTHE SOLUTION IS...\n");
for(i=1;i
printf("X%d=%lf\n",(int)tab[i][1],tab[i][3]);
}
/*
OUTPUT:
==================================================
============================================
PROGRAM TO DEMONSTRATE BIG-M METHOD
DESIGNED BY NEILAY KHASNABISH
NOTE: SLACK VARIABLES HELP IN FORMING THE UNIT MAQTRIX. BUT OBJECTIVE
FUNCTIONS WITH <= WILL PROVIDE SLACK VARIABLES BUT THOSE WITH >= WILL
NOT.
HENCE TO MAKE A UNIT MATRIX, WE MUST TAKE HELP OF ARTIFICIAL VARIABLES.
THIS
INCLUDE ANOTHER COEFFICIENT CALLED BIG-M. I(N THIS PROGRAM YOU HAVE TO
REARRANGE
THE OBJECTIVE AND CONSTRAINT EQUATIONS AS WELL AND THEN FEED THE TO
THIS PROGRAM
TO GET THE CORRECT ANSWER. GOOD LUCK!
Neilay Khasnabish
Operations Research Through C
WHAT IS YOUR OBJECTIVE? Maximization(1) or Minimization(2) or any other to
Exit...:
2
TAKE "M" AS A BIT LARGER THAN ANY LARGEST NUMBER IN THE EQUATIONS...
TOTAL NUMBER OF >= EQUALITIES IN SUBJECTIVE FUNCTIONS:
2
TOTAL NUMBER OF <= EQUALITIES IN SUBJECTIVE FUNCTIONS:
1
TOTAL NUMBER OF "ARTIFICIAL VARIABLES": 2
ENTER THE TOTAL NUMBER OF VARIABLES IN OBJECTIVE FUNCTION:
9
START ENTERING THE COEFFICIENTS OF THE OBJECTIVE FUNCTION:
1 0 -3 6 0 0 0 7 7
Neilay Khasnabish
Operations Research Through C
ENTER TOTAL NUMBER OF SUBJECTIVE FUNCTIONS:
3
ENTER ELEMENTS IN 1-th ROW:
1 0 3 -1 1 0 0 0 0
ENTER ELEMENTS IN 2-th ROW:
1 -2 0 2 0 -1 0 1 0
ENTER ELEMENTS IN 3-th ROW:
0 2 -1 2 0 0 -1 0 1
ENTER THE BASIS:
5 8 9
ENTER THE VALUES OF "C" FROM OBJECTIVE FUNCTION
0 7 7
ENTER THE COLUMN MATRIX:
6 2 1
PRINTING THE MATRIX YOU HAVE INSERTED:
---------------------------------------
1.000 5.000 0.000 6.000 1.000 0.000 3.000 -1.000 1.000 0.000 0.000 0.000 0.000
Neilay Khasnabish
Operations Research Through C
2.000 8.000 7.000 2.000 1.000 -2.000 0.000 2.000 0.000 -1.000 0.000 1.000 0.000
3.000 9.000 7.000 1.000 0.000 2.000 -1.000 2.000 0.000 0.000 -1.000 0.000 1.000
---------------------------------------
THE SOLUTION IS...
X2=0.363636
X3=2.454545
X4=1.363636