#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <time.h>
#include "math.h"
typedef struct CPoint{
unsigned int num;
double x;
double y;
}Cpoint ;
double Distance( Cpoint &,Cpoint &);
bool Rw(CPoint &,Cpoint &);
Cpoint ComputeCndt(Cpoint a[],int n);
bool Rw_k(Cpoint newd[],Cpoint oldd[],short Numk);
void initSumdot(short Numk);
void ChangeCntd(Cpoint newd[],Cpoint oldd[],short Numk);
CPoint Sumdot[30][500];
short count[30];
CPoint Clscntdt[30];
int main()
{
CPoint Srandot[500];
Cpoint oldd[30];
int Rdot1,Rdot2;
srand( (unsigned)time( NULL ) );
short K;
cout<<"要分几类:(0~30)"<<endl;
cin>>K;
initSumdot(K);
//初始化随机数据
for (int i=0;i<500;i++)
{
Srandot[i].num=i;
Srandot[i].x=rand()%1000;//
Srandot[i].y=1000*rand()/RAND_MAX;
}
for (i=0;i<500;i++)
{
cout<<Srandot[i].num<<" ("<<Srandot[i].x<<" "<<Srandot[i].y<<") "<<endl;
}
//初始化中心点
for(i=0;i<K;i++)
{
Rdot1=rand()%500;
Rdot2=rand()%500;
while(Rdot1==Rdot2)
{
Rdot2=rand()%500;
}
Clscntdt[i]=Srandot[Rdot1];
oldd[i]=Srandot[Rdot2];
count[i]=0;
}
double Dsts[30],tem=0;
int m=0;
short num=0;
while(Rw_k(Clscntdt, oldd,K))
{
int j;
initSumdot(K);
ChangeCntd(Clscntdt,oldd,K);
for (i=0;i<K;i++)
{
count[i]=0;
}
for( j=0;j<500;j++)
{
for(int i=0;i<K;i++)
{
Dsts[i]=Distance(Srandot[j],oldd[i]);
}
tem=Dsts[0];
for(i=0;i<K;i++)
{
if (tem>=Dsts[i])
{
tem=Dsts[i];
num=i;
}
}
Sumdot[num][count[num]]=Srandot[j];
count[num]++;
}
//计算中心点
for ( m=0;m<K;m++)
{
Clscntdt[m].num=Sumdot[m][0].num;
for (int i=0;i<count[m];i++)
{
Clscntdt[m].x+=Sumdot[m][i].x;
Clscntdt[m].y+=Sumdot[m][i].y;
}
if(count[m]!=0){
Clscntdt[m].x/=count[m];
Clscntdt[m].y/=count[m];}
}
}
for(i=0;i<K;i++)
{
cout<<Clscntdt[i].num<<" ("<<Clscntdt[i].x<<" "<<Clscntdt[i].y<<") "<<endl;
cout<<count[i]<<endl;
}
return 0;
}
double Distance( Cpoint &a,Cpoint &b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool Rw(CPoint &a,Cpoint &b)
{
if(a.x!=b.x || a.y!=b.y )
return 1;
else return 0;
}
bool Rw_k(Cpoint newd[],Cpoint oldd[],short Numk)
{
for (int i=0;i<Numk;i++)
{
if (Rw(newd[i],oldd[i]))
return 1;
else return 0;
}
}
void ChangeCntd(Cpoint newd[],Cpoint oldd[],short Numk)
{
for(int i=0;i<Numk;i++)
oldd[i]=newd[i];
}
void initSumdot(short Numk)
{
for (int i=0;i<Numk;i++)
{
for (int j=0;j<500;j++)
{
Sumdot[i][j].x=0;
Sumdot[i][j].y=0;
}
}
}
- 1
- 2
前往页