⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seminaive.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 // SemiNaiveDoc.cpp: implementation of the CSemiNaiveDoc class.
//
//////////////////////////////////////////////////////////////////////

/////aaaaaaaaaaaaaaaa


//#include "ZssWidthScaler.h"
//#include "ZssWidthScalar.h"
#include "String.h"
#include "stdlib.h"
#include "math.h"
#include "stdafx.h"
#include "../RSet.h"
#include "fstream.h"
#include "SemiNaive.h"
#define ZSSLEN 15

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSemiNaive::CSemiNaive()
{
	//InfoTable=NULL;
	Cut=NULL;
	NewTable=NULL;
	MidCut=NULL;
	pAttName=NULL;
	pDataType=NULL;
	pStringTable=NULL;
    pStringTableResult=NULL; 
    pStrResult=NULL; 
    strCuts=NULL; 
    pNonStringTable=NULL; 
}

CSemiNaive::~CSemiNaive()
{
	int i;	
	if(Cut!=NULL)
	{
		for(i=0;i<iNonStrAttNum;i++)
			delete []Cut[i];
		delete []Cut;
	}
	if(NewTable!=NULL)
	{
		for(i=0;i<iRecordNum;i++)
			delete []NewTable[i];
		delete []NewTable;
	}
	if(MidCut!=NULL)
	{
		for(i=0;i<iNonStrAttNum;i++)
			delete []MidCut[i];
		delete []MidCut;
	}
	if(pAttName)
	{
		for(i=0;i<iNonStrAttNum;i++)
			delete []pAttName[i];
		delete[] pAttName;
	}
	
	if(pDataType)
	{
		for(i=0;i<iNonStrAttNum+1;i++)
			delete []pDataType[i];
		delete[] pDataType;
	}
	if(pStringTable!=NULL)
	{
		for(i=0;i<iRecordNum;i++)
		{
			for(int j=0;j<iStrAttNum;j++)
				delete[] pStringTable[i][j];
			delete[] pStringTable[i];
		}
		delete[] pStringTable;
	}
    if(pStringTableResult!=NULL){ 
        for(i=0;i<iRecordNum;i++) 
            delete[] pStringTableResult[i]; 
        delete[] pStringTableResult; 
        }   
    if(pStrResult){ 
        for(i=0;i<iRecordNum;i++){ 
            for(int j=0;j<iStrAttNum;j++) 
                delete[] pStrResult[i][j]; 
            delete[] pStrResult[i]; 
        } 
        delete[] pStrResult; 
    } 
    if(pNonStringTable){ 
        for(i=0;i<iRecordNum;i++) 
            delete[] pNonStringTable[i]; 
        delete[] pNonStringTable; 
    } 
    if(strCuts) 
        delete[] strCuts; 
}

BOOL CSemiNaive::OnSemiNaivedis()
{//具体实现离散化的地方
	 GetMidCut();
	 GetCut();
     GetNewTable();		
	 if(iStrAttNum!=0) 
        doString(); 
     return TRUE;
}

