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

📄 attentropyreducetwo.cpp

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

#include "stdafx.h"
#include "RSet.h"
#include "AttEntropyReduceTwo.h"

#include "stdio.h"
#include"math.h"
#include "stdlib.h"
#include "string.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define  MAX 100
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAttEntropyReduceTwo::CAttEntropyReduceTwo()
{
  pIntTable = NULL;
  pBlockTable = NULL;
  pAttName = NULL;
  pDataType = NULL;
  pAttReduce = NULL;
  struWCutRecord = NULL;
  iInteger = 0;
  iRecordNum = 0;
  iAttNum = 0;
  iBlockNum = 0;
  iStage = -1;
  bSaveTempResult = FALSE;
  bCuts = FALSE;//初始化为假,表示没有断点集合
  bBlock = FALSE;
}

CAttEntropyReduceTwo::~CAttEntropyReduceTwo()
{
  FreeContent();
}
bool CAttEntropyReduceTwo::AttEntropyTwo()
{	
//	double duration;
//	CString str;
   // clock_t  finish	,start;
//	start = clock();
    if(!InitTable())
		return false;
	if(!Create_Table())
		return false;//建立决策初始表
    if(!Reduct_Table()) //计算核属性的表格
		return false;
    if(!Get_Att(result,reduct_num))//得到属性值
		return false;
	return true;
  // finish = clock();
	//duration = (double)(finish - start) / CLOCKS_PER_SEC;
	//str.Format (" 约简运行时间:%f 秒",
		        //duration);
    //AfxMessageBox(str);  	
}
bool  CAttEntropyReduceTwo::GetData(char* FileName)//get the privilege pInformation from the file given.
{
	FILE* fp;

	//return when fail to read the file
	if((fp = fopen(FileName,"r")) == NULL)
	{
        AfxMessageBox("Can't open file!");
		return false; 
	}
   // cStyle= new char[100];
	fscanf(fp,"Style:%s\n",cStyle);
	fscanf(fp,"Stage:%d\n",&iStage);
	fscanf(fp,"Condition attributes number:%d\n",&iAttNum);
	fscanf(fp,"Records number:%d\n",&iRecordNum);
	//ipriRecNum=iRecNum;
	SetAttName(fp,iAttNum+1);
	SetDataType(fp,iAttNum+1);
	SetIntegerTable(fp,iAttNum+1,iRecordNum);//fill the integertable
	if(!SetCutResult(fp))
		return false;
	fclose(fp);
	return  true;
}

bool CAttEntropyReduceTwo::SetAttName(FILE* fp, int count)
{
	int i;
	if(pAttName == NULL)
	{
		try
		{
			pAttName = new char*[count];
		}
		catch(CMemoryException* e)
		{
			::MessageBeep(MB_ICONHAND);
			AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
			e->Delete();
			return FALSE;
		}

		for(i=0;i < count;i++)
		{
			try
			{
				pAttName[i]=new char[100];
			}
			catch(CMemoryException* e)
			{
				::MessageBeep(MB_ICONHAND);
				AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
				e->Delete();
				return FALSE;
			}
		}//end for
	}//end if

	for(i=0;i < count;i++)
		fscanf(fp,"%s",pAttName[i]);
	return true;
}

bool CAttEntropyReduceTwo::SetDataType(FILE *fp, int count)
{
	int i;
	if((pDataType = new char*[count])==0)
		return false;
	for(i = 0;i < count;i++)
	{
		if((pDataType[i]=new char[MAX])==0)
			return false;
	}//end for

	for(i = 0;i < count;i++)
		fscanf(fp,"%s",pDataType[i]);
	return true;
}

