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

📄 main.cpp

📁 这是关于FUZZY 控制的程序
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
// Fuzzy Control Table
// Jackson.Wu 702 Buaa 2008.11.4
// IN:	
// A,输入的隶属度函数表
// B,输入的隶属度函数表
// C,输出的隶属度函数表
// ControlTable,模糊控制规则表
// _A
// _B
///////////////////////////////
// OUT:
// Ri
// R
// _C
//////////////////////////////////////////////////////////////////////////

#include <iostream.h>
#include "fstream.h"
#include <math.h>

#define COL_A 7
#define ROW_A 13

#define COL_B 7
#define ROW_B 13

#define COL_C 7
#define ROW_C 13

//////////////////////////////////////////////////////////////////////////
// 通用运算
float Max(float x,float y);
float Min(float x,float y);

//////////////////////////////////////////////////////////////////////////
// 
void MaxR(float R[ROW_A*ROW_B][ROW_C],float Ri[ROW_A*ROW_B][ROW_C]);
void MakeAB(float AB[ROW_B][ROW_A],float A[COL_A][ROW_A],int i,float B[7][ROW_A],int j);
void MakeRi(float  Ri[ROW_A*ROW_B][ROW_C],float AB[ROW_A][ROW_B],float C[COL_C][ROW_C], int );
void Make_C(float _C[ROW_C],float _AB[ROW_A][ROW_B],float R[ROW_A*ROW_B][ROW_C]);

