C Program - Vogel's Approximation Method (VAM) For Transportation Problems
C Program - Vogel's Approximation Method (VAM) For Transportation Problems
h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define INFINITY 1111
#define N 3
#define M 4
void input(void);
void display(void);
void displayfinal(void);
void diffmin(void);
void table(void);
int max(int *,int *,int);
int min(int,int);
int mini(int *,int *,int);
int condition(void);
int arr[N][M];
int arrcopy[N][M];
int value[N][M];
int u[N];
int v[M];
int rowdiffmin[N];
int coldiffmin[M];
int decide[M+N];
int x[N],y[M]; /* x is u y is v */
void main()
{
int i,j;
table();
x[0]=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(value[i][j]!=0)
printf("U[%d] + V[%d] = %d\n",i+1,j+1,arr[i][j]);
}
}
getch();
}
void table(void)
{
int rowdiffminmaxpos;
int coldiffminmaxpos;
int decidemaxpos;
int temp;
int temparr[M];
int i;
clrscr();
input();
diffmin();
display();
while(condition())
{
max(decide,&decidemaxpos,M+N);
if(decidemaxpos>=0 && decidemaxpos<N)
{
rowdiffminmaxpos=decidemaxpos;
for(i=0;i<M;i++)
temparr[i]=arr[decidemaxpos][i];
mini(temparr,&coldiffminmaxpos,M);
}
else if(decidemaxpos>=N && decidemaxpos<M+N)
{
coldiffminmaxpos=decidemaxpos-N;
for(i=0;i<N;i++)
temparr[i]=arr[decidemaxpos][i];
temparr[i]=INFINITY;
mini(temparr,&rowdiffminmaxpos,M);
}
temp=min(u[rowdiffminmaxpos],v[coldiffminmaxpos]);
value[rowdiffminmaxpos][coldiffminmaxpos]=temp;
if(temp==u[rowdiffminmaxpos])
{
for(i=0;i<M;i++)
arr[rowdiffminmaxpos][i]=INFINITY;
u[rowdiffminmaxpos]-=temp;
v[coldiffminmaxpos]-=temp;
}
else if(temp==v[coldiffminmaxpos])
{
for(i=0;i<N;i++)
arr[i][coldiffminmaxpos]=INFINITY;
u[rowdiffminmaxpos]-=temp;
v[coldiffminmaxpos]-=temp;
}
diffmin();
getch();
display();
}
getch();
displayfinal();
getch();
}
void input(void)
{
int i,j;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
arr[i][j]=arrcopy[i][j]=-1;
/* Demand supply matrix */
arr[0][0]=arrcopy[0][0]=5;
arr[0][1]=arrcopy[0][1]=3;
arr[0][2]=arrcopy[0][2]=6;
arr[0][3]=arrcopy[0][3]=2;
arr[1][0]=arrcopy[1][0]=4;
arr[1][1]=arrcopy[1][1]=7;
arr[1][2]=arrcopy[1][2]=9;
arr[1][3]=arrcopy[1][3]=1;
arr[2][0]=arrcopy[2][0]=3;
arr[2][1]=arrcopy[2][1]=4;
arr[2][2]=arrcopy[2][2]=7;
arr[2][3]=arrcopy[2][3]=5;
/* Supply */
u[0]=19;
u[1]=37;
u[2]=34;
/* Demand */
v[0]=16;
v[1]=18;
v[2]=31;
v[3]=25;
/**************************************************\
5 3 6 2 19 (1)
4 7 9 1 37 (3)
3 4 7 5 34 (1)
4 18 31 0
(2) (1) (1) (0)
----------------------------------------------------
5 1111 6 1111 1 (1)
1111 1111 1111 1111 0 (0)
3 1111 7 1111 34 (4)
4 0 31 0
(2) (0) (1) (0)
---------------------------------------------------
1111 1111 6 1111 1 (1105)
1111 1111 1111 1111 0 (0)
1111 1111 7 1111 30 (1104)
0 0 31 0
(0) (0) (1) (0)
---------------------------------------------------
1111 1111 1111 1111 0 (0)
1111 1111 1111 1111 0 (0)
1111 1111 7 1111 30 (1104)
0 0 30 0
(0) (0) (1104) (0)
---------------------------------------------------
1111 1111 1111 1111 0 (0)
1111 1111 1111 1111 0 (0)
1111 1111 1111 1111 0 (0)
0 0 0 0
(0) (0) (0) (0)
---------------------------------------------------
---------------------------------------------------
5 3|18 6|1 2
4|12 7 9 1|25
3|4 4 7|30 5
1111 1111 7 1111 30 (1104)
X[1][2] = 18
X[1][3] = 1
X[2][1] = 12
X[2][4] = 25
X[3][1] = 4
X[3][3] = 30
/**************************************************/
}
void displayfinal(void)
{
int i,j;
printf("\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
arr[i][j]=arrcopy[i][j];
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
if(value[i][j]==0)
printf("%d\t",arr[i][j]);
else
printf("%d|%d\t",arr[i][j],value[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(value[i][j]!=0)
printf("X[%d][%d] = %d\n",i+1,j+1,value[i][j]);
}
int condition(void)
{
int i;
int flag;
int temp[M+N];
flag=1;
for(i=0;i<N;i++)
temp[i]=u[i];
for(;i<M+N;i++)
temp[i]=v[i];
for(i=0;i<M+N;i++)
{
if(temp[i]!=0)
flag=0;
}
if(flag==0)
return(TRUE);
else
return(FALSE);
}
void diffmin(void)
{
int min1,min2;
int arrmin1pos,arrmin2pos;
int i,j;
for(i=0;i<N;i++)
{
min1=arr[i][0];
arrmin1pos=0;
for(j=0;j<M;j++)
{
if(arr[i][j]<min1)
{
min1=arr[i][j];
arrmin1pos=j;
}
}
if(arrmin1pos==1)
{
min2=arr[i][0];
arrmin2pos=0;
}
else
{
min2=arr[i][1];
arrmin2pos=1;
}
for(j=0;j<M;j++)
{
if(arr[i][j]<min2 && j!=arrmin1pos)
{
min2=arr[i][j];
arrmin2pos=j;
}
}
rowdiffmin[i]=min2-min1;
decide[i]=rowdiffmin[i];
}
for(i=0;i<M;i++)
{
min1=arr[0][i];
arrmin1pos=0;
for(j=0;j<N;j++)
{
if(arr[j][i]<min1)
{
min1=arr[j][i];
arrmin1pos=j;
}
}
if(arrmin1pos==1)
{
min2=arr[0][i];
arrmin2pos=0;
}
else
{
min2=arr[1][i];
arrmin2pos=1;
}
for(j=0;j<N;j++)
{
if(arr[j][i]<min2 && j!=arrmin1pos)
{
min2=arr[j][i];
arrmin2pos=j;
}
}
coldiffmin[i]=min2-min1;
decide[i+N]=coldiffmin[i];
}
}
void display(void)
{
int i,j;
printf("\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%d\t",arr[i][j]);
printf("\t%d\t(%d)\t",u[i],rowdiffmin[i]);
printf("\n");
}
printf("\n");
for(i=0;i<M;i++)
printf("%d\t",v[i]);
printf("\n");
for(i=0;i<M;i++)
printf("(%d)\t",coldiffmin[i]);
printf("\n\n");
}
16 18 31 25
(1) (1) (1) (1)
----------------------------------------------------
5 3 6 1111 19 (2)
4 7 9 1111 12 (3)
3 4 7 1111 34 (1)
16 18 31 0
(1) (1) (1) (0)
----------------------------------------------------
5 3 6 1111 19 (2)
1111 1111 1111 1111 0 (0)
3 4 7 1111 34 (1)
4 18 31 0
(2) (1) (1) (0)
----------------------------------------------------
5 1111 6 1111 1 (1)
1111 1111 1111 1111 0 (0)
3 1111 7 1111 34 (4)
4 0 31 0
(2) (0) (1) (0)
---------------------------------------------------
1111 1111 6 1111 1 (1105)
1111 1111 1111 1111 0 (0)
1111 1111 7 1111 30 (1104)
0 0 31 0
(0) (0) (1) (0)
---------------------------------------------------