📄 mibark.cpp
字号:
return false;
}
if(strcmp(temp,"[Cuts]") != 0)
{
delete[] temp;
return false;
}
// bCuts = true;
while(fscanf(fp,"%d",&iColumn) != -1)
{
fscanf(fp,"%d",&iCuts);
pEnd = new WCutRecord;
pEnd->cpCut=new char*[iCuts];
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;
pHead = pEnd;
}//end if
else
{
pHead->next = pEnd;
pHead = pEnd;
}//end else
}//end while
delete[] temp;
return true;
}
bool CMIBARK::SetIntegerTable(FILE* fp,int column, int row)
{
int i,j;
char* string=new char[100];
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;
}
bool CMIBARK::Get_Att(int ** att,int num)//num有什么用 应该=reduct_num
{//将pAttName 拷贝到reduct_att中
//得到属性表,attredu中保存的是属性的编号,reduct_att中保存的是属性的名称
int i,j;
redu_att_num=att[0][0];
int **attredu;
if((attredu=new int * [num])==0)//决策属性数
return false;
/*
for(i=0;i<num;i++)//???
{
attredu[i]=new int[redu_att_num+1];//??
for(j=0;j<redu_att_num+1;j++)
attredu[i][j]=att[i][j];
}
*/
for(i=0;i<num;i++)
{//对上面的改为如下.
attredu[i]=new int[att[i][0]+1];
for(j=0;j<att[i][0]+1;j++)
attredu[i][j]=att[i][j];
}
if((reduct_att=new char ** [reduct_num])==0)
{
AfxMessageBox("分配内存失败!",MB_ICONSTOP|MB_OK);
return false;
}
for(i=0;i<reduct_num;i++)
{
if((reduct_att[i]=new char * [att[i][0]])==0)
{
AfxMessageBox("分配内存失败!",MB_ICONSTOP|MB_OK);
return false;
}
for(j=0;j<att[i][0];j++)
if((reduct_att[i][j]=new char[MAX])==0)
{
AfxMessageBox("分配内存失败!",MB_ICONSTOP|MB_OK);
return false;
}
for(j=0;j<att[i][0];j++)
strcpy(reduct_att[i][j],pAttName[att[i][j+1]]);
}
return true;
}
void CMIBARK::SelectSort(int * att)
{//用选择法对约简后的属性重新排列,对数组att中的元素按从小到大排序
int i,j; //循环变量
int min_item; //具有最小值的项
int transfer;
for(i=0;i<att[0]-1;i++)
{
min_item=i;
for(j=i+1;j<att[0];j++)
if(att[j+1]<att[min_item+1])//att是从1开始计数的,故要加一
min_item=j;
if(min_item!=i)
{
transfer=att[i+1];
att[i+1]=att[min_item+1];
att[min_item+1]=transfer;
}
}
}
bool CMIBARK::MIBARK()
{
//double duration;//计算约简时间的大小
// CString str;
// clock_t finish ,start;
//start = clock();
InitTable();
if(!Create_Table())//建立决策初始表
return false;
if ( Create_Array()==1)
Reduct_Table(); //计算核属性的表格
if(!Get_Att(result,reduct_num))//得到属性值
return false;
// finish = clock();
// duration = (double)(finish - start) / CLOCKS_PER_SEC;
//str.Format (" 约简运行时间:%f 秒",
// duration);
//AfxMessageBox(str);
return true;
}
bool CMIBARK::SaveFile(char* pFileName)
{
int *a=new int[iAttNum];//算出的属性
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++)//nSelected=0
{
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:");
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]);
// else
// a[m++]=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]);
// else
// fprintf(fp,"%c ",'-');
}
fprintf(fp,"%d ",pIntTable[i][iAttNum]);
fprintf(fp,"\n");
}
if(struWCutRecord == NULL)
{
fclose(fp);
return TRUE;
}
struct WCutRecord* tem = struWCutRecord;
fprintf(fp,"[Cuts]\n");
n=0;
while(tem != NULL)
{
bool flag=true;
for(i=0;i<m;i++)//m为删除的属性数目
if (a[i]==tem->iColumn)//a[i]表示删除属性的位置
{//得到
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);
delete a;
return true;
}
//任意的属性组合的划分记录及个数
//根据属性集合b对决策表进行划分,B表示属性集合b的元素个数,rownum
//表示要划分的记录的个数,划分结果保存在IND_Attrb中,
//IND_Order表示划分成的集合的个数,IND_MaxNum表示所有集合中
//元素最多的集合所包含的元素的个数
void CMIBARK::IND(int *b, int B, int rownum)//划分
{
int ind_order;
int ind_num,num_colattrsame=0,j,k,m;
int p,q,i,number=0;
bool flag1=false;
int *flag;
if(IND_Attrb==NULL)
{
if((IND_Attrb= new int*[rec_num+1])==0)// IND_Attrb[i][0]=K i号分内的个数为K
{
AfxMessageBox("内存不足!",MB_ICONSTOP|MB_OK);
return;
}
for(i=1;i<=rec_num;i++)
{
if((IND_Attrb[i]=new int[rec_num+1])==0)
{
AfxMessageBox("内存不足!",MB_ICONSTOP|MB_OK);
return;
}
}
flag1=true;
}
if((flag= new int[rownum])==0)
{
AfxMessageBox("分配内存失败!",MB_ICONSTOP|MB_OK);
return;
}
for (i=0; i<rownum;i++) // 初始化FLAG=0;
flag[i]=0;
for (i=1;i<=rec_num;i++)//初始化IND_Attrb
for(j=0;j<=rec_num;j++)
IND_Attrb[i][j]=0;
i=0;
ind_order=0;
IND_MaxNum = 0;
while(i<rownum)
{
ind_order += 1;
ind_num = 1;
IND_Attrb[ind_order][0]=1;//
IND_Attrb[ind_order][1]=i+1;
flag[i]=1;
for (j=i+1; j<rownum ; j++)
{
if (flag[j]==1)
continue;
for (k=1; k<=B; k++)
{
p = info[i][b[k]];//*b为属性集合
q = info[j][b[k]];
if (p == q)
num_colattrsame +=1;
}
if (num_colattrsame == B)//在所给的属性上面完全相同,应划为一类
{
ind_num +=1;
IND_Attrb[ind_order][ind_num]=j+1;
flag[j]=1;
IND_Attrb[ind_order][0]=ind_num;//记录第ind_order划分中对象的个数
}
num_colattrsame = 0;
}
//确定i值
number=0;
for(m=1;m<rownum;m++)
{//前一个分类后,计算后面的分类
if (flag[m] == 0)
number +=1;
if (number==1 && flag[m]==0)
{//后面第一个没有分类的样例令为i
i=m;
break;
}
}
if (number==0)//判断溢出条件,说明已经全部分类了
i=rownum+1;
if (ind_num>IND_MaxNum)
IND_MaxNum = ind_num;
}
IND_Order = ind_order;
ind_order=0;
delete []flag;
if(flag1)
{
for(i=1;i<=rec_num;i++)
{
delete []IND_Attrb[i];
}
delete []IND_Attrb;
IND_Attrb=NULL;
}
}
////////////返回X与Y的交集个数// j和i分类,Yj与Xi交的个数
int CMIBARK::YX_Jiao(int j, int i, int **IND_Y )
{
int pyx=0;
int p,q,a,b;
for(p=1;p<=IND_Attrb[i][0];p++)
{
a=IND_Attrb[i][p];
for (q=1;q<=IND_Y[j][0];q++)
{
b=IND_Y[j][q];
if (a==b)
pyx +=1;
}
}
return pyx;
}
////////熵值的计算//////////////
double CMIBARK::Entropy(int *q , int Q,int *p ,int P)//H(q|p)
{//wrong:return -1
double H,y;
int m,n,i,j,pyx;
int rownum=rec_num;
int **IND_Y;
if((IND_Y=new int*[rec_num+1])==0)
{
AfxMessageBox("内存不足!");
return -1;
}
for(i=1;i<=rec_num;i++)
if((IND_Y[i]=new int[rec_num+1])==0)
{
AfxMessageBox("内存不足!");
return -1;
}
for(i=1;i<=rec_num;i++)
for(j=0;j<=rec_num;j++)
IND_Y[i][j]=0;
if((IND_Attrb= new int*[rec_num+1])==0)// IND_Attrb[i][0]=K i号分内的个数为K
{
AfxMessageBox("内存不足!");
return -1;
}
for(i=1;i<=rec_num;i++)
{
if((IND_Attrb[i]=new int[rec_num+1])==0)
{
AfxMessageBox("内存不足!");
return -1;
}
}
//求q集的划分--------------------------
IND(q,Q,rownum);
m=IND_Order;
for (i=1;i<=m;i++)
{
for (j=1;j<=IND_Attrb[i][0];j++)
IND_Y[i][j]=IND_Attrb[i][j];
IND_Y[i][0]=IND_Attrb[i][0];
}
//清零
//求p集的划分-------------------------------------
IND(p,P,rownum);
n=IND_Order;//不分辨关系的个数
//求条件熵H(q|p)
H=0;
for (i=1;i<=n;i++)//n是第几个不分辩关系n=89
{
for(j=1;j<=m;j++)//M是决策属性的个数m=8
{
pyx = YX_Jiao(j,i,IND_Y);
if (pyx!=0)
{
y=(double ) IND_Attrb[i][0]/pyx; //条件概率的倒数
H=(double) pyx*log10(y)/log10(2)+H;
}
// else
// continue;
}
}
H=H/rownum;
for(i=1;i<=rec_num;i++)
{
delete []IND_Y[i];
}
delete []IND_Y;
for(i=1;i<=rec_num;i++)
{
delete []IND_Attrb[i];
}
delete []IND_Attrb;
IND_Attrb=NULL;
return H;
}
//////////////计算决策属性的熵值/////////H(D)
double CMIBARK::EntropyDec(int *q , int Q)//H(D)
{//wrong:return -1
double H,y;
int m,i,j;
int rownum=rec_num;
int **IND_Y;
if((IND_Y=new int*[rec_num+1])==0)
return -1;
for(i=1;i<=rec_num;i++)
if((IND_Y[i]=new int[rec_num+1])==0)
return -1;
for(i=1;i<=rec_num;i++)
for(j=0;j<=rec_num;j++)
IND_Y[i][j]=0;
if((IND_Attrb= new int*[rec_num+1])==0)// IND_Attrb[i][0]=K i号分内的个数为K
return -1;
for(i=1;i<=rec_num;i++)
{
if((IND_Attrb[i]=new int[rec_num+1])==0)
return -1;
}
IND(q,Q,rownum);
m=IND_Order;
for (i=1;i<=m;i++)
{
for (j=1;j<=IND_Attrb[i][0];j++)
IND_Y[i][j]=IND_Attrb[i][j];
IND_Y[i][0]=IND_Attrb[i][0];
}
H=0;
for(j=1;j<=m;j++)//M是决策属性的个数
{
if(IND_Attrb[j][0]!=0)
{
y=(double ) IND_Attrb[j][0]; //条件概率的倒数
H= (double)log10(y)/log10(2)+H;
}
//else
// continue;
}
H=H/rownum;
for(i=1;i<=rec_num;i++)
{
delete []IND_Y[i];
}
delete []IND_Y;
for(i=1;i<=rec_num;i++)
{
delete []IND_Attrb[i];
}
delete []IND_Attrb;
IND_Attrb=NULL;
return H;
}
void CMIBARK::FreeContent()
{
int i;
for(i=0;i<iRecordNum;i++)
delete []pIntTable[i];
delete []pIntTable;
for (i=0;i<rec_num;i++)
delete []info[i];
delete []info;
for(i=0;i<iAttNum+1;i++)
{
delete []pDataType[i];
delete []pAttName[i];
}
delete []pDataType;
delete []pAttName;
//free struWCutRecord
struct WCutRecord* pHead=NULL;
while(struWCutRecord != NULL)
{
pHead = struWCutRecord->next;
for(int i = 0;i < struWCutRecord->iCuts;i++)
delete[] struWCutRecord->cpCut[i];
delete[] struWCutRecord->cpCut;
delete struWCutRecord;
struWCutRecord = pHead;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -