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

📄 fuzzydlg.cpp

📁 利用人工智能的模糊算法,实现了一个模糊控制的温控系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -