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

📄 fuzzyvar.cpp

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

#include "stdafx.h"
#include "FuzzySys.h"
#include "FuzzyVar.h"
#include <math.h>

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

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

FuzzyVar::FuzzyVar(double v):value(v)
{

}

FuzzyVar::FuzzyVar(const FuzzyVar &fv)
{
	value = fv.value;
}

FuzzyVar::~FuzzyVar()
{

}



double FuzzyVar::MemberFunc(double radius, double middle)
{
	if (value < middle - radius
		|| value > middle + radius)
		return 0;

	return 1 - (fabs(middle - value) + 0.0) / radius;
}

bool FuzzyVar::IsNB(double* m=0)
{
	double t;

	t = MemberFunc(NS_MIDDLE - NB_MIN, NB_MIN);
	if (m)
		*m = t;


	if (t < 0.0001 && t > -0.0001)
		return false;
	else 
		return true;
}

bool FuzzyVar::IsNS(double* m=0)
{
	double t;

	t = MemberFunc(NS_MIDDLE - NB_MIN, NS_MIDDLE);
	if (m)
		*m = t;


	if (t < 0.0001 && t > -0.0001)
		return false;
	else 
		return true;
}


bool FuzzyVar::IsZO(double* m=0)
{
	double t;

	t = MemberFunc(ZO_MIDDLE - NS_MIDDLE, ZO_MIDDLE);
	if (m)
		*m = t;


	if (t < 0.0001 && t > -0.0001)
		return false;
	else 
		return true;
}

bool FuzzyVar::IsPS(double* m=0)
{
	double t;

	t = MemberFunc(PS_MIDDLE - ZO_MIDDLE, PS_MIDDLE);
	if (m)
		*m = t;


	if (t < 0.0001 && t > -0.0001)
		return false;
	else 
		return true;
}


bool FuzzyVar::IsPB(double* m=0)
{
	double t;

	t = MemberFunc(PB_MAX - PS_MIDDLE, PB_MAX);
	if (m)
		*m = t;


	if (t < 0.0001 && t > -0.0001)
		return false;
	else 
		return true;
}


bool FuzzyVar::GetBounds(MEMBERSHIP m, double* pLowerBound, double* pUpperBound)
{
	switch (m)
	{
	case NB:
		*pLowerBound = NB_MIN;
		*pUpperBound = NS_MIDDLE;
		break;
	case NS:
		*pLowerBound = NB_MIN;
		*pUpperBound = ZO_MIDDLE;
		break;
	case ZO:
		*pLowerBound = NS_MIDDLE;
		*pUpperBound = PS_MIDDLE;
		break;
	case PS:
		*pLowerBound = ZO_MIDDLE;
		*pUpperBound = PB_MAX;
		break;
	case PB:
		*pLowerBound = PS_MIDDLE;
		*pUpperBound = PB_MAX;
		break;
	default:
		return false;
	}

	return true;
}

void FuzzyVar::SetValue(double v)
{
	value = v;
}

⌨️ 快捷键说明

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