📄 fuzzydlg.cpp
字号:
// fuzzyDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fuzzy.h"
#include "fuzzyDlg.h"
#include <iostream.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFuzzyDlg dialog
CFuzzyDlg::CFuzzyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFuzzyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFuzzyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFuzzyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFuzzyDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFuzzyDlg, CDialog)
//{{AFX_MSG_MAP(CFuzzyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_Fuzzy, OnFuzzy)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFuzzyDlg message handlers
BOOL CFuzzyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
int i;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//PB 0
//PS 1
//ZO 2
//NS 3
//NB 4
//数组下标代表推理:
//RuleTable[0][0]=4:E=PB,@E=PB,结果=NB
//RuleTable[2][3]=1:E=ZO,@E=NS,结果=PS
//第一行
RuleTable[0][0]=4;
RuleTable[0][1]=4;
RuleTable[0][2]=4;
RuleTable[0][3]=3;
RuleTable[0][4]=3;
//第二行
RuleTable[1][0]=3;
RuleTable[1][1]=3;
RuleTable[1][2]=3;
RuleTable[1][3]=2;
RuleTable[1][4]=2;
//第三行
RuleTable[2][0]=3;
RuleTable[2][1]=2;
RuleTable[2][2]=2;
RuleTable[2][3]=1;
RuleTable[2][4]=0;
//第四行
RuleTable[3][0]=2;
RuleTable[3][1]=1;
RuleTable[3][2]=1;
RuleTable[3][3]=1;
RuleTable[3][4]=0;
//第五行
RuleTable[4][0]=1;
RuleTable[4][1]=1;
RuleTable[4][2]=1;
RuleTable[4][3]=0;
RuleTable[4][4]=0;
//PB,PS,ZO,NS,NB不再整成了函数了,就直接是离散的了,不允许输入非整数值
//PB
PB[0]=0; //-4
PB[1]=0; //-3
PB[2]=0; //-2
PB[3]=0; //-1
PB[4]=0; //0
PB[5]=0; //1
PB[6]=0; //2
PB[7]=0.5; //3
PB[8]=1; //4
//PS
PS[0]=0; //-4
PS[1]=0; //-3
PS[2]=0; //-2
PS[3]=0; //-1
PS[4]=0; //0
PS[5]=0.5; //1
PS[6]=1; //2
PS[7]=0.5; //3
PS[8]=0; //4
//ZO
ZO[0]=0; //-4
ZO[1]=0; //-3
ZO[2]=0; //-2
ZO[3]=0.5; //-1
ZO[4]=1; //0
ZO[5]=0.5; //1
ZO[6]=0; //2
ZO[7]=0; //3
ZO[8]=0; //4
//NS
NS[0]=0; //-4
NS[1]=0.5; //-3
NS[2]=1; //-2
NS[3]=0.5; //-1
NS[4]=0; //0
NS[5]=0; //1
NS[6]=0; //2
NS[7]=0; //3
NS[8]=0; //4
//NB
NB[0]=1; //-4
NB[1]=0.5; //-3
NB[2]=0; //-2
NB[3]=0; //-1
NB[4]=0; //0
NB[5]=0; //1
NB[6]=0; //2
NB[7]=0; //3
NB[8]=0; //4
//初始化为0
//E @E对 PB PS ZO NS NB的隶属度
LiShuDu_E[0]=0;
LiShuDu_E[1]=0;
LiShuDu_E[2]=0;
LiShuDu_E[3]=0;
LiShuDu_E[4]=0;
LiShuDu_Changerate_E[0]=0;
LiShuDu_Changerate_E[1]=0;
LiShuDu_Changerate_E[2]=0;
LiShuDu_Changerate_E[3]=0;
LiShuDu_Changerate_E[4]=0;
//用于判断数组PB,PS,ZO,NS,NB是否改变过,没改变过为false,改变了为true
PB_TF=false;
PS_TF=false;
ZO_TF=false;
NS_TF=false;
NB_TF=false;
for(i=0;i<9;i++)
{
PB_Result[i]=0;
PS_Result[i]=0;
ZO_Result[i]=0;
NS_Result[i]=0;
NB_Result[i]=0;
}
w=0;
for(i=0;i<9;i++)
{
result[i]=0;
}
RESULT=NULL;
return TRUE; // return TRUE unless you set the focus to a control
}
void CFuzzyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CFuzzyDlg::OnPaint()
{
/* CWnd *pWnd=GetDlgItem(IDC_STATIC1);
CDC* dc=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
dc->SelectStockObject(BLACK_BRUSH);
dc->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC); */
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFuzzyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//求E对PB,PS,ZO,NS,NB的隶属度,得到LiShuDu_E数组
void CFuzzyDlg::comLiShuDu_E()
{
if(E<-3.5) LiShuDu(LiShuDu_E,-4);
if((E>=-3.5)&&(E<-2.5)) LiShuDu(LiShuDu_E,-3);
if((E>=-2.5)&&(E<-1.5)) LiShuDu(LiShuDu_E,-2);
if((E>=-1.5)&&(E<-0.5)) LiShuDu(LiShuDu_E,-1);
if((E>=-0.5)&&(E<0.5)) LiShuDu(LiShuDu_E,0);
if((E>=0.5)&&(E<1.5)) LiShuDu(LiShuDu_E,1);
if((E>=1.5)&&(E<2.5)) LiShuDu(LiShuDu_E,2);
if((E>=2.5)&&(E<3.5)) LiShuDu(LiShuDu_E,3);
if(E>=3.5) LiShuDu(LiShuDu_E,4);
}
//求@E对PB,PS,ZO,NS,NB的隶属度,得到LiShuDu_Changerate_E数组
void CFuzzyDlg::comLiShuDu_Changerate_E()
{
if(Changerate_E<-3.5) LiShuDu(LiShuDu_Changerate_E,-4);
if((Changerate_E>=-3.5)&&(Changerate_E<-2.5)) LiShuDu(LiShuDu_Changerate_E,-3);
if((Changerate_E>=-2.5)&&(Changerate_E<-1.5)) LiShuDu(LiShuDu_Changerate_E,-2);
if((Changerate_E>=-1.5)&&(Changerate_E<-0.5)) LiShuDu(LiShuDu_Changerate_E,-1);
if((Changerate_E>=-0.5)&&(Changerate_E<0.5)) LiShuDu(LiShuDu_Changerate_E,0);
if((Changerate_E>=0.5)&&(Changerate_E<1.5)) LiShuDu(LiShuDu_Changerate_E,1);
if((Changerate_E>=1.5)&&(Changerate_E<2.5)) LiShuDu(LiShuDu_Changerate_E,2);
if((Changerate_E>=2.5)&&(Changerate_E<3.5)) LiShuDu(LiShuDu_Changerate_E,3);
if(Changerate_E>=3.5) LiShuDu(LiShuDu_Changerate_E,4);
}
void CFuzzyDlg::LiShuDu(double LiShuDu[],int i)
{
int j;
j=i;
if(PB[j+4]!=0) LiShuDu[0]=PB[j+4];
if(PS[j+4]!=0) LiShuDu[1]=PS[j+4];
if(ZO[j+4]!=0) LiShuDu[2]=ZO[j+4];
if(NS[j+4]!=0) LiShuDu[3]=NS[j+4];
if(NB[j+4]!=0) LiShuDu[4]=NB[j+4];
}
void CFuzzyDlg::reasoning()
{
double temp;
int pbpszonsnb;
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
if((LiShuDu_E[i]!=0)&&(LiShuDu_Changerate_E[j]!=0))
{
if(LiShuDu_E[i]<LiShuDu_Changerate_E[j])
temp=LiShuDu_E[i];
else temp=LiShuDu_Changerate_E[j];
pbpszonsnb=RuleTable[i][j];// 看看RuleTable[i][j]中为什么,看这个数对应的是NB NS ZO PB PS中的哪一个
mWmin(pbpszonsnb,temp);
}
}
//怎么判断哪个改变了???
//看PB PS ZO NS NB哪个改变了,改变了的那几个 比较求对应的大的那个,
//然后积分
//想把改变了的赋给**_Result[]数组,
//没有改变的还是初始值,都为0
//然后比较**_Result[]数组,求最大
if(PB_TF)
{
for(i=0;i<9;i++)
PB_Result[i]=PB[i];
}
if(PS_TF)
{
for(i=0;i<9;i++)
PS_Result[i]=PS[i];
}
if(ZO_TF)
{
for(i=0;i<9;i++)
ZO_Result[i]=ZO[i];
}
if(NS_TF)
{
for(i=0;i<9;i++)
NS_Result[i]=NS[i];
}
if(NB_TF)
{
for(i=0;i<9;i++)
NB_Result[i]=NB[i];
}
//先判断是否为全零,全零的剔出,不为全零的才处理
//上面是原来的想法,现在的做法是5个数组全参加比较
mWmax(); //想求alf8,alf9的最大值
//这个reasoning函数又怎么用呢
//求积分
//但好像只是传过来个数而已,数组并没有传过来
//在函数里面明明是0,为啥到返回值这就变成随机的一个数了??135的地方出现问题了
//在c++中不能返回数组?
PreIntegral(result); //构造用于积分的那个400大小的数组
//也是传数组的时候出问题了,394的地方出问题了
fenzi=FenziIntegral(ReSult,-4,4,400);//真正的积分,在(-4,4)上积分
//分子怎么办???
fenmu=FenmuIntegral(ReSult,-4,4,400);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -