#include <iostream>
#include <cmath>
using namespace std;
/********************************************************/
     /*常數定義*/
/********************************************************/
 const int n_features_number=5;//輸入特徵值數目
 const int np_pattern_number=12;  //樣本總數量
 const int k_up=100; //最大群組上限
/********************************************************/
     /*定義變數*/
/********************************************************/
 int i,j,n,k,a_i,a_j,a_n,a_k,b_k,change_true=0; //變數使用
 float in[n_features_number]={0}; //輸入樣本暫存區
 float a_temp; //變數使用
 int i_temp;
/********************************************************/
     /*定義參數*/
/********************************************************/
 int times=0;//訓練次數
 float distance_parameter=0.5; //邊限大小
 float M[k_up]={1}; //k群的樣本數
 float Z[n_features_number][k_up]={0}; //k群各特徵的中心位置
 float WU[n_features_number][k_up]={0};//k群各特徵的上限
 float WL[n_features_number][k_up]={0};//k群各特徵的下限
 float X[n_features_number][np_pattern_number]={0.88,0.85,0.04,0.03,0.02,0.02,0.01,0.1,0.82,0.02,0.01,0.1,
0.22,0.25,0.98,0.96,0.41,0.45,0.02,0.03,0.28,0.91,0.48,0.03,
0.02,0.06,0.1,0.12,0.43,0.42,0.01,0.02,0.05,0.08,0.48,0.02,
0.04,0.02,0.02,0.04,0.34,0.28,0.05,0.03,0.04,0.01,0.36,0.03,
0.06,0.01,0.02,0.03,0.15,0.29,0.04,0.04,0.03,0.02,0.2,0.04};//輸入的樣本
 int out[n_features_number]={0};//第i個樣本被分類於第k類
 float ED[k_up]={0};//計算可拓距離之暫存區
/********************************************************/
/*
     求陣列中最小值位置
     mED[]:輸入陣列
     m_k:輸入陣列大小
     mnumber:最小值
*/
/********************************************************/
int calculate_min_place(float mED[],float mnumber,int m_k)
{
 int temp_k=0,temp=0;
 for (temp=0;temp<m_k;temp++)
 {
  if (mnumber==mED[temp])
   temp_k=temp;
 }
 return temp_k;
}
/********************************************************/
/*
     求陣列中最小值
     mED[]:輸入陣列
     m_k:輸入陣列大小
*/
/********************************************************/
float min(float mED[],int m_k)
{
 float min_num=mED[1];
 int temp;
 for (temp=1;temp<m_k;temp++)
 {
  if (min_num>mED[temp])
   min_num=mED[temp];
 }
 return min_num;
}
/********************************************************/
/*
     建立一組新的群組
     cX[][]:輸入樣本
     cZ[][]:k群中心點
     cWU[][]:k群上限
     cWL[][]:k群下限
     c_k:第k群
     c_n:特徵植數目
     c_i:第i組樣本
*/
/********************************************************/
void create_cluster(int c_i,float cX[][np_pattern_number],int c_k,int c_n,float cZ[][k_up],float cWU[][k_up],float cWL[][k_up],float c_distance_parameter)
{
 int j;
 for (j=0;j<c_n;j++)
 {
  cZ[j][c_k]=cX[j][c_i];
  cWU[j][c_k]=cZ[j][c_k]+c_distance_parameter;
  cWL[j][c_k]=cZ[j][c_k]-c_distance_parameter;
 }
}
/********************************************************/
/*
     計算k類第i筆可拓距離
     cX[][]:輸入樣本
     cZ[][]:k群中心點
     cWU[][]:k群上限
     cWL[][]:k群下限
     c_k:第k群
     c_n:特徵植數目
     c_i:第i組樣本
*/
/********************************************************/
float calculate_ED(int c_i,float cX[][np_pattern_number],int c_k,int c_n,float cZ[][k_up],float cWU[][k_up],float cWL[][k_up])
{
 float ED_total=0,a,b,c;
 int j;
 for (j=0;j<c_n;j++)
 {
  a=cX[j][c_i]-cZ[j][c_k];
  if(a<0)
   a=0-a;
  b=cWU[j][c_k]-cWL[j][c_k];
  if(b<0)
   c=0-b;
  else
   c=b;
  ED_total+=((a-(b/2))/(c/2))+1;
  //cout<<a<<" "<<b<<" "<<c<<" ";
 }
 return ED_total;
}
/********************************************************/
/*
     更新權重上下限以及中心點
     cM[k_up]:
     cX[][]:輸入樣本
     cZ[][]:k群中心點
     cWU[][]:k群上限
     cWL[][]:k群下限
     c_k:第k群
     c_n:特徵植數目
     c_i:第i組樣本
*/
/********************************************************/
void updata_cluster(int c_n,int c_k,int c_i,float cX[][np_pattern_number],float cZ[][k_up],float cWU[][k_up],float cWL[][k_up],float cM[k_up])
{
 int j;
 for(j=0;j<c_n;j++)
 {
  cWU[j][c_k]=cWU[j][c_k]+(1/(cM[c_k]+1)*(cX[j][c_i]-cZ[j][c_k]));
  cWL[j][c_k]=cWL[j][c_k]+(1/(cM[c_k]+1)*(cX[j][c_i]-cZ[j][c_k]));
  cZ[j][c_k]=(cWU[j][c_k]+cWL[j][c_k])/2;
 }
 cM[c_k]+=1;
}
/********************************************************/
/*
     修正權重上下限以及中心點
     cM[k_up]:
     cX[][]:輸入樣本
     cZ[][]:k群中心點
     cWU[][]:k群上限
     cWL[][]:k群下限
     c_k:第k群
     c_n:特徵植數目
     c_i:第i組樣本
*/
/********************************************************/
void change_cluster(int c_n,int c_k,int c_i,float cX[][np_pattern_number],float cZ[][k_up],float cWU[][k_up],float cWL[][k_up],float cM[k_up])
{
 int j;
 for(j=0;j<c_n;j++)
 {
  cWU[j][c_k]=cWU[j][c_k]-(1/cM[c_k])*(cX[j][c_i]-cZ[j][c_k]);
  cWL[j][c_k]=cWL[j][c_k]+(1/cM[c_k])*(cX[j][c_i]-cZ[j][c_k]);
  cZ[j][c_k]=(cWU[j][c_k]+cWL[j][c_k])/2;
 }
 cM[c_k]-=1;
}
/********************************************************/
/*
    測試~~~~~~~~~~~~~~~~~~~~~~~
*/
/********************************************************/
void test(float x[2][5])
{
 for(int i=0;i<10;i++)
  x[i%2][i%5]++;
}
void xd(int &x)
{
 x=5;
}
/********************************************************/
/*
     主程式~~~~~~~~~~~~~~~
*/
/********************************************************/
void main()
{
 /*
 int tttt[10][4]={0,1,2,3
     ,4,5,6,7
     ,8,9,0,1
     ,2,3,4,5
     ,6,7,8,9
     ,0,1,2,3
     ,4,5,6,7
     ,8,9,0,1
     ,2,3,4,5
     ,6,7,8,9};
 cout<<"test:"<<endl;
 cout<<tttt[9][2]<<endl;
 */
/*************/
//測試專用區
/*
 const int n_features_number=10;//輸入特徵值數目
 const int np_pattern_number=100;  //樣本總數量
 const int k_up=100; //最大群組上限
 float distance_parameter; //邊限大小
 float M[k_up]={1}; //k群的樣本數
 float Z[n_features_number][k_up]={0}; //k群各特徵的中心位置
 float WU[n_features_number][k_up]={0};//k群各特徵的上限
 float WL[n_features_number][k_up]={0};//k群各特徵的下限
 float X[n_features_number][np_pattern_number]={0};//輸入的樣本
*/
/*************/
 cout<<"歡迎測試使用ENN2演算法:n請依照下列輸入內容進行輸入,n請輸入Landa值:";
 cin>>distance_parameter;
 cout<<distance_parameter;
 cout<<"n請輸入訓練次數:";
 cin>>times;
 cout<<times;
 cout<<"n請輸入特徵數數量:";
 cin>>a_n;
 cout<<a_n;
 cout<<"n共幾筆資料:";
 cin>>a_i;
 cout<<a_i;
 cout<<endl;
 cout<<"分類中……………..";
 k=0;
 a_k=0;
 i=0;
 out[1]=0;
/*
 for(n=1;n<=a_n;n++)
  X[n][i]=in[n];
*/
 create_cluster(i,X,a_k,a_n,Z,WU,WL,distance_parameter);
 for(i=1;i<a_i;i++)
 {
/*
  for(n=1;n<=a_n;n++)
   X[n][i]=in[n];
*/
  for(k=0;k<=a_k;k++)
  {
   ED[k]=calculate_ED(i,X,k,a_n,Z,WU,WL);
   cout<<ED[k]<<" ";
  }
  a_temp=min(ED,a_k);
  b_k=calculate_min_place(ED,a_temp,a_k);
  if(a_temp<a_n)
  {
   updata_cluster(a_n,k,i,X,Z,WU,WL,M);
   out[i]=b_k;
  }
  else
  {
   a_k+=1;
   if(a_k>=k_up)
    a_k=k_up;
   create_cluster(i,X,a_k,a_n,Z,WU,WL,distance_parameter);
   out[i]=a_k;
  }
 }//for(i=2;i<=a_i;i++)
Ltt:
 while(times>0)
 {
  for(i=0;i<a_i;i++)
  {
/*
   for(n=1;n<=a_n;n++)
    X[n][i]=in[n];
*/
   for(k=0;k<=a_k;k++)
    ED[k]=calculate_ED(i,X,k,a_n,Z,WU,WL);
   a_temp=min(ED,a_k);
   b_k=calculate_min_place(ED,a_temp,a_k);
   if(a_temp<a_n)
   {
    updata_cluster(a_n,k,i,X,Z,WU,WL,M);
    if(out[i]!=b_k)
    {
     change_cluster(a_n,out[i],i,X,Z,WU,WL,M);
     out[i]=b_k;
     change_true=1;
    }
   }
   else
   {
    a_k+=1;
    if(a_k>=k_up)
     a_k=k_up;
    create_cluster(i,X,a_k,a_n,Z,WU,WL,distance_parameter);
    out[i]=a_k;
    change_true=1;
   }
  }//for(i=1;i<=a_i;i++)
  times–;
 }//while(times>0)
 if (change_true==1)
 {
  change_true=0;
  goto Ltt;
 }
 cout<<endl;
 cout<<"分類完畢。n";
 for(i_temp=1;i_temp<=a_i;i_temp++)
  cout<<out[i_temp]<<endl;
 //cout<<a_k;
 system("PAUSE");
}//main
 
依照那個爛老師寫的PAPER流程錯誤怎麼可能會寫出來!還有他公式也好像有問題,
一句話就是爛!