📄 distwo.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 + -