#include<iostream.h>
void main()
{
int i,i1,i2,i3,m,n,z,d;
double a,b,j;
int c[20];
double p[20];
int x[20];
int y[20];
double xm[20];
double ym[20];
int x1[20][20];
int y1[20][20];
x[0]=0;x[1]=1;x[2]=0;x[3]=1;x[4]=2;x[5]=1;x[6]=2;x[7]=3;x[8]=6;x[9]=7;x[10]=8;
x[11]=6;x[12]=7;x[13]=8;x[14]=9;x[15]=7;x[16]=8;x[17]=9;x[18]=8;x[19]=9;
y[0]=0;y[1]=0;y[2]=1;y[3]=1;y[4]=1;y[5]=2;y[6]=2;y[7]=2;y[8]=6;y[9]=6;y[10]=6;
y[11]=7;y[12]=7;y[13]=7;y[14]=7;y[15]=8;y[16]=8;y[17]=8;y[18]=9;y[19]=9;
for(i=0;i<=19;i++)
{
z=0;
for(i1=0;i1<20;i1++)
{
c[i1]=0;
p[i1]=0;
xm[i1]=0;
ym[i1]=0;
for(i2=0;i2<20;i2++)
{
x1[i1][i2]=0;
y1[i1][i2]=0;
}
}
for(i1=0;i1<=i;i1++)
{
x1[i1][0]=x[i1];
y1[i1][0]=y[i1];
c[i1]=1;
}
if(i!=19)//把剩余的坐标分到聚类里
{
for(i1=i+1;i1<20;i1++)
{
a=(x[i1]-x[0])*(x[i1]-x[0])+(y[i1]-y[0])*(y[i1]-y[0]);
n=0;
for(i2=0;i2<=i;i2++)
{
b=(x[i1]-x[i2])*(x[i1]-x[i2])+(y[i1]-y[i2])*(y[i1]-y[i2]);
if(a>=b)
{
a=b;
n=i2;
}
}
c[n]=c[n]+1;
m=c[n];
x1[n][m-1]=x[i1];
y1[n][m-1]=y[i1];
}
}
leap:
for(i1=0;i1<=i;i1++)//求M直的横坐标
{
b=0;
d=c[i1];
for(i2=0;i2<d;i2++)
{
b=b+x1[i1][i2];
}
xm[i1]=b/d;
}
for(i1=0;i1<=i;i1++)//求M直的纵坐标
{
b=0;
d=c[i1];
for(i2=0;i2<d;i2++)
{
b=b+y1[i1][i2];
}
ym[i1]=b/d;
}
for(i1=1;i1<=i;i1++)
{
d=c[i1];
if(d>=2)
{
for(i2=0;i2<d;i2++)
{
for(i3=0;i3<=i;i3++)
{
a=(x1[i1][i2]-xm[i3])*(x1[i1][i2]-xm[i3])+(y1[i1][i2]-ym[i3])*(y1[i1][i2]-ym[i3]);
d=c[i3];
p[i3]=a*d/(d+1);
}
a=(x1[i1][i2]-xm[i1])*(x1[i1][i2]-xm[i1])+(y1[i1][i2]-ym[i1])*(y1[i1][i2]-ym[i1]);
d=c[i1];
p[i1]=a*d/(d-1);
for(i3=0;i3<=i;i3++)
{
if(p[i1]>=p[i3])
{
n=i3;
}
}
if(n=!i1)
{
d=c[n];
x1[n][d]=x1[i1][i2];
y1[n][d]=y1[i1][i2];
c[n]=c[n]+1;
c[i1]=c[i]-1;
goto leap;
}
}
}
}
j=0;
for(i1=0;i1<=i;i1++)
{
a=c[i1];
for(i2=0;i2<a;i2++)
{
j=j+(x1[i1][i2]-xm[i1])*(x1[i1][i2]-xm[i1])+(y1[i1][i2]-ym[i1])*(y1[i1][i2]-ym[i1]);
}
}
cout<<"当C="<<i+1<<"时,j="<<j<<endl;
for(i1=0;i1<=i;i1++)
{
a=c[i1];
cout<<"第"<<i1+1<<"类样本:"<<" ";
for(i2=1;i2<=a;i2++)
{
cout<<"( "<<x1[i1][i2-1]<<" , "<<y1[i1][i2-1]<<" ) ";
}
cout<<endl;
}
cout<<endl;
}
}
评论0