p align="left">В классе CFuzzyApp реализована базовая функциональность стандартного MFC-приложения. В частности, переопределен виртуальный метод базового класса CWinApp::InitInstance(): BOOL CFuzzyApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CFuzzyDlg dlg; m_pMainWnd = &dlg; dlg.DoModal(); return FALSE; } В результате исполняемый код приложения был связан со спроектированным ранее визуальным интерфейсом (рисунок 3.1). В качестве члена в классе CFuzzyApp была введена переменная[6] dlg типа CFuzzyDlg. Она обеспечивает непосредственную связь приложения с интерфейсом, предоставляемого пользователю. В классе CFuzzyDlg выполняется инициализация диалога и элементов управления. BOOL CFuzzyDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); par_a.SetWindowText("1"); par_b.SetWindowText("3"); par_c.SetWindowText("5"); par_d.SetWindowText("9"); R_Tri=(CButton*)GetDlgItem(IDC_RADIO1); R_Tra=(CButton*)GetDlgItem(IDC_RADIO2); R_Ga=(CButton*)GetDlgItem(IDC_RADIO3); R_Ga2=(CButton*)GetDlgItem(IDC_RADIO4); R_Sig=(CButton*)GetDlgItem(IDC_RADIO5); param = new double[3]; WIDTH = 600; HEIGHT = 400; return TRUE; } С помощью элементов управления, являющимися объектами класса CEdit - par_a, par_b, par_c, par_d реализуется ввод параметров для функций принадлежности. В классе CFuzzyDlg имеются функции для построения координатных осей (функция CFuzzyDlg::Axis()) и отображения графика функции принадлежности (одна из функций CFuzzyDlg::PlotTriangle(), CFuzzyDlg::PlotTrapezoid(), CFuzzyDlg::PlotGaussian(),CFuzzyDlg::PlotGaussian2(), CFuzzyDlg::PlotSigmoid() в зависимости от типа функции, выбранной пользователем). Вывод графика осуществляется с помощью класса CDC, который При нажатии пользователем кнопки «Построить!!» происходит выполнение функции CFuzzyDlg::OnButton1(), из которой вызываются функции построения осей и функции принадлежности, выбранной пользователем или, если не был выбран тип функции, выдается сообщение «Выберите тип функции!!». Функции для построения координатных осей (функция CFuzzyDlg::Axis()) и отображения графика функции принадлежности (одна из функций CFuzzyDlg::PlotTriangle(), CFuzzyDlg::PlotTrapezoid(), CFuzzyDlg::PlotGaussian(),CFuzzyDlg::PlotGaussian2(), CFuzzyDlg::PlotSigmoid() в зависимости от типа функции, выбранной пользователем) вызываются так же при перерисовке окна (обработка сообщения WM_PAINT с помощью функции CFuzzyDlg::OnPaint()). void CFuzzyDlg::OnPaint() { CDialog::OnPaint(); Axis(); if (function==GAUSSIAN) PlotGaussian(); else if (function==TRIANGLE) PlotTriangle(); else if (function==TRAPEZOID) PlotTrapezoid(); else if (function==GAUSSIAN2) PlotGaussian2(); else if (function==SIGMOID) PlotSigmoid(); } Для того чтобы определить значение данной функции распределения в конкретной точке, в класс CFuzzyDlg была добавлена функция обработки сообщения перемещения манипулятора «Мышь» WM_MOUSEMOVE _ CFuzzyDlg::OnMouseMove(UINT nFlags, CPoint point). При перемещении мыши выводится значение точки x (с учетом масштаба) и степень принадлежности (значение данной функции принадлежности) этой точки x. void CFuzzyDlg::OnMouseMove(UINT nFlags, CPoint point) { if (point.x>10 && point.x<WIDTH && point.y>10 && point.y<HEIGHT) FF_SWISS, "Courier"); dc->SelectObject(font); dc->TextOut(50,10,"Точка x:"+coords+" Степень принадлежности:"+crds); CDialog::OnMouseMove(nFlags, point); } Результат выполнения программы изображен на рисунке 4.1. В данном случае построена сигмоидальная функция принадлежности. Рисунок 4.1 - Результат выполнения программы - сигмоидальная функция принадлежности ВЫВОДЫ Результатом работы является исполняемое Win32-приложение, позволяющее строить следующие функции принадлежности: - треугольную; - трапециидальную; - гауссовскую; - расширенную гауссовскую; - сигмоидальную. Так же программа позволяет определять значение степени принадлежности заданной точки x. В ходе разработки приложения были изучены структура и возможности набора классов MFC, принципы проектирования визуального интерфейса пользователя в операционной среде MS Windows с использованием среды разработки MS Visual Studio. Было замечено, что классы MFC существенно ускоряют процесс создания приложений для операционной системы Microsoft Windows. Так же были изучены основы теории нечетких множеств, в частности функции принадлежности. ПЕРЕЧЕНЬ ССЫЛОК 1. Microsoft Developer Network Library _ April 2003 2. Васильев В.И., Ильясов Б.Г. Интеллектуальные системы управления с использованием нечеткой логики: Учеб. пособие / Уфимск. гос. авиац. техн. ун-т. -Уфа, 1995. -80 c 3. Грегори К. Использование Visual C++ 6. Специальное издание.: Пер. с англ. - М.: СПб.; К.: Издательский дом «Вильямс», 2003. - 849 с. 4. Заде Л. Понятие лингвистической переменной и его применение к принятию приближенных решений. - М.: Мир, 1976. 5. Нечеткая логика _ математические основы _ BaseGroup Labs http://www.basegroup.ru/fuzzylogic/math_print.htm 6. Страуструп Бьярн Язык программирования C++ Второе издание. - К.: ДиаСофт, 1993. - 480 с. ПРИЛОЖЕНИЕ Приложение А Листинг программы // Fuzzy_.h: interface for the CFuzzy_ class. class CFuzzy_ { public: void fisError(char *msg); CFuzzy_(); virtual ~CFuzzy_(); double CFuzzy_::fisTriangleMf(double x, double *params); double fisTrapezoidMf(double x, double *params); double fisGaussianMf(double x, double *params); double fisGaussian2Mf(double x, double *params); double fisSigmoidMf(double x, double *params); }; // Fuzzy_.cpp: implementation of the CFuzzy_ class. #include "stdafx.h" #include "fuzzy.h" #include "Fuzzy_.h" #include <math.h> #ifndef ABS # define ABS(x) ( (x) > (0) ? (x): (-(x)) ) #endif #ifndef MAX # define MAX(x,y) ( (x) > (y) ? (x) : (y) ) #endif #ifndef MIN # define MIN(x,y) ( (x) < (y) ? (x) : (y) ) #endif CFuzzy_::CFuzzy_() { } CFuzzy_::~CFuzzy_() { } /* Triangular membership function */ double CFuzzy_::fisTriangleMf(double x, double *params) { double a = params[0], b = params[1], c = params[2]; if (a>b) {fisError("Illegal parameters in fisTriangleMf() --> a > b");return -1;} if (b>c) {fisError("Illegal parameters in fisTriangleMf() --> b > c");return -1;} if (a == b && b == c) return(x == a); if (a == b) return((c-x)/(c-b)*(b<=x)*(x<=c)); if (b == c) return((x-a)/(b-a)*(a<=x)*(x<=b)); return(MAX(MIN((x-a)/(b-a), (c-x)/(c-b)), 0)); } /* Trapezpoidal membership function */ double CFuzzy_::fisTrapezoidMf(double x, double *params) { double a = params[0], b = params[1], c = params[2], d = params[3]; double y1 = 0, y2 = 0; if (a>b) { fisError("Illegal parameters in fisTrapezoidMf() --> a > b"); } if (b>c) { fisError("Illegal parameters in fisTrapezoidMf() --> b > c"); } if (c>d) { fisError("Illegal parameters in fisTrapezoidMf() --> c > d"); } if (b <= x) y1 = 1; else if (x < a) y1 = 0; else if (a != b) y1 = (x-a)/(b-a); if (x <= c) y2 = 1; else if (d < x) y2 = 0; else if (c != d) y2 = (d-x)/(d-c); return(MIN(y1, y2)); } /* Gaussian membership function */ double CFuzzy_::fisGaussianMf(double x, double *params) { double sigma = params[0], c = params[1]; double tmp; if (sigma==0) fisError("Illegal parameters in fisGaussianMF() --> sigma = 0"); tmp = (x-c)/sigma; return(exp(-tmp*tmp/2)); } /* Extended Gaussian membership function */ double CFuzzy_::fisGaussian2Mf(double x, double *params) /* Sigmoidal membership function */ double CFuzzy_::fisSigmoidMf(double x, double *params) { double a = params[0], c = params[1]; return(1/(1+exp(-a*(x-c)))); } void CFuzzy_::fisError(char *msg) MB_ICONSTOP); // fuzzy.h : main header file for the FUZZY application CFuzzyApp #include "resource.h" class CFuzzyApp : public CWinApp { public: CFuzzyApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFuzzyApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CFuzzyApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // fuzzy.cpp : Defines the class behaviors for the application. CFuzzyApp #include "stdafx.h" #include "fuzzy.h" #include "fuzzyDlg.h" BEGIN_MESSAGE_MAP(CFuzzyApp, CWinApp) //{{AFX_MSG_MAP(CFuzzyApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() CFuzzyApp::CFuzzyApp() { } CFuzzyApp theApp; // CFuzzyApp initialization BOOL CFuzzyApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CFuzzyDlg dlg; m_pMainWnd = &dlg; dlg.DoModal(); // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; } // fuzzyDlg.h : header file // CFuzzyDlg dialog class CFuzzyDlg : public CDialog { // Construction public: void PlotTrapezoid(); void PlotTriangle(); void PlotGaussian(); void PlotSigmoid(); void PlotGaussian2(); void Axis();
Страницы: 1, 2, 3, 4
|