bool CAttEntropyReduceTwo::SetCutResult(FILE* fp)
{
	int n;
	int iColumn;
	int iCuts;
	struct WCutRecord* pHead = NULL;
	struct WCutRecord* pEnd = NULL;
	
	char* temp;
	if((temp= new char[MAX])==0)
		return false;            //MAX=1000
	if(fscanf(fp,"%s",temp) == -1)
	{
		delete[] temp;
		return true;
	}
	if(strcmp(temp,"[Cuts]") != 0)
	{
		delete[] temp;
		return false;
	}
//	bCuts = true;
	while(fscanf(fp,"%d",&iColumn) != -1)
	{
		fscanf(fp,"%d",&iCuts);
		if((pEnd = new WCutRecord)==0)
			return false;
		if((pEnd->cpCut=new char*[iCuts])==0)
			return false;
		for(int i=0;i<iCuts;i++)
		{
			if((pEnd->cpCut[i] = new char[MAX])==0)
				return false;
		}//end for
		pEnd->iColumn=iColumn;
		pEnd->iCuts=iCuts;
		pEnd->next=NULL;
		for(i=0;i<iCuts;i++)
		{
			fscanf(fp,"%s",temp);
			fscanf(fp,"%d",&n);
			strcpy(pEnd->cpCut[n],temp);
		}//end for
		if(pHead == NULL)
		{
			struWCutRecord = pEnd;//通过struWCutRecord来判断是否有断点集合
			pHead = pEnd;
		}//end if
		else
		{
			if(pHead->iColumn>=pEnd->iColumn)
			{
		    	AfxMessageBox("断点表设置有误!");
                struWCutRecord=NULL;
				return false;
			}
			pHead->next = pEnd;
			pHead = pEnd;
		}//end else
	}//end while

	delete[] temp;
	return true;
}
bool CAttEntropyReduceTwo::SetIntegerTable(FILE* fp,int column, int row)
{
	int i,j;
	char* string;
	if((string=new char[100])==0)
		return false;
	if((pIntTable = new int*[row])==0)
		return false;
	for(i = 0;i<row;i++)
	{
		if((pIntTable[i] = new int[column])==0)
			return false;
	}//end for

	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)
		{
			fscanf(fp,"%s",string);
			if(strcmp(string,"-") == 0)
				pIntTable[i][j] = -1;
			else
				pIntTable[i][j] = atoi(string);
		}//end for
	}//end for
	delete []string;
	return true;
}


///////////////////888888888///
bool CAttEntropyReduceTwo::InitTable()//输入离散后的初始化决策表
{
	int i,j;
    rec_num = iRecordNum;//记录对象数   
	con_num = iAttNum;//条件属性数
	if((info=new int *[rec_num])==0)
	{
       AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
		return false; //原始表,以转化为int 指针
	}
	for (i=0;i<rec_num;i++)
	  if((info[i]=new int [con_num+1])==0)
	  {
  	    AfxMessageBox("Out of the memory!",MB_OK|MB_ICONSTOP);
	   	return false;
	  }
	for (i=0;i<rec_num;i++)
	   for (j=0;j<con_num+1;j++)
		info[i][j] = pIntTable[i][j];  //I为对象数J 为条 info为里善后
		//的决策表 为后面作准备
	 return true;
}
bool CAttEntropyReduceTwo::SaveFile(char* pFileName)
{
	int *a;
	if((a=new int[iAttNum])==0)
		return false;//suanchude shuxing
	nSelected=0;
	int i,j,t,k,m=0,n;
	FILE* fp;
	if(nSelected == -1)
		return FALSE;
	if((fp = fopen(pFileName,"w")) == NULL)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("Couldn't save the file",MB_OK|MB_ICONSTOP);
		return FALSE;
	}//end if

	fprintf(fp,"Style:%s\n",cStyle);
	fprintf(fp,"Stage:%d\n",3);
