Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Контрольная работа по курсу «Системный анализ и проектирования информационных систем»
Вариант № 1
Выполнил: Андрейчиков В.В. гр. 802 301
Проверил: Живицкая Е.Н.
Минск 2011 Содержание
Содержание 2 Описание задачи 3 Решение задачи (ручной способ) 3 Программа по решению задачи 3 Примечания: 3 Заголовочный файл диалога «MetParnAndrDlg.h» 3 Исполняемый файл диалога «MetParnAndrDlg.cpp» 3 Руководство пользователя 3 Выводы 3
Описание задачи.
В данной контрольной работе рассматриваются два способа (ручной и машинный) решения неструктуризованной проблемы методом парных сравнений. Этот метод относится к методам, основанным на оценках экспертов в конкретной области. Следует обратить внимание на то, что в методе парных сравнений используется индивидуальная экспертная оценка, в отличие от методов в которых используются коллективные экспертные оценки. Для решения поставленной задачи эксперту предлагается сделать выбор между различными альтернативами. Альтернативы группируются в пары. Пары выбираются так, чтобы каждая альтернатива попарно сочетались со всеми остальными. После того, как эксперт отдаст своё предпочтение одной из альтернатив, в каждой паре мы имеем набор эвристической информации, которая не годится для анализа и машинной обработки. При формировании качественной информации – удобной для анализа, используется одна из модификаций метода парных сравнений. Альтернативы номеруются в виде определенных целей Z1,Z2,…,Zn. На первом этапе составляется матрица бинарных предпочтений, на основе предпочтений отданных экспертом. Далее определяется цена каждой цели путём суммирования булевых переменных из матрицы предпочтений, вычисляются веса каждой цели и на их основе устанавливается порядок предпочтения целей. Поставленная задача в данной контрольной работе состоит в определении наиболее эффективного использования денежных средств выделенных на ремонт кинотеатра. Эксперту предложены следующие альтернативы: 1) покупка новой киноаппаратуры; 2) косметический ремонт здания; 3) покупка новой мебели в зрительный зал.
Матрица бинарных предпочтений, составленная по результату работы эксперта: Zj Z1 Z2 Z3 Z1 - 0 1 Z2 1 - 1 Z3 0 0 - Таблица 1. Матрица бинарных предпочтений. Решение задачи (ручной способ)
Исходные данные для решения задачи описаны в разделе «Описание задачи». Начнем решение задачи с определения цены каждой цели. Для этого складываем значения переменных по строкам: С1=1; С2=2; С3=0. Полученные значения характеризуют значимость каждой цели, однако для удобства сравнения используют нормированные значения – веса:
Проверка правильности расчета: . Таким образом, цели расположатся в следующем порядке убывания предопчтения: Z2; Z1; Z3
Программа по решению задачи
Примечания: • Использована библиотека классов MFC объектно-ориентированного языка C++. • Программа позволяет менять исходные данные Заголовочный файл диалога «MetParnAndrDlg.h» // MetParnAndrDlg.h : header file //
#pragma once #include "afxwin.h"
// CMetParnAndrDlg dialog class CMetParnAndrDlg : public CDialog { // Construction public: CMetParnAndrDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data enum { IDD = IDD_METPARNANDR_DIALOG };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation protected: HICON m_hIcon;
// Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: BOOL xbool[3][3]; //Массив переменных матрицы бинарных предпочтений. void Rechange(short,short); /* Функция для реализацые единственно возможного выбора в паре целей. Здесь же проиходит расчет задачи и вывод результата */ void Prefer(short,CString&); /* Функция для вывода комментария при заполнении матрицы (эвристическое представление)*/ public: // Далее обработчики булевых переключателей. afx_msg void OnBnClickedCheck10(); afx_msg void OnBnClickedCheck01(); afx_msg void OnBnClickedCheck20(); afx_msg void OnBnClickedCheck02(); afx_msg void OnBnClickedCheck21(); afx_msg void OnBnClickedCheck12(); public: // Переменные связанные с элементами диалога. // Служат для описания целей. CString strZ1; CString strZ2; CString strZ3; public: // Две переменные связаные с элементами диалога. // Назначение - описание действия при заполнении таблицы. CString strHighPr; CString strLowPr; public: //void ShowRes(double,CEdit&); public: // Оброботчики, для обновления привязанных переменных. afx_msg void OnEnChangeEdit1(); afx_msg void OnEnChangeEdit2(); afx_msg void OnEnChangeEdit3(); };
// 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 UpdateData(); Rechange(2,0); //меняем предпочтения в паре для того, //чтобы было как в исходных. нужно для первоначального расчета return TRUE; // return TRUE unless you set the focus to a control }
// 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 CMetParnAndrDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting
// 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 function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMetParnAndrDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMetParnAndrDlg::Prefer(short index,CString &prefStr) // Ф-я получает индекс алтернативы и // ссылку на строку в кот. будет вставлено текстовое описание { switch(index) // { case 0: prefStr=strZ1;break; case 1: prefStr=strZ2;break; case 2: prefStr=strZ3;break; } UpdateData(FALSE); } void CMetParnAndrDlg::Rechange(short i,short j) { xbool[i][j]=!xbool[i][j]; //Инверсия булевых значений xbool[j][i]=!xbool[j][i]; if(xbool[i][j]==TRUE) // Если истина задана для строки { Prefer(i,strLowPr); // то в предпочтение заносим индекс строки Prefer(j,strHighPr) ;} else { Prefer(j,strLowPr); // иначе наоборот. Prefer(i,strHighPr) ;}
UpdateData(FALSE); //Обновлемя чеки
//далее расчет весов для каждой алтернативы int c[3]; //три цели for(i=0;i<3;c[i++]=0); i=0;j=0; for(j=0;j<3;j++) { for(i=0;i<3;i++) { if(i!=j) c[j]+=xbool[i][j]; } } int sum=0; for(i=0;i<3;i++) sum+=c[i]; //хотя можно не считать - всегда д.б. три double r[3][2]; // for(i=0;i<3;i++) { r[i][1]=i+1;//индекс для сортировки r[i][0]=double(c[i])/double(sum); } // выводим веса CString strRes; strRes.Format(_T("%.3f"),r[0][0]); this->SetDlgItemTextW(IDC_EDIT6,strRes); strRes.Format(_T("%.3f"),r[1][0]); this->SetDlgItemTextW(IDC_EDIT7,strRes); strRes.Format(_T("%.3f"),r[2][0]); this->SetDlgItemTextW(IDC_EDIT8,strRes);
//Сортировка. Принцип: Берется первый элемент (ЦИКЛ1), //Он занимает место максимального. //Во втором цикле находится элемент больший первого и // всех остальных. Он ставится на место первого. // Так далее до конца массива. (Сортировка идет по весам)
for(i=0;i<2;i++) //берём итый элемент { int maxInd=i; double rechBuf[2]; for(j=1;j<3;j++) { if(r[j][0]>r[maxInd][0]) maxInd=j; } memcpy(rechBuf,r[maxInd],sizeof(double)*2); memcpy(r[maxInd],r[i],sizeof(double)*2); memcpy(r[i],rechBuf,sizeof(double)*2);
После запуска программы отображается главное диалоговое окно. Здесь уже внесены исходные данные, а также отображается результат работы программы над этими данными. Исходные данные могут быть изменены.
Рис. 1. Главное диалоговое окно Рассмотрим отдельно каждую группу элементов этого диалога.
На рис. 2 показана группа элементов, отображающая текстовое описание каждой из целей, поставленных в задаче. Элементы, представляющие собой поля для редактирования, связаны с соответствующими переменными.
Рис. 2. Группа элементов диалога. Цели.
Рис. 3. Группа элементов диалога. Веса.
Рис. 4. Группа элементов диалога. Матрица бинарных предпочтений.
На рис. 3 показана группа элементов, отображающая расчетные веса для каждой цели. Обновление данных в этих элементах происходит при изменении данных в матрице бинарных предпочтений (Рис. 4.), которая реализована в виде группы элементов, позволяющих делать единственно возможный выбор TRUE или FALSE (истина или ложь). Следует отметить, что эта матрица в режиме реального времени контролирует правильность вводимых пользователем данных, а именно не позволяет в группе рассматриваемых альтернатив сделать двойственный выбор. Особое внимание следует уделить группе элементов отображенных на рис. 5.
Рис. 5. Группа элементов диалога. Сравниваемая пара. Эти элементы, а конкретно поле «Вы отдали предпочтение» и поле «Перед альтернативой», служат для мгновенного преобразования качественной информации, вводимой в матрицу бинарных предпочтений, в эвристическую информацию. Это исключает ошибки и неправильное понимание при заполнении данных. Эта группа элементов является своего рода комментарием к действиям, производимым пользователем. Такая реализация метода позволяет освоить его даже незнакомому с этим методом эксперту. Последний элемент предназначен для отображения результата решаемой проблемы (Рис.6). В поле для редактирования в порядке убывания предпочтений располагаются рассматриваемые альтернативы.
Рис. 6. Рассмотрим пример работы с программой (Рис.7). Изменим исходные данные, отображенные на рис.1:
Рис. 7. Пример работы с программой. Щелчком по элементу лежащему на пересечений строки Z1 и столбца Z2 мы внесли изменения в матрицу бинарных предпочтений. В группе элементов «Сравниваемая пара» отобразился комментарий к нашим действиям. Мгновенно изменились веса и порядок предпочтений.
ч Выводы
Целью данной контрольной работы было ознакомление с одним из методов решения неструктуризованных проблем, рассматриваемых в дисциплине «Системный анализ и проектирования информационных систем» - методом парных сравнений. На конкретном примере было рассмотрено два варианта решения задачи – письменный и программный. Несомненно, решение задачи с помощью компьютерной программы является более удобным, наглядным и безошибочным. Особое внимание следует обратить на огромную скорость обработки данных, что позволяет прогрессивное развитие высоких технологий в наши дни. Скорость обработки важна во многих отношения. Самым важным является экономия ресурсов и возможность оперативного принятия решения. Несмотря на вышесказанное, ручное решение задачи является необходимым этапом при разработки программы, так как позволяет правильно понять все этапы метода, помогает правильно разработать алгоритм и исключает возможные ошибки в понимании метода. Разработанная мной программа, на мой взгляд, полностью реализует анализ данных методом парных сравнений. Плюс ко всему, программа позволяет решать не только поставленную задачу, а также и задачи с другими исходными данными. Особым достоинством своей программы я считаю возможность мгновенного описания в эвристической форме изменений исходной информации в качественной форме. Однако программа не является универсальной, так как предназначена для решения только для трёх предложенных альтернатив. Поэту имеется возможность для дальнейшего усовершенствования программы. Используя преимущества объектно-ориентированного программирования, такие как: возможность создание собственного класса, наследование и полиморфизм, можно реализовать возможность задания пользователем числа необходимых альтернатив и основываясь на этих данных составить матрицу бинарных предпочтений необходимого размера.