Assign Main

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 9

#include<stdio.

h>

//******************************************************************

int* update_Improvement(int vertex, int imprCost[100],int matrix[100][100],int


l1,int l2)
{
int i=0,j=0,k=0,m=0,d=0,check=0;;
int vertexby2=vertex/2;
int array[100]={0};

int l3= l2+(vertexby2);

for(i=0;i<vertex;i++)
{
if(i==l1)
{
for(j=0;j<vertexby2;j++)
{
if(matrix[l1][j]==1)
{
array[k]=j;
k=k+1;
imprCost[j]=imprCost[j]+(2*matrix[j][l1]) - (2*matrix[j][l3]);

}
}

for(j=vertexby2;j<vertex;j++)
{
if(matrix[l1][j]==1)
{
array[k]=j;
k=k+1;
imprCost[j]=imprCost[j]+(2*matrix[j][l3]) - (2*matrix[j][l1]);

}
}

if(i==l3){
for(j=0;j<vertexby2;j++)
{
for( m=0;m<k;m++)
{
if(j!=m)
{
if(matrix[l3][j]==1)
{
imprCost[j]=imprCost[j]+(2*matrix[j][l1]) - (2*matrix[j]
[l3]);

}
}
}

for(j=vertexby2 ;j<vertex;j++)
{
for( m=0;m<k;m++)
{
if(j!=m)
{
if(matrix[l3][j]==1)
{
imprCost[j]=imprCost[j]+(2*matrix[j][l3]) - (2*matrix[j][l1]);

}
}

return(imprCost);
}

//******************************************************************

int* calculate_gain(int imprCost[100], int vertex, int matrix[100][100],int


l1[100],int l2[100],int flag1, int flag2)
{
int i=0,j=0,m=0, k=0;
int array_length=0;
int t=0,x=0,p=0,check=0;
int vertexby2=vertex/2;
int gain[100][100]={0},a[100]={0},b[100]={0}, c[100]={0},d[100]={0};

for(i=0;i<vertex;i++)
{
//storing element indices to array for Part1 and Part2
a[i]=i;
c[i]=i;
}

for(i=0;i<flag1;i++)
{

for(j=0;j<vertexby2;j++)
{
if(l1[i]==a[j])
a[j]=-1;
if(l2[i]==c[j])
c[j]=-1;

}
}

k=0;m=0;
for(j=0;j<vertexby2;j++)
{
if(a[j]!=-1){
b[k]=a[j];
k=k+1;
}
if(c[j]!=-1){
d[m]=c[j];
m=m+1;
}
}

{
for(i=0;i<(vertexby2-flag1);i++)
{ k=0;
for(j=vertexby2;j<(vertex-flag2);j++)
{
gain[b[i]][d[k]]=imprCost[b[i]]+imprCost[d[j-vertexby2] + vertexby2]-
(2*matrix[b[i]][d[j-vertexby2]+vertexby2]);
k++;
}
}

//for Printing Gain


//printf("\n\nGain:\n");
//for( i = 0 ; i < vertexby2 ; i++ )
// {
// for( j = 0 ; j < vertexby2 ; j++ )
// {
// printf( "%d ",gain[i][j]);
// }
// printf("\n");
// }

int maximum = gain[0][0];


int location2=0,location1=0;

if(flag1==0)
{

for( i = 0 ; i < vertexby2 ; i++ )


{
for( j = 0 ; j < vertexby2 ; j++ )
{
if ( gain[i][j] > maximum )
{
maximum = gain[i][j];
location1=i;
location2=j;
}
}}

for(i=0;i<(vertexby2-flag1);i++)
{ k=0;
for(j=0;j<(vertexby2-flag2);j++)
{
if(check==0) {
maximum = gain[b[i]][d[j]];
check++;
}
if ( gain[b[i]][d[j]] >= maximum )
{
maximum = gain[b[i]][d[j]];
location1=b[i];
location2=d[j];
}
}
}

printf("\nMax Gain after %d iteration is %d\n ", flag1,maximum);

//printf("\nMaximum element is present at location gain[%d][%d] and it's value is


%d.\n", location1,location2, maximum);

int array[]={location1,location2,maximum};

return(array);

//********************************************************************

int * calculate(int matrix[100][100],int vertex)


{
int i=0,j=0,step=0;
int vertexby2=vertex/2;
int imprCost[100]={0}, extCost[100]={0}, intCost[100]={0}, q2[100]={0},
q1[100]={0};;

for (i = 0; i < (vertexby2); i++)


{
for (j = 0; j < vertexby2; j++){
intCost[i]=intCost[i]+ matrix[i][j]; //calculate intcost for P1 elements
}

for (j = vertexby2; j < vertex; j++){


extCost[i]=extCost[i]+ matrix[i][j];//calculate external cost for P1
elements
}

imprCost[i]=extCost[i]-intCost[i];
}

for (i = vertexby2; i < vertex; i++)


{
for (j = 0; j < vertexby2; j++){
extCost[i]=extCost[i]+ matrix[i][j]; //calculate extcost for P2 elements
}
for (j = vertexby2; j < vertex; j++){
intCost[i]=intCost[i]+ matrix[i][j];//calculate intcost for P2 elements
}
imprCost[i]=extCost[i]-intCost[i];

return (imprCost);

//

//********************************************************************

int main()
{
int
i=0,j=0,k=0,flag1=0,flag2=0,x=0,y=0,location1=0,location2=0,q=0,vertex=0,vertexby2=
0;
int part1[100], part2[100];
int copypart1[100];
int copypart2[100];

int imprCost[100]={0}, extCost[100]={0}, intCost[100]={0};


int G[100]={0}, q1[100]={0},q2[100]={0};
int l1[100]={100}, l2[100]={100};

printf("Enter total number of nodes: ");


scanf("%d",&vertex);
vertexby2=vertex/2;

printf("Enter first partition nodes : ");


for(i=0; i<(vertexby2);i++)
{
scanf("%d",&part1[i]);
}

printf("Enter second partition nodes : ");


for(i=0;i<(vertex/2);i++)
{
//printf("%d i is : ",i);
scanf("%d",&part2[i]);
}
printf("\nPartition1 contatins: ");
for(i=0; i<(vertex/2);i++)
{
printf("%d ",part1[i]);

printf("\nPartition2 contatins: ");


for(i=0; i<(vertex/2);i++)
{
printf("%d ", part2[i]);//printing P2 elements

}
printf("\n");

// Enter Cutset Matrix

//for(i=0;i<vertex;i++)
//{
// for(j=0;j<vertex;j++)
// {
// printf(" [%d][%d] element is : ",i,j);
// scanf("%d", &matrix[i][j]);
// }
//}

// print entered matrix

int matrix[100][100]={
{ 0,1,1,1,0,0},
{ 1,0,0,0,0,0},
{ 1,0,0,0,1,1},
{ 1,0,0,0,0,0},
{ 0,0,1,0,0,1},
{ 0,0,1,0,1,0}

};

for(i=0;i<vertex;i++)
{
for(j=0;j<vertex;j++)
{

printf(" %d", matrix[i][j]);


}
printf("\n");
}

/* Copying data from array 'part1' to array copypart1*/


for (i = 0; i <vertexby2; i++) {
copypart1[i] = part1[i];
}

/* Copying data from array 'part2' to array copypart2 */


for (i = 0; i <vertexby2; i++) {
copypart2[i] = part2[i];
}

k=vertexby2;

//**************************************
//calculate D, E I

int *p = calculate(matrix,vertex); //calculating Improvement, Internal and External


Cost

printf("\n Cost Improvement: ");

for(i=0;i<vertex;i++)
{
imprCost[i]=*p;
p=p+1;
printf("%d ",imprCost[i]);
}

//*****************************

while(k>0)
{
int maximum_gain=0;

int * q= calculate_gain(imprCost,vertex,matrix,l1,l2,flag1,flag2);
location1=*q;
location2=*(q+1);
maximum_gain=*(q+2);

l1[x]=location1;
flag1++;
l2[y]=location2;
flag2++;
G[x]=G[x]+maximum_gain;
x++;
y++;

int * r= update_Improvement(vertex, imprCost,matrix,location1,location2);

printf("\nUpdated Improvement cost: ");

for(i=0;i<vertex;i++)
{
imprCost[i]=*r;
r=r+1;
printf(" %d ",imprCost[i]);
}
printf("\n\n");

int location3=(vertexby2)+location2;

for(i=0;i<vertex;i++)
{
matrix[location1][i]=0;
matrix[location3][i]=0;
matrix[i][location1]=0;
matrix[i][location3]=0;
}
imprCost[location1]=0;
imprCost[location3]=0;

k=k-1;

int max=G[0];
j=0;
for(i=0;i<vertexby2;i++)
{
if(G[i]>max)
{
max=G[i];
}
}
for(i=0;i<vertexby2;i++)
{
if(G[i]==max)
{
if(G[i]>0)
{
i=j;
printf("\nCumilative Maximum Gain is: %d\n", max);
printf("\n Maximum Gain is found for k= %d\n",(i+1));
printf("\nvertex %d from Partition A and %d from partition2 will be swaped
for least cut",part1[l1[j]],(part2[l2[j]]));
copypart1[l1[j]]=part2[l2[j]];
copypart2[l2[j]]=part1[l1[j]];

printf("\n Optimized Partition1 contatins: ");


for(i=0; i<(vertex/2);i++)
{
printf("%d ",copypart1[i]);

printf("\n Optimized Partition2 contatins: ");


for(i=0; i<(vertex/2);i++)
{
printf("%d ", copypart2[i]);//printing P2 elements

}
printf("\n");

}
else
{
printf("No Improvement Found");
}

}
}

You might also like