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