//去除“—”的程序变化

    fprintf(fp,"Condition attributes number:%d\n",result_num);
	////
    for(i = 0;i < iAttNum;i++)
	{
		    t=0;
			for(k=0;k<result[nSelected][0];k++)
			{
				if(result[nSelected][k+1] == i) 
					t=1;
			}
			if(t!=1)
			    a[m++]=i;
	}
    fprintf(fp,"The Number of Condition attributes deleted:%d\n",m);
    fprintf(fp,"The position of Condition attributes deleted:");
	if(m>0)
	  for(i=0;i<m;i++)
	      fprintf(fp," %d",a[i]);
	fprintf(fp,"\n");
	fprintf(fp,"Records number:%d\n",iRecordNum);
	for(i = 0;i < iAttNum;i++)
	{
		    t=0;
			for(k=0;k<result[nSelected][0];k++)
			{
				if(result[nSelected][k+1] == i) 
					t=1;
			}
			if(t==1)
				fprintf(fp,"%s ",pAttName[i]);
	}
	fprintf(fp,"%s ",pAttName[iAttNum]);
	fprintf(fp,"\n");
	for(i = 0;i < iAttNum;i++)
	{
		    t=0;
			for(k=0;k<result[nSelected][0];k++)
			{
				if(result[nSelected][k+1] == i) 
					t=1;
			}
			if(t==1)
				fprintf(fp,"%s ",pDataType[i]);
	}
	fprintf(fp,"%s ",pDataType[iAttNum]);
	fprintf(fp,"\n");
	for(i=0;i<iRecordNum;i++)
	{
		for(j=0;j<iAttNum;j++)
		{
			t=0;
			for(k=0;k<result[nSelected][0];k++)
			{
				if(result[nSelected][k+1] == j) 
					t=1;
			}
			if(t==1)
				fprintf(fp,"%d ",pIntTable[i][j]);
		}
		fprintf(fp,"%d ",pIntTable[i][iAttNum]);
		fprintf(fp,"\n");
	}
	if(struWCutRecord == NULL)
	{
		fclose(fp);
		return TRUE;
	}

	struct WCutRecord* tem = struWCutRecord;
	if(tem !=NULL)
		fprintf(fp,"[Cuts]\n");
	n=0;
	while(tem != NULL)
	{		 
		bool flag=true;
		for(i=0;i<m;i++)
			if (a[i]==tem->iColumn)
			{				
				flag=false;
				 n++;
				break;
			}
		if(flag)
		{
		fprintf(fp,"%d\n",(tem->iColumn)-n);
		fprintf(fp,"%d\n",tem->iCuts);
		for(i = 0;i < tem->iCuts;i++)
		{
			fprintf(fp,"%s ",tem->cpCut[i]);
			fprintf(fp,"%d\n",i);
		}
		}
		tem = tem->next;
	}
//////////////////////////////////////////
    fclose(fp);
	return true;
	delete a;
}

int CAttEntropyReduceTwo::Create_Table()//初步简化决策表//删除多余的行
{//wrong :return 0; success:return 1 
	int i,j,k,t;          
	int ** infoset;        //删除重复记录后的信息表//新的决策表
	int new_rec_num=0;     //新信息表中的记录数.对象数
	int sum=0;             //统计属性值相同的个数
	bool find=FALSE;//缺省的BOOL值
   	int * same_rec;
	if((same_rec=new int[rec_num])==0)
		return 0;//指向相同对象的指针,编号
    int same_num=0;
	//把重复记录编号存在same_rec中,same_num中为重复记录数目
    for(i=0;i<rec_num-1;i++)
		for(j=i+1;j<rec_num;j++)
		{
			//比较两条记录是否完全相等
			for(k=0;k<con_num+1;k++)
			{                     //··········!!##修改过的地方
				if(info[i][k]==info[j][k])
					sum++;
				else
					break;
			}
			if(sum==(con_num+1))//完全相同的属性值
			{
				for(t=0;t<same_num;t++)  //same_num是相同的数量,与T的量分开
                    //如果记录中有i,说明第j条记录已存在same_rec中了
					if(same_rec[t]==i)
					{
					    find=TRUE;
					    break;
					}
				if(find==FALSE)//缺省值
			    	same_rec[same_num++]=j;//same_num指相同的条件属性的个数
			}
			find=FALSE;
			sum=0;
		}//浏览整个决策表
	//如果有重复记录,采取的措施
	if(same_num>0)
	{
    	//为新表分配空间
		infoset=new int * [rec_num-same_num];//新的决策表代码
		for(i=0;i<(rec_num-same_num);i++)
		{
			infoset[i]=new int[con_num+1];
		}
    	for(i=0;i<rec_num;i++)
		{
	    	for(j=0;j<same_num;j++)
	    		if(i==same_rec[j])
	     			break;
	    		else
		    		sum++;
	    	//说明第i条记录不在same_rec中
			if(sum==same_num)
			{
		        for(j=0;j<con_num+1;j++)
				{
					infoset[new_rec_num][j]=info[i][j];
				}
				new_rec_num++;
			}
	    	sum=0;
		}
		for(i=0;i<rec_num;i++)
			delete []info[i];
    	delete []info;
		info=infoset;
		rec_num-=same_num;//决策表改变
	}
	delete []same_rec;
	if((IND_Attrb= new  int*[rec_num+1])==0)

⌨️ 快捷键说明

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