📄 pr_hcm.cpp
字号:
#include"PR_HCM.h"
#include<stdlib.h>
#include<math.h>
#define MIN(x,y) (((x)>(y))?(y):(x))
#define MAX(x,y) (((x)<(y))?(y):(x))
PR_HCM::PR_HCM(int m,int n):num_iterations(m-1),
num_cluster(m),distype(SHORTEST),
min1(0),min2(0),
K_num(m,1)
{
PR_unit unit;
char buf[10];
for(int i=0;i<m;i++)
{
samples.push_back(unit);
_itoa(i,buf,10);
cluster.push_back(buf);
}
}
PR_HCM::PR_HCM(std::ifstream &fin)
{
int m(0),n(0);
if(!fin)return;
std::string str;
char buf[10];
while(!fin.eof())
{
getline(fin,str);//get the number of the samples
_itoa(m,buf,10);
cluster.push_back(buf);
m++;
PR_unit unit;
for(int i=0;i<str.size();i++)
{
std::string t_str;
while(str[i] != ' '&& str[i] != '\n' && i<str.size())
{
t_str.push_back(str[i]);
i++;
}
//std::cout<<t_str<<std::endl;
unit.unit.push_back(atof(t_str.c_str()));
if(1 == m)
{
n++;
}
}
samples.push_back(unit);
}
num_iterations = m-1;
num_cluster = m;
distype = SHORTEST;
min1=0;
min2=0;
for(int i=0;i<m;i++)
{
K_num.push_back(1);
}
//std::cout<<"mn:"<<m<<"\t"<<n<<std::endl;
}
void PR_HCM::Set_iternum(int num)
{
num_iterations = num;
}
void PR_HCM::PrintSamples()
{
for(std::vector< PR_unit >::size_type i=0;i<samples.size();i++)
{
std::cout<<i<<":\t";
samples[i].Print();
std::cout<<std::endl;
}
}
void PR_HCM::Choosetwo()
{
double dd = dis[0];
int n=0;
for(int i=0;i< num_cluster;i++)
{
for(int j=0;j< i;j++)
{
if(dis[n] <= dd)
{
dd = dis[n];
min1 = i;//j<i
min2 = j;//min2<min1
}
n++;
}
}
//std::cout<<min1<<"\t"<<min2<<std::endl;
}
void PR_HCM::PrintCluster()
{
std::cout<<"The cluster are:\n";
for(std::vector< std::string >::size_type i=0;i<cluster.size();i++)
{
std::cout<<cluster[i]<<"\t";
}
std::cout<<std::endl;
}
void PR_HCM::PrintDis()
{
int n=0;
for(int i=0;i< num_cluster;i++)
{
for(int j=0;j< i;j++)
{
std::cout<<dis[n]*dis[n]<<"\t";
n++;
}
std::cout<<std::endl;
}
/*for(int i=0;i<dis.size();i++)
{
std::cout<<dis[i]*dis[i]<<"\t";
}*/
}
void PR_HCM::SetDistype(DisType type)
{
distype = type;
}
void PR_HCM::CalcDis()
{
for(int i=0;i< samples.size();i++)
{
for(int j=0;j< i;j++)
{
dis.push_back(distance(samples[i],samples[j]));
}
}
}
void PR_HCM::Mergingcluster()
{
cluster[min2] = "(" + cluster[min2] + "," + cluster[min1] + ")";
cluster.erase(cluster.begin()+min1);
}
int PR_HCM::serial(int i,int j)
{
if(i>j)
{
return i*(i-1)/2 + j;
}
else
{
return j*(j-1)/2 + i;
}
}
double PR_HCM::ChooseDis(int h,int i,int j)
{
double res;
double ai,aj,b,g;
double Dhi,Dhj,Dij;
Dhi = dis[serial(h,i)];
Dhj = dis[serial(h,j)];
Dij = dis[serial(i,j)];
//std::cout<<Dhi*Dhi<<"\t"<<Dhj*Dhj<<"\t"<<Dij*Dij<<"\n";
switch(distype)
{
case SHORTEST:
{
ai=0.5,aj=0.5,b=0,g=-0.5;
break;
}
case LONGEST:
{
ai=0.5,aj=0.5,b=0,g=0.5;
break;
}
case MIDDLE:
{
break;
}
case AVERAGE:
{
break;
}
case CENTERGRAVITY:
{
ai=0.5,aj=0.5,b=-0.25,g=0;
break;
}
default:
break;
}
res = sqrt( ai*Dhi*Dhi + aj*Dhj*Dhj + b*Dij*Dij + g*fabs(Dhi*Dhi - Dhj*Dhj));
return res;
}
void PR_HCM::UpdateDis()
{
std::vector<double> dis_temp;
for(int i=0;i< num_cluster;i++)
{
for(int j=0;j< i;j++)
{
if( i != min1 && i!= min2 )
{
if(j != min2 && j!= min1)
{
dis_temp.push_back(dis[serial(i,j)]);
}
else if( j == min2)
{
dis_temp.push_back(ChooseDis(i,min1,min2));
}
else if( j == min1)
{
continue;
}
}
else if(i == min2)
{
if(j != min2 && j!= min1)
{
dis_temp.push_back(ChooseDis(j,min1,min2));
}
else
{
continue;
}
}
else if(i == min1)
{
continue;
}
}
}
dis = dis_temp;
}
void PR_HCM::Rend()
{
CalcDis();
//PrintDis();
for(int i=0;i<num_iterations;i++)//
{
Choosetwo();
Mergingcluster();
UpdateDis();
num_cluster--;
PrintDis();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -