Tuesday, October 21, 2014

VAM (Vogal Appro. Method)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
 int max(int a[]);
 int min(int a[10][10],char fx, int rc,int n);
int cal_diff(int a[10][10],int rc,char ch, int n);
void main()
{
int vam[10][10],v[10][10],avail[11][10],av[10],demand[11][10],dm[10];
int avdf[11][10],dmdf[11][10],rs[10][10];
int row,col,r,c,chk1=0,chk2=0;

int i,j,k,brk,cost=0,it=0;
clrscr();
printf("\n \t VAM\n");
printf("\n Enter the number of rows=");
scanf("%d",&row);
printf("\n Enter the number of columns=");
scanf("%d",&col);
printf("\n Enter the matrix=");
for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
        scanf("%d",&vam[i][j]);
        v[i][j]=vam[i][j];
        rs[i][j]=0;
    }
}
printf("\n Enter the Availabilities= ");
for(i=0;i<row;i++)
{
    scanf("%d",&av[i]);
    chk1+=av[i];
}
printf("\n Enter the Demands=");
for(i=0;i<col;i++)
{
    scanf("%d",&dm[i]);
    chk2+=dm[i];
}
if(chk1!=chk2)
{
    printf("\n The problem is unbalanced......\n");
    exit(0);
}
for(i=0;i<11;i++)
{
    for(j=0;j<10;j++)
    {
        avdf[i][j]=0;
      dmdf[i][j]=0;
    }
}
brk;
while(brk!=row*col)
{
    for(i=0;i<row;i++)
    {
        avail[it][i]=av[i];
    }
    for(i=0;i<col;i++)
    {
       demand[it][i]=dm[i];
    }
    for(i=0;i<col;i++)
    dmdf[it][i]=cal_diff(v,i,'r',col);
    r=max(avdf[it]);
   c=max(dmdf[it]);
    if(avdf[it][r]>=dmdf[it][c])
    {
        c=min(v,'r',r,col);
        for(i=0;i<col;i++)
            v[r][i]=-1;
    }
    else
    {
        r=min(v,'c',c,row);
        for(i=0;i<row;i++)
            v[i][c]=-1;
    }
    if(av[r]>dm[c])
    {
        rs[r][c]=dm[c];
        av[r]=av[r]-dm[c];
        dm[c]=0;
    }
    else
    {
        rs[r][c]=av[r];
        dm[c]=dm[c]-av[r];
        av[r]=0;
    }
    it++;
    brk=0;

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            if(v[i][j]==-1)
                brk++;
        }
    }
}
    printf("\n The VAM table is .....\n\n");
    for(i=1;i<=col;i++)
        printf("\t D %d",i);
        printf("\t Available\n\n");
    for(i=0;i<row;i++)
    {
        printf("S%d",i+1);
        for(j=0;j<col;j++)
            printf("\t %d",vam[i][j]);

        for(j=0;j<row;j++)
            printf("\t %d(%d)",avail[j][i]);
        avdf[j][i];
        printf("\n");

        for(j=0;j<col;j++)
        {
            printf("\t %d",rs[i][j]);
            cost=cost+vam[i][j]*rs[i][j];
        }
        printf("\n");
    }
    printf("Demands");
    for(j=0;j<it;j++)
    {
        for(i=0;i<col;i++)
        printf("\t %d(%d)",demand[j][i],dmdf[j][i]);
      printf("\n\n");
    }
    printf("\nThe cost is = %d",cost);
    getch();
}

int max(int a[])
{
    int t=a[0],l=0,i;
    for(i=0;i<10;i++)
        if(a[i]>t)
        {
            t=a[i];
            l=i;
        }
        return l;
}
int cal_diff(int a[10][10],int rc,char ch, int n)
{
    int i,l,t1=0,t2=0;
    if(ch=='r')
    {
        for(i=0;i<n;i++)
            if(a[rc][i]!=-1)
            {
                l=i;
                t1=t2=a[rc][i];
                break;
            }
         for(i=0;i<n;i++)
            if(a[rc][i]<t1 && a[rc][i]!=-1)
            {
                t1=a[rc][i];
                l=i;
            }
            for(i=0;i<n;i++)
                if(a[rc][i]>t1)
                {
                    t2=a[rc][i];
                    break;
                }
            for(i=0;i<n;i++)
                if(a[rc][i]<t2 && i!=1 && a[rc][i]!=1)
                    t2=a[rc][i];
    }
    else
    {
        for(i=0;i<n;i++)
            if(a[i][rc]!=-1)
            {
                l=i;
                t1=t2=a[i][rc];
                break;
            }
         for(;i<n;i++)
            if(a[i][rc]<t1 && a[i][rc]!=-1)
            {
                t1=a[i][rc];
                l=i;
            }
          for(i=0;i<n;i++)
            if(a[i][rc]>t1)
            {
                t2=a[i][rc];
                break;
            }
            for(i=0;i<n;i++)
                if(a[i][rc]<t2 && i!=1 && a[i][rc]!=-1)
                    t2=a[i][rc];
    }
    return(t2-t1);
}

int min(int a[10][10],char fx, int rc,int n)
{
    int i,l,t;
    if(fx=='r')
    {
        for(i=0;i<n;i++)
            if(a[rc][i]!=-1)
            break;
            l=i;t=a[rc][l];
            for(i=1;i<n;i++)
                if(a[rc][i]<t && a[rc][i]!=-1)
                {
                    t=a[rc][i];l=i;
                }
    }
    else
    {
        for(i=0;i<n;i++)
            if(a[i][rc]!=-1)
                break;
            l=i;t=a[l][rc];
        for(i=1;i<n;i++)
            if(a[i][rc]<t && a[i][rc]!=-1)
            {
                t=a[i][rc];
                l=i;
            }
    }
   return 1;
}


















No comments:

Post a Comment