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

📄 valreductionone.cpp

📁 某个实验事编写粗糙集智能信息处理的程序
💻 CPP
字号:
// ValReductionOne.cpp: implementation of the ValReductionOne class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "rset.h"

#include "ValReductionOne.h"
#include"stdlib.h"
#include"string.h"
//////////////////////////////////////////////////////////////////////
bool ValReductionOne::CheckAtt()
{//success:return true; else return false
	bool RecCon;//行冲突标志,false有冲突,初值
	bool RecEqual;//行相等标志,true相等,初值
	int r1,r2;//行循环变量
	int a1,a2;//列循环变量
	//赋初值
	if((flagtab=new bool *[RecCount])==0)
		return false;
	for(r1=0;r1<RecCount;r1++)
		if((flagtab[r1]=new bool[AttCount])==0)
			return false;
	for(r1=0;r1<RecCount;r1++)//赋予初值,false表示不可删除该属性值
		for(a1=0;a1<AttCount;a1++)
			flagtab[r1][a1]=false;
	if((delrec=new bool[RecCount])==0)
		return false;
	for(r1=0;r1<RecCount;r1++)
		delrec[r1]=false;
	int DelAttNum;//统计属性的删除数目,避免删除所有属性的情况。
	//检查每个可能去掉的属性值
	for(r1=0;r1<RecCount;r1++)//对所有样例
	{
		DelAttNum=0; 		//for every sample,initialize it to zero
		for(a1=0;a1<AttCount-1;a1++)//对r1样例的所有条件属性
		{			 
			RecCon=false;
			for(r2=0;r2<RecCount;r2++)
				if (r1!=r2)//对所有的其他样例
				{
				
					RecEqual=true;
					for(a2=0;a2<AttCount-1;a2++)//不包括决策属性
						if(a1!=a2)//假设去除a1属性后,比较其他属性值看是否存在冲突
							if((!flagtab[r1][a2])&&(!flagtab[r2][a2]))
							{//如果其他属性没有被删除,则比较 mu对样例r1的a1属性值判断是否可以删除
								if(tab[r1][a2]!=tab[r2][a2])
								{
									RecEqual=false;//两行不等
									break;
								}
							}    
					if(RecEqual)//两行条件属性相等
						if(tab[r1][AttCount-1]!=tab[r2][AttCount-1])
						{	//决策属性不等
							RecCon=true;//有冲突
							break;
						}
				}//r2的循环
			if(!RecCon && DelAttNum<AttCount-2) //无冲突且避免删除全部属性,该规则的该属性的可以去掉
			{
				flagtab[r1][a1]=true;
				DelAttNum++;
			}
		}//end for a1,列循环结束
	} 
		return true;
}

void ValReductionOne::DelRep()
{//将得到的约简结果化简,除去相同的规则,并在第一条记录记录下它代表的数目,既是相同的数目
	bool RecEqual;//行相等标志,true相等,初值
	int r1,r2;//行循环变量
	int a1;//列循环变量
	int m,m1;
	if((same_rec=new int[RecCount])==0)
	{
		AfxMessageBox("内存分配错误!");
		return;
	}
	if((same_att=new int[RecCount])==0)
	{
		AfxMessageBox("内存分配错误!");
		return;
	}
	for(r1=0;r1<RecCount;r1++)
		same_rec[r1]=0;
	for(r1=0;r1<RecCount;r1++)
		same_att[r1]=0;
	for(r1=0;r1<RecCount;r1++)
		if(!delrec[r1])//该行没有被删除 为false
		{
			m1=m=0;
			for(r2=0;r2<RecCount;r2++)
		        if(r2!=r1) 
				{
					RecEqual=true;//两行相等
					for(a1=0;a1<AttCount-1;a1++)//对所有属性
						if((!flagtab[r1][a1])&&(!flagtab[r2][a1]))
						{//r1样例a1属性和r2样例a1属性都没有被删除
							if(tab[r1][a1]!=tab[r2][a1])
							{
								RecEqual=false;
								break;
							}
						}
						else if(((flagtab[r1][a1])&&(!flagtab[r2][a1]))||((!flagtab[r1][a1])&&(flagtab[r2][a1])))
						{//r1样例a1属性被删除和r2样例a1属性没有被删除,或者是r1样例a1属性没有被删除,r2样例a1属性被删除
							RecEqual=false;
							break;
						}
					if(RecEqual)//该两行条件属性全相等
					{
						m1++;
						if(tab[r1][AttCount-1]==tab[r2][AttCount-1])
						{
							delrec[r2]=true;
						    m++;
						}
					}
				}//r2循环结束
			same_rec[r1]=m;//和r1相等的规则数
			same_att[r1]=m1;
		}
}

bool ValReductionOne::Run(char *s,char *r)
{
	if(RunOne(s)!=1) //读文件
		return false;
			
	clock_t  finish,start;
	start = clock(); //时钟计时开始

	DelRep2();
	if(!CheckAtt())  
		return false;
	DelRep();

	finish = clock();
	CString str;
	double duration;
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	str.Format (" 约简运行时间:%f 秒",duration);
	AfxMessageBox(str);  	

	Save_File(r);//保存文件
	return true;
}

ValReductionOne::ValReductionOne()
{
}

ValReductionOne::~ValReductionOne()
{
	int i,j;
	for(i=0;i<RecCount;i++)
	{
		delete []tab[i];
		delete []flagtab[i];
	}
	delete []tab;
	for(j=0;j<AttCount;j++)
	{
		delete []datasign[j];
		if (cuttab[j]!=NULL) delete []cuttab[j];
	}
	delete []cuttab;
	delete []datatype;
	delete []datasign;
	delete []flagtab;
	delete []delrec;
	delete []same_rec;
	delete []same_att;
}


void ValReductionOne::DelRep2()
{//比较初始的决策表,删去其中相同的记录,通过把该记录的删除标志置为true来实现
	bool RecEqual;//行相等标志,true相等,初值
	int r1,r2;//行循环变量
	int a1;//列循环变量
	if((delrec=new bool[RecCount])==0)
	{	
		AfxMessageBox("内存分配失败!");
		return;
	}
	for(r1=0;r1<RecCount;r1++)
		delrec[r1]=false;
	for(r1=0;r1<RecCount-1;r1++)
		if(!delrec[r1])//该行没有被删除
			for(r2=r1+1;r2<RecCount;r2++)
				if(!delrec[r2]) 
				{
					RecEqual=true;//两行相等
					for(a1=0;a1<AttCount;a1++)
						{
							if(tab[r1][a1]!=tab[r2][a1])
							{
								RecEqual=false;
								break;
							}
						}
					if(RecEqual)//该两行相等
						delrec[r2]=true;//该行可以去掉
				}//r2循环结束
}

⌨️ 快捷键说明

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