📄 attentropyreducetwo.cpp
字号:
// 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 + -