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

📄 mibark.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -