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

📄 regchart.cpp

📁 本程序计算并制作实时查询的控制表,隶属度函数也在程序中标明
💻 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 + -