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

📄 distwo.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:
// DisTwoDoc.cpp: implementation of the CDisTwoDoc class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "../RSet.h"
#include "DisTwo.h"
#include "fstream.h"
#include "String.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 
CDisTwo::CDisTwo()
{
}

CDisTwo::~CDisTwo()
{
}

BOOL CDisTwo::OnDisTwo()
{   
	int matrix_row;                       //矩阵的行数
	int matrix_col;                       //矩阵的列数
	if(iNonStrAttNum!=0)
	{
	    get_att_val();
		matrix_row=logic();
		matrix_col=init_matrix(matrix_row);
		findcuts(matrix_row,matrix_col);
	}
	make_new_table();
	if(iStrAttNum!=0) 
      doString(); 
	return TRUE;	
}

void CDisTwo::findcuts(int rows, int cols)
{//执行算法3,4,5步
    int i,j,k;                                       //循环变量
    int * cuts=NULL;
	if((cuts=new int[cols+1])==0)//定义断点
	{ 
		AfxMessageBox("分配内存失败!",MB_OK|MB_ICONSTOP);                     
		return;
	}		                      
	cuts[0]=0;   //设置断点的初始个数
	if((rows==0)||(cols==0))
	{
	 	get_cut(cuts);//得到最终的断点集   
		return;
	}
    int num;
	int remains; //未处理的矩阵元素个数
	int minvalue;//含1最少的行
	int select=0;//选择哪个断点
	int *countcols=NULL;
	if((countcols=new int[cols])==0)        //各列断点个数总和
 	{  
		  AfxMessageBox("分配内存失败!",MB_OK|MB_ICONSTOP);                     
		  return;
	}           
	int minicol;                   
	int * countrows=NULL;
	if((countrows=new int[rows])==0)
	{  
		  AfxMessageBox("分配内存失败!",MB_OK|MB_ICONSTOP);                     
		  return;
	}  
	//初始化各行1的总和
    for(i=0;i<rows;i++)
	   countrows[i]=0;
	for(i=0;i<rows;i++)
		for(j=0;j<cols;j++)
			if(matrix[i][j]==1)
				countrows[i]++;
   do
	{	
		minvalue=0;   
		remains=0;
	    for(i=0;i<cols;i++)
	     	countcols[i]=0;//列值清零
	//先选行值1的总数最少的行
	//当有两行以上行总数都是最少,看断点列为1的总数
    //选取列总数最少的断点
	   for(i=0;i<rows;i++)
			if(minvalue<countrows[i])
				minvalue=countrows[i];
//	   minvalue=countrows[0];
	   for(i=1;i<rows;i++)
			if((minvalue>countrows[i])&&(countrows[i]!=0))
				minvalue=countrows[i];//得到行值的最小值
       //找出行总和最少的1的个数
	  //选取断点始终是从行中1的个数为1的开始.就算这此没选上,下次也肯定要选
      //因为该行所在的1是唯一区别该对象对的.其他断点不可能消除该1.故程序没有
		//单独加入断点核,而是把算法的3,4步骤合并一起处理
		num=0;          
          for(i=0;i<rows;i++)
		  {
			  if(countrows[i]==minvalue)
			  {
				  for(j=0;j<cols;j++)
			    	if((matrix[i][j]==1)&&(countcols[j]==0))
					{
						num=0;
					    for(k=0;k<rows;k++)
							if(matrix[k][j]==1)
						      num+=countrows[k];
				         countcols[j]=num;//统计列对应的行的1地数目和
					}
			  }
		  }
		    minicol=0;
			for(i=0;i<cols;i++)
				if(countcols[i]>minicol)
					minicol=countcols[i];
		    
			for(i=0;i<cols;i++)
				if((countcols[i]<minicol)&&(countcols[i]!=0))
					minicol=countcols[i];//选取最小列之行之和
            
				for(i=0;i<cols;i++)
					if(minicol==countcols[i])
						select=i;//列号
	
		// 删除select所在的列和列值为1的行
		for(i=0;i<rows;i++)
			if(matrix[i][select]==1)//i行select列为1
			{//删除对应的行i
				for(j=0;j<cols;j++)
					matrix[i][j]=-1;//该行元素设为-1
			}		  
		for(i=0;i<rows;i++)
			   matrix[i][select]=-1;//该列设为-1

		   cuts[0]++;//断点数目加一
		   cuts[cuts[0]]=select;//设所取断点

		for(i=0;i<rows;i++)
			countrows[i]=0;//行中1的数目清零
		for(i=0;i<rows;i++)
		   for(j=0;j<cols;j++)
			  if(matrix[i][j]==1)
				countrows[i]++;//重新统计行中1的值
		for(i=0;i<rows;i++)
			 remains+=countrows[i];//看剩下的决策表中1的个数
	}while(remains>0);
	delete[] countrows;
	delete[] countcols;
	for(i=0;i<rows;i++)
		delete[] matrix[i];
	delete[] matrix;
	get_cut(cuts);//得到最终的断点集
}

void CDisTwo::OnDisTwoSave(LPCTSTR lpszPathName)
{
	int i,j;
	fstream fpw;
	fpw.open(lpszPathName,ios::out);
	if(!fpw)
	{
		::MessageBeep(MB_ICONHAND);
		AfxMessageBox("some error happen, file can't be opend!",
		MB_OK|MB_ICONSTOP);
        exit(0);
	}
	fpw<<"Style:"<<"train"<<endl;
	fpw<<"Stage:2"<<endl;
    fpw<<"Condition attributes number:"<<iAttNum<<endl;
    fpw<<"Records number:"<<iRecordNum<<endl;
	
	for(i = 0;i < iAttNum+1;i++)
		fpw<<pAttName[i]<<" ";
	fpw<<endl;

	for(i = 0;i < iAttNum+1;i++)
		fpw<<pDataType[i]<<" ";
	fpw<<endl;
	
    int strIndex=0,nonStrIndex=0;
    for(i=0;i<iRecordNum;i++)
	{ 
        for(j=0;j< iAttNum;j++)
		{ 
            if(!strcmp(pDataType[j],"String"))
			     fpw<<pStringTableResult[i][strIndex++]<<"   "; 
            else
                fpw<<NewTable[i][nonStrIndex++]<<"  "; 
		} 
        fpw<<NewTable[i][nonStrIndex];//决策属性 
        strIndex=0,nonStrIndex=0; 
        fpw<<endl; 
    } 
  fpw<<"[Cuts]"<<endl;//写断点	
    strIndex=0,nonStrIndex=0; 
    for(i=0;i<iAttNum;i++){ 
        fpw<<i<<endl; 
        if(!strcmp(pDataType[i],"String")){ 
            fpw<<strCuts[strIndex]<<endl;   //断点个数 
            for(j=0;j<strCuts[strIndex];j++){ 
                fpw<<pStrResult[j][strIndex]<<" "<<j<<endl; 
				//断点与离散值对应关系 
            } 
            strIndex++; 
        } 
        else{ 
            fpw<<cut[nonStrIndex][0]+1<<endl;   //断点个数 
            fpw<<"["<<"*"<<","; 
            for(j=0;j<(int)cut[nonStrIndex][0];j++){ 
                fpw<<cut[nonStrIndex][j+1]<<")"<<"  "<<j<<endl; 
                fpw<<"["<<cut[nonStrIndex][j+1]<<","; 
            } 
            fpw<<"*"<<"]"<<" "<<j; 
            fpw<<endl; 
            nonStrIndex++; 
        } 
    } 
    fpw.close();
}

⌨️ 快捷键说明

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