void main()
{
	// 先将X,Y,Z的隶属度函数输入并保存
	// 对于X,分别用0,1,...,7代表NB,NM,...,PB各模糊集合。
	// 对于Y,Z,分别用0,1,...,6代表NB,NM,...,PB各模糊集合。
	// -6到6的13个数,分别用0到13代表。
	// 用二维数组储存x,y,z的隶属度函数。
	
	float A[COL_A][ROW_A] = {
	{1.0F,	0.5F},	// NB
	{0,		0.5F,	1.0F,	0.5F},	// NM
	{0,		0,		0,		0.5F,	1.0F,	0.5F},	// NS
	{0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// Z
	{0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PS
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PM
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F}	// PB
	};
	
	float B[COL_B][ROW_B]={
	{1.0F,	0.5F},	// NB
	{0,		0.5F,	1.0F,	0.5F},	// NM
	{0,		0,		0,		0.5F,	1.0F,	0.5F},	// NS
	{0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// Z
	{0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PS
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PM
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F}	// PB
	};
	
	float C[COL_C][ROW_C]={
	{1.0F,	0.5F},	// NB
	{0,		0.5F,	1.0F,	0.5F},	// NM
	{0,		0,		0,		0.5F,	1.0F,	0.5F},	// NS
	{0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// Z
	{0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PS
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F,	0.5F},	// PM
	{0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0,		0.5F,	1.0F}	// PB
	};


	int CTable[COL_A][COL_B] = {
	{0,	0,	0,	0,	1,	3,	3},	// NB
	{0,	0,	0,	0,	1,	3,	3},	// NM
	{1,	1,	1,	1,	3,	4,	4},	// NS
	{1,	1,	2,	3,	4,	5,	5},	// Z	
	{2,	2,	3,	5,	5,	5,	5},	// PS
	{3,	3,	5,	6,	6,	6,	6},	// PM
	{3,	3,	5,	6,	6,	6,	6}  // PB
	};
	
	float R[ROW_A*ROW_B][ROW_C],Ri[ROW_A*ROW_B][ROW_C],AB[ROW_A][ROW_B];
	//////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
	

	// 计算R=R1+R2+...+R56
	// Ri = Ai + Bi -> CiR
	// Ai*Bi A8,B7
	int i=0,j=0,g=0;
	for(i=0;i<COL_A;i++)
	{
		for(j=0;j<COL_B;j++)
		{
			if(CTable[i][j]<0)
				continue;
			MakeAB(AB,A,i,B,j);
			MakeRi(Ri,AB,C,CTable[i][j]);
			MaxR(R,Ri);
		}
	}

	//////////////////////////////////////////////////////////////////////////
	//
	ofstream fout("out.txt",ios::out,filebuf::sh_write);
	fout.precision(3);
	fout<<"The Col is Ai, and the Row is Bi."<<endl;
	int col=0,row=0;
	for(col=0;col<ROW_A;col++)
	{
		float _A[ROW_A]={0};		//{0.5,1.0,0.5};
		_A[col] = 1;

		for(row=0;row<ROW_B;row++)
		{
			float _B[ROW_B]={0};	//{0.6,1.0,0.6};
			_B[row] = 1;
			float _C[ROW_C]={0},_AB[ROW_A][ROW_B];
			
			// Get _AB
			for(i=0;i<ROW_A;i++)
			{
				for(j=0;j<ROW_B;j++)
				{
					_AB[i][j] = Min(_A[i],_B[j]);
				}
			}

			// Get_C
			Make_C(_C,_AB,R);

			// OutPutC
			float OutC=0;	
			float fz = 0;
			float fm = 0;
			int num = -6;

			//cout.precision(3);
			
			for (i=0;i<ROW_C;i++)
			{ 	
				fm = fm + _C[i];
				fz = fz + num * _C[i];
				num = num + 1;		
			}
			OutC = fz*(1/fm) ;
			//cout<<OutC<<endl;
			if(fabs(OutC)<0.0001)
				OutC=0;
			fout<<OutC<<'\t';
		}
		fout<<endl;
	}

	cout<<"Data has output into data.txt in the .'\'"<<endl;
}

void MakeAB(float AB[ROW_A][ROW_B],float A[8][ROW_A],int col,float B[7][ROW_B],int row)
{
	int i=0,j=0;
	for(i=0;i<ROW_A;i++)
	{
		for(j=0;j<ROW_B;j++)
		{
			AB[i][j] = Min(A[col][i],B[row][j]);
		}
	}
}

void MaxR(float R[ROW_A*ROW_B][ROW_C],float Ri[ROW_A*ROW_B][ROW_C])
{
	int i=0,j=0,N=ROW_A*ROW_B;
	for(i=0;i<N;i++)
	{
		for(j=0;j<ROW_C;j++)
		{
			if(R[i][j]<Ri[i][j])
				R[i][j] = Ri[i][j];
		}
	}
}


void MakeRi(float Ri[ROW_A*ROW_B][ROW_C],float AB[ROW_A][ROW_B],float C[COL_C][ROW_C],int index)
{
	int i=0,j=0,g=0;
	for(i=0;i<ROW_A;i++)		// 行
	{
		for(j=0;j<ROW_B;j++)	// 行
		{
			for(g=0;g<ROW_C;g++)// 列
			{
				int tmpRow = i*ROW_A+j;
				Ri[tmpRow][g]=Min(AB[i][j],C[index][g]); 
			}
		}
	}
}

void Make_C(float _C[ROW_C],float _AB[ROW_A][ROW_B],float R[ROW_A*ROW_B][ROW_C])
{
	int i=0,j=0,row=0;
	float tmpR[ROW_A*ROW_B][ROW_C];
	for(row=0;row<ROW_C;row++)	
	{
		for(i=0;i<ROW_A;i++)	
		{
			for(j=0;j<ROW_B;j++)
			{
				//R[j*ROW_A+g][i] = Min(_AB[j][g],R[j*13+g][i]);
				tmpR[i*ROW_A+j][row] = Min(_AB[i][j],R[i*ROW_A+j][row]);
			}
		}
	}

	for(i=0;i<ROW_C;i++)
	{
		for(j=0;j<ROW_A*ROW_A;j++)
		{
			_C[i]=Max(_C[i],tmpR[j][i]);
		}
	}

}

//比较两数大小,输出大值,相当于求并运算
float Max(float x,float y)  
{
	if (x<=y)
	{
		return y;
	}
	else
		return x;
}


// 比较两数大小,输出小值,相当于求交运算。
float Min(float x,float y)  
{
	if (x>=y)
	{
		return y;
	}
	else
		return x;

}

⌨️ 快捷键说明

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