//把每个属性上出现的不同的值存入MidCut数组中,并按从小到大的顺序进行排序
void CSemiNaive::GetMidCut()
{
	int i,j,k; 
    int num=0; 
    int num1=0; 
    int flag=0; 
    MidCut=new float*[iNonStrAttNum]; 
    Cut=new float*[iNonStrAttNum]; 
    //MidCut为后选的断点集的上下界的集合, 
    //MidCut[i][0]为第i个属性后选的断点集的上下界的个数 
    //MidCut[i]是经过排序的,由小到大 
    for(i=0;i<iNonStrAttNum;i++) 
    { 
        float exchange; 
        float *Mid; 
        Mid=new float[iRecordNum+1]; 
        Mid[++num]=pNonStringTable[0][i]; 
        for(j=1;j<iRecordNum;j++) 
        { 
            for(k=1;k<=num;k++) 
            { 
              if(pNonStringTable[j][i]==Mid[k]) 
              { 
                  flag=1; 
                  break; 
              } 
            } 
           if(flag==0) 
           { 
               Mid[++num]=pNonStringTable[j][i]; 
  
           } 
           flag=0; 
        } 
           Mid[0]=(float)num; 
           MidCut[i]=new float[num+1]; 
           Cut[i]=new float[num]; 
           Cut[i][0]=0; 
           MidCut[i][0]=Mid[0]; 
           for(j=1;j<num;j++) 
               for(k=j+1;k<=num;k++) 
                   if(Mid[j]>Mid[k]) 
                   { 
                       exchange=Mid[j]; 
                       Mid[j]=Mid[k]; 
                       Mid[k]=exchange; 
                   } 
                for(j=1;j<=num;j++) 
                   MidCut[i][++num1]=Mid[j]; 
            delete []Mid; 
            num=0; 
            num1=0; 
            flag=0; 
    } 
}
//计算出每个属性的断点,并保存在cut数组中,cut[i][0]保存了第i个属性的断点个数
void CSemiNaive::GetCut()
{
	int DeciNum;
    //DeciNum为决策种类的个数
    int i,j,k,m;
	DeciNum=GetDeciNum();
    float *DeciValue;
    DeciValue=GetDeciValue();
	int CutNum;
	int j1;
	int num;
	int num1;
	Cut=new float*[iAttNum];
	//Cut存放的是两个属性值的中间值,即实际的断点值	   
   for(i=0;i<iNonStrAttNum;i++)
	{
	   	CutNum=0;
	    Cut[i]=new float[(int)MidCut[i][0]];

     for(j=1;j<(int)MidCut[i][0];j++)
		{
            float **valuej;
			float **valuej1;
		    j1=j+1;

			valuej=new float*[DeciNum+1];
	
			for(k=0;k<DeciNum+1;k++)
				valuej[k]=new float[2];
	//value为每一个断点的上下界所决定的决策的个数,
	//value[0][0]为最多决策的个数
    //value[DeciNum][0]为条件属性值对应的决策
    //value[DeciNum][1]为条件属性值对应的决策的数目
			valuej1=new float*[DeciNum+1];
			
			for(k=0;k<DeciNum+1;k++)
				valuej1[k]=new float[2];	
            

		   for(k=1;k<=DeciNum;k++)
			     valuej[k][0]=DeciValue[k-1];
           
		   for(k=1;k<=DeciNum;k++)
			     valuej1[k][0]=DeciValue[k-1];
		   
		   for(k=1;k<=DeciNum;k++)
			   valuej[k][1]=0;
		   
		   for(k=1;k<=DeciNum;k++)
			   valuej1[k][1]=0;
          
		   for(k=0;k<iRecordNum;k++)
				   if( pNonStringTable[k][i]==MidCut[i][j])
				   {
					   for(m=0;m<DeciNum;m++)
						   if( pNonStringTable[k][iNonStrAttNum]==valuej[m+1][0])
						   {
							   valuej[m+1][1]++;
						   }
				   }
    
		 for(k=0;k<iRecordNum;k++)
			 if( pNonStringTable[k][i]==MidCut[i][j1])
				   {
					   for(m=0;m<DeciNum;m++)
						   if( pNonStringTable[k][iNonStrAttNum]==valuej1[m+1][0])
						   {
							   valuej1[m+1][1]++;
						   }
				   }
         
	    float mid;
	    float mid1;
	    for(k=1;k<DeciNum;k++)
            for(m=k+1;m<=DeciNum;m++)
			{
			      if(valuej[k][1]<valuej[m][1])
				  {
			      mid=valuej[k][1];
			      mid1=valuej[k][0];
			      valuej[k][1]=valuej[m][1];
			      valuej[k][0]=valuej[m][0];
			      valuej[m][1]=mid;
                  valuej[m][0]=mid1;
				  }
			}
        num=1;
	   for(k=1;k<DeciNum;k++)
		   if(valuej[k+1][1]==valuej[1][1])
			   num++;
		   valuej[0][0]=(float)num;
		   num=0;

		   for(k=1;k<DeciNum;k++)
			   for(m=k+1;m<=DeciNum;m++)
			   {
                if(valuej1[k][1]<valuej1[m][1])
				{
			     mid=valuej1[k][1];
			     mid1=valuej1[k][0];
			     valuej1[k][1]=valuej1[m][1];
			     valuej1[k][0]=valuej1[m][0];
			     valuej1[m][1]=mid;
                 valuej1[m][0]=mid1;
				}
			   }
       num1=1;
	   for(k=1;k<DeciNum;k++)
		   if(valuej1[k+1][1]==valuej1[1][1])
			   num1++;
		   valuej1[0][0]=(float)num1;
		   num1=0;

	  if((int)valuej[0][0]<(int)valuej1[0][0])
	  {
		  for(k=0;k<(int)valuej[0][0];k++)
			  for(m=0;m<(int)valuej1[0][0];m++)
				  if(valuej[k+1][0]==valuej1[m+1][0])
				    num++;
              if(num!=(int)valuej[0][0])
			  Cut[i][++CutNum]=(MidCut[i][j]+MidCut[i][j1])/2;
	  }
	  else if((int)valuej[0][0]>=(int)valuej1[0][0])
	  {
		  for(k=0;k<(int)valuej1[0][0];k++)
			  for(m=0;m<(int)valuej[0][0];m++)
				  if(valuej1[k+1][0]==valuej[m+1][0])
				    num1++;
              if(num1!=(int)valuej1[0][0])
				  Cut[i][++CutNum]=(MidCut[i][j]+MidCut[i][j1])/2;
	  }
	  for(k=0;k<DeciNum+1;k++)
	  {
	 	  delete []valuej[k];
          delete []valuej1[k];
	  }
	  delete []valuej;
	  delete []valuej1;
	  }
	  Cut[i][0]=(float)CutNum;
	 }
	 delete DeciValue;

}
//根据所产生的断点集得到离散化后的决策表并存入NewTable中
void CSemiNaive::GetNewTable()
{
  int i,j,k;
   int m;
   NewTable=new int *[iRecordNum];
   for(i=0;i<iRecordNum;i++)
   {
	   NewTable[i]=new int[iNonStrAttNum+1];
       for(j=0;j<iNonStrAttNum;j++)
	   {
		    m=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -