📄 regchart.cpp
字号:
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include "math.h"
float max1(float x,float y);
float min1(float x,float y);
int ContrlRul(int x,int y);
void CountDegr(float (&Deg)[13],int a,bool b) //x,y,z的隶属度函数,
b为1时是x的隶属度函数,b为0时是y,z的隶属度
{
switch(b){
case 1:
switch(a){
case 0:
Deg[0] = 1.0;
Deg[1] = 0.8;
Deg[2] = 0.7;
Deg[3] = 0.4;
Deg[4] = 0.1;
break;
case 1:
Deg[0] = 0.2;
Deg[1] = 0.7;
Deg[2] = 1.0;
Deg[3] = 0.7;
Deg[4] = 0.3;
break;
case 2:
Deg[1] = 0.1;
Deg[2] = 0.3;
Deg[3] = 0.7;
Deg[4] = 1.0;
Deg[5] = 0.7;
Deg[6] = 0.2;
break;
case 3:
Deg[4] = 0.1;
Deg[5] = 0.6;
Deg[6] = 1.0;
break;
case 4:
Deg[6] = 1.0;
Deg[7] = 0.6;
Deg[8] = 0.1;
break;
case 5:
Deg[6] = 0.2;
Deg[7] = 0.7;
Deg[8] = 1.0;
Deg[9] = 0.7;
Deg[10] = 0.3;
Deg[11] = 0.1;
break;
case 6:
Deg[8] = 0.2;
Deg[9] = 0.7;
Deg[10] = 1.0;
Deg[11] = 0.7;
Deg[12] = 0.3;
break;
case 7:
Deg[8] = 0.1;
Deg[9] = 0.4;
Deg[10] = 0.7;
Deg[11] = 0.8;
Deg[12] = 1.0;
break;
}
break;
case 0:
switch(a){
case 0:
Deg[0] = 1.0;
Deg[1] = 0.7;
Deg[2] = 0.3;
break;
case 1:
Deg[0] = 0.3;
Deg[1] = 0.7;
Deg[2] = 1.0;
Deg[3] = 0.7;
Deg[4] = 0.3;
break;
case 2:
Deg[2] = 0.3;
Deg[3] = 0.7;
Deg[4] = 1.0;
Deg[5] = 0.7;
Deg[6] = 0.3;
break;
case 3:
Deg[4] = 0.3;
Deg[5] = 0.7;
Deg[6] = 1.0;
Deg[7] = 0.7;
Deg[8] = 0.3;
break;
case 4:
Deg[6] = 0.3;
Deg[7] = 0.7;
Deg[8] = 1.0;
Deg[9] = 0.7;
Deg[10] =0.3;
break;
case 5:
Deg[8] = 0.3;
Deg[9] = 0.7;
Deg[10] = 1.0;
Deg[11] = 0.7;
Deg[12] = 0.3;
break;
case 6:
Deg[10] = 0.3;
Deg[11] = 0.7;
Deg[12] = 1.0;
break;
}
break;
}
}
//模糊蕴含关系R
float Ra[13][13];
float Rb[13][13];
void main()
{
for (int f = 0;f <= 12;f++)
{
for (int g = 0;g <= 12;g++)
{
float c[13] = {0};
//采用单点模糊集合的输入量模糊集合A'和B'
float aa[13] = {0};
float bb[13] = {0};
aa[f] = 1; bb[g] = 1;
for (int x = 0;x <= 7;x++)
{
for (int y = 0;y <= 6;y++)
{//分别由不同的蕴含关系获得的输出量,ci为cia与cib相交
float cia[13] = {0};
float cib[13] = {0};
float ci[13] = {0};
//ad,bd,cd分别表示隶属度
float ad[13] = {0};
float bd[13] = {0};
float cd[13] = {0};
//由模糊控制表计算每种xy匹配获得的z
int k = ContrlRul(x,y);
CountDegr(ad,x,1);
CountDegr(bd,y,0);
CountDegr(cd,k,0);
// 利用求交法计算模糊蕴含关系Ria,Rib
for (int j = 0;j <= 12;j++)
{
for (int i = 0;i <= 12;i++)
{
Ra[i][j] = min1(ad[i],cd[j]);
Rb[i][j] = min1(bd[i],cd[j]);
}
}
for ( j = 0;j <= 12;j++) //求C1'和C2'
{
//stray1,stray2为中间变量,用于最大最小法
float stray1[13] ;
float stray2[13];
for ( int i = 0;i <= 12;i++)
{
stray1[i] = min1(aa[i],Ra[i][j]);
stray2[i] = min1(bb[i],Rb[i][j]);
if (stray1[i] >= cia[j])
{
cia[j] = stray1[i];
}
if (stray2[i] >= cib[j])
{
cib[j] = stray2[i];
}
}
}
//求交法求Ci'
for ( int i = 0;i <= 12;i++)
{
ci[i] = min1(cia[i],cib[i]);
}
for ( i = 0;i <=12;i++) //计算C',用求并法
{
if(c[i] <= ci[i])
c[i] = ci[i];
}
}
}
float l = 0.0;
float m = 0.0;
float h = 0.0;
for (int i = 0;i <= 12;i++)
{
h = c[i];
l += (float) (h*(i - 6));
m += h;
}
float dfz;
if(m != 0){
dfz =(float)l/m;
}
if (g == 12){
if(abs(dfz) < 0.001)
cout<<"0"<<endl;
else
cout<<dfz<<endl;
}
else
{
if(abs(dfz) < 0.001)
cout<<"0"<<" ";
else
cout<<dfz<<" ";
}
}
}
return;
}
int ContrlRul(int x,int y)
{
int c;
switch(x)
{
case 0:
switch(y)
{
case 0:
case 1:
case 2:
case 3:c = 0;break;
case 4:c = 1;break;
case 5:
case 6:c = 3;break;
};
break;
case 1:
switch(y)
{
case 0:
case 1:
case 2:
case 3:c = 0;break;
case 4:c = 1;break;
case 5:
case 6:c = 3;break;
};
break;
case 2:
switch(y)
{
case 0:
case 1:
case 2:
case 3:c = 1;break;
case 4:c = 3;break;
case 5:
case 6:c = 4;break;
};
break;
case 3:
switch(y)
{
case 0:
case 1:c = 1;break;
case 2:c = 2;break;
case 3:c = 3;break;
case 4:c = 4;break;
case 5:
case 6:c = 5;break;
};
break;
case 4:
switch(y)
{
case 0:
case 1:c = 1;break;
case 2:c = 2;break;
case 3:c = 3;break;
case 4:c = 4;break;
case 5:
case 6:c = 5;break;
};
break;
case 5:
switch(y)
{
case 0:
case 1:c = 2;break;
case 2:c = 3;break;
case 3:
case 4:
case 5:
case 6:c = 5;break;
};
break;
case 6:
switch(y)
{
case 0:
case 1:c = 3;break;
case 2:c = 5;break;
case 3:
case 4:
case 5:
case 6:c = 6;break;
};
break;
case 7:
switch(y)
{
case 0:
case 1:c = 3;break;
case 2:c = 5;break;
case 3:
case 4:
case 5:
case 6:c = 6;break;
};
break;
}
return c;
}
float max1(float x,float y)
{
if (x >= y)
{
return x;
}
else
{
return y;
}
}
float min1(float x,float y)
{
if (x <= y)
{
return x;
}
else
{
return y;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -