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

📄 fuzzyrule.cpp

📁 利用人工智能中的模糊控制算法模拟水温控制的过程
💻 CPP
字号:
// FuzzyRule.cpp: implementation of the FuzzyRule class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FuzzySys.h"
#include "FuzzyRule.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

FuzzyRule::FuzzyRule(FuzzyVar f1, FuzzyVar f2):fv1(f1), fv2(f2)
{

}

FuzzyRule::~FuzzyRule()
{

}


#define ALL_RULLS
double FuzzyRule::CalculateW()
{
	double w, mw, startW, step=0.1, endW;

	double lowerBound, upperBound;

	FuzzyVar::GetBounds(FuzzyVar::NB, &lowerBound, &upperBound);
	startW = lowerBound;
	FuzzyVar::GetBounds(FuzzyVar::PB, &lowerBound, &upperBound);
	endW = upperBound;

	double numerator = 0;
	double denominator = 0;

	for (w=startW; w<endW; w+=step)
	{
		FuzzyVar fvResult(w);
		double a, m1, m2, mr;

		mw = 0;

		if (fv1.IsNB(&m1))
		{
#ifdef ALL_RULLS
		
			if (fv2.IsNB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsNS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
			if (fv2.IsZO(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
#ifdef ALL_RULLS
			if (fv2.IsPS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPS(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsZO(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
		}

		if (fv1.IsNS(&m1))
		{
#ifdef ALL_RULLS
			if (fv2.IsNB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsNS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
			if (fv2.IsZO(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPS(&mr))
					mw = max(mw, min(a, mr));
			}
#ifdef ALL_RULLS
			if (fv2.IsPS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsZO(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNS(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
		}

		if (fv1.IsZO(&m1))
		{
			if (fv2.IsNB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPB(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsNS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPS(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsZO(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsZO(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNS(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
		}

		if (fv1.IsPS(&m1))
		{
#ifdef ALL_RULLS
			if (fv2.IsNB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsPS(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsNS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsZO(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
			if (fv2.IsZO(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNS(&mr))
					mw = max(mw, min(a, mr));
			}
#ifdef ALL_RULLS
			if (fv2.IsPS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
		}

		if (fv1.IsPB(&m1))
		{
#ifdef ALL_RULLS
			if (fv2.IsNB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsZO(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsNS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNS(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
			if (fv2.IsZO(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
#ifdef ALL_RULLS
			if (fv2.IsPS(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
			if (fv2.IsPB(&m2))
			{
				a = min(m1, m2);
				if (fvResult.IsNB(&mr))
					mw = max(mw, min(a, mr));
			}
#endif
		}

		numerator += w*mw*step;
		denominator += mw*step;
	}
	
	if (denominator < 0.0001
		&& denominator > -0.0001)
		return 0;
	return numerator / denominator;
}

⌨️ 快捷键说明

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