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