Информационная система двухкритериальной оптимизации
Изучение сравнительной эффективности проектных решений по летательным аппаратам. Разработка информационной системы двухкритериальной оптимизации по методу принятия решений в пространстве критериев "стоимость – эффективность" на языке программирования C++.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 08.10.2018 |
Размер файла | 2,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Культура
25.11.2013
14
Участвовал в меж факультетскими соревновании по боулингу. Прошли в финал.
Спорт
05.12.2013
15
Постоянное участие в СТЭМе ФИСТ
Культура
24.03.2014
ЗАКЛЮЧЕНИЕ
В ходе выпускной квалификационной работы была поставлена задача поиска оптимальной альтернативы. В ходе изучения была написана программа двухкритериальной оптимизации на основе метода предложенный профессором С.А. Пиявским «Простой и универсальный метод принятия решений в пространстве критериев «стоимость - эффективность».
Разработанная программа отвечает всем поставленным целям и задачам.
- авторизация и разграничение прав пользователей в системе;
- ведение справочника пользователей;
- решение задачи двухкритериальной оптимизации;
- ввод и редактирование исходных данных для решения задачи двухкритериальной оптимизации;
- сохранение результатов решения задач двухкритериальной оптимизации с последующим поиском по имени;
- формирование отчета по результатам двухкритериальной оптимизации в экранной и графической форме;
- демонстрация решения задачи двухкритериальной оптимизации на примере летательных аппаратов;
- просмотр и редактирование сохраненных и задач.
Результат исследования показывает сравнительную эффективность проектных решений по летательным аппаратам.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Пиявский, С.А. Простой и универсальный метод принятия решений в пространстве критериев «стоимость - эффективность» [Текст]. - Самара: Самарск. гос. арх.-строит. ун-т., 2014. - 21 с.
2. Ларичев, О.И. Вербальный анализ решений [Текст]. - Москва: 2006. - 181 с.
3. Множество Эджворта-Парето [Электронныйресурс] /URL: http://lektsii.net/3_51648.html/ (дата обращения: 20.05.2016)
4. Пиявский, С.А. Два новых понятия верхнего уровня в онтологии многокритериальной оптимизации [Текст]. - Самара: Самарск. гос. арх._строит. ун-т., 2013 - с. 65-85
5. Программа ПРИНН6 [Электронныйресурс] /URL: http://sciyouth.ru/ (дата обращения: 15.05.2016)
6. Программа принятия решений в многокритериальных ситуациях (mbi-ahp) [Электронныйресурс] http://simplecs.ru/files/Progr_ex2.pdf (дата обращения: 23.05.2016)
7. Дерябкин, В.П. Проектирование информационных систем по
8. методологии UML[Текст] /В.П.Дерябкин,, В.В/ Козлов - Самара:
9. Самарск. гос. арх.-строит. ун-т., 2008. - 42 с.
10. Леоненков, А.В. Самоучитель UML[Текст]/А.В. Леоненков// 2-е изд., пер. и доп. - СПб.: БХВ-Петербург, 2004. - 432 с.
11. Дерябкин, В.П. Проектирование автоматизированных систем обработки информации и управления: курс лекций [Текст]. - Самара: СГАУ, 2001. - 120 с.
ПРИЛОЖЕНИЕ А
Листинг основных программных модулей
#include "tasks.h"
#include <QSqlQuery>
#include <QVariant>
#include "Core/application.h"
#include <QList>
#include <QtAlgorithms>
#include <QPoint>
#include <Models/criterionfunctions.h>
#include <QStringList>
Tasks::Tasks()
{
this->_id = 0;
}
void Tasks::setId(int value)
{
this->_id = value;
}
void Tasks::setUserId(int value)
{
this->_user_id = value;
}
void Tasks::setName(const QString &value)
{
this->_name = value;
}
void Tasks::setTime(QDateTime value)
{
this->_time = value;
}
void Tasks::setFunctionId(int num, int value)
{
switch(num)
{
case 1:
this->_func1_id = value;
break;
case 2:
this->_func2_id = value;
break;
}
}
void Tasks::setCriterionName(int num, const QString &value)
{
switch(num)
{
case 1:
this->_criterion1_name = value;
break;
case 2:
this->_criterion2_name = value;
break;
}
}
int Tasks::id()
{
return this->_id;
}
int Tasks::userId()
{
return this->_user_id;
}
QString Tasks::name()
{
return this->_name;
}
QDateTime Tasks::time()
{
return this->_time;
}
int Tasks::functionId(int num)
{
switch(num)
{
case 1:
return this->_func1_id;
case 2:
return this->_func2_id;
}
return 0;
}
QString Tasks::function(int num)
{
int _func_id = (num == 1 ? this->_func1_id: this->_func2_id);
CriterionFunctions * cf = CriterionFunctions::byId(_func_id);
return (cf == NULL ? NULL: cf->name());
}
QString Tasks::criterionName(int num)
{
switch(num)
{
case 1:
return this->_criterion1_name;
case 2:
return this->_criterion2_name;
}
return NULL;
}
TaskData * Tasks::data(const QString &name)
{
if(!this->_data.contains(name))
{
TaskData * taskData = new TaskData;
taskData->id_efficiency = 1;
this->_data.insert(name, taskData);
}
return this->_data.value(name);
}
QStringList Tasks::dataNames()
{
return this->_data.keys();
}
Tasks *Tasks::byId(int id)
{
QSqlQuery query;
query.prepare("SELECT * FROM Tasks WHERE id_tasks=:id");
query.bindValue(":id", id);
query.exec();
if(query.next())
{
Tasks * task = new Tasks();
task->setUserId(query.value(0).toInt());
task->setId(query.value(1).toInt());
task->setName(query.value(2).toString());
task->setTime(query.value(3).toDateTime());
task->setFunctionId(1, query.value(4).toInt());
task->setFunctionId(2, query.value(5).toInt());
task->setCriterionName(1, query.value(6).toString());
task->setCriterionName(2, query.value(7).toString());
query.clear();
query.prepare("SELECT * FROM Data WHERE id_tasks=:task_id");
query.bindValue(":task_id", task->id());
query.exec();
while(query.next())
{
task->data(query.value(1).toString())->criterion1 = query.value(2).toDouble();
task->data(query.value(1).toString())->criterion2 = query.value(3).toDouble();
task->data(query.value(1).toString())->id_efficiency = query.value(4).toInt();
task->data(query.value(1).toString())->chanceN = query.value(6).toDouble();
task->data(query.value(1).toString())->softm = query.value(7).toDouble();
task->data(query.value(1).toString())->ncrit1 = query.value(8).toDouble();
task->data(query.value(1).toString())->ncrit2 = query.value(9).toDouble();
}
return task;
}
else
{
return NULL;
}
}
QList<Tasks *> Tasks::all()
{
QSqlQuery query;
query.exec("SELECT * FROM Tasks WHERE id_users=" + QString::number(Application::gI()->USER->id()));
QList<Tasks *> tasks;
while(query.next())
{
Tasks * task = new Tasks();
task->setUserId(query.value(0).toInt());
task->setId(query.value(1).toInt());
task->setName(query.value(2).toString());
task->setTime(query.value(3).toDateTime());
task->setFunctionId(1, query.value(4).toInt());
task->setFunctionId(2, query.value(5).toInt());
task->setCriterionName(1, query.value(6).toString());
task->setCriterionName(2, query.value(7).toString());
QSqlQuery queryData;
queryData.prepare("SELECT * FROM Data WHERE id_tasks=:task_id");
queryData.bindValue(":task_id", task->id());
queryData.exec();
while(queryData.next())
{
task->data(queryData.value(1).toString())->criterion1 = queryData.value(2).toDouble();
task->data(queryData.value(1).toString())->criterion2 = queryData.value(3).toDouble();
task->data(queryData.value(1).toString())->id_efficiency = queryData.value(4).toInt();
task->data(queryData.value(1).toString())->chanceN = queryData.value(6).toDouble();
task->data(queryData.value(1).toString())->softm = queryData.value(7).toDouble();
task->data(queryData.value(1).toString())->ncrit1 = queryData.value(8).toDouble();
task->data(queryData.value(1).toString())->ncrit2 = queryData.value(9).toDouble();
}
tasks.append(task);
}
return tasks;
}
void Tasks::removeAll()
{
QSqlQuery query;
query.prepare("SELECT * FROM Tasks WHERE id_users=:id");
query.bindValue(":id", Application::gI()->USER->id());
query.exec();
while(query.next())
{
QSqlQuery queryData;
queryData.prepare("DELETE FROM Data WHERE id_tasks=:task_id");
queryData.bindValue(":task_id", query.value(1).toInt());
queryData.exec();
}
query.clear();
query.prepare("DELETE FROM Tasks WHERE id_users=:id");
query.bindValue(":id", Application::gI()->USER->id());
query.exec();
}
void Tasks::save()
{
this->_user_id = Application::gI()->USER->id();
this->_time = QDateTime::currentDateTime();
QSqlQuery query;
if(this->_id == 0)
{
query.prepare("INSERT INTO Tasks ("
"id_users, "
"name_tasks, "
"save_date, "
"id_function1, "
"id_function2, "
"name_criterion1, "
"name_criterion2"
") VALUES ("
":user_id, "
":name, "
":time, "
":func1_id, "
":func2_id, "
":criterion1_name, "
":criterion2_name"
")");
}
else
{
query.prepare("UPDATE Tasks SET "
"id_users=:user_id, "
"name_tasks=:name, "
"save_date=:time, "
"id_function1=:func1_id, "
"id_function2=:func2_id, "
"name_criterion1=:criterion1_name, "
"name_criterion2=:criterion2_name "
"WHERE id_tasks=:id");
query.bindValue(":id", this->_id);
}
query.bindValue(":user_id", this->_user_id);
query.bindValue(":name", this->_name);
query.bindValue(":time", this->_time);
query.bindValue(":func1_id", this->_func1_id);
query.bindValue(":func2_id", this->_func2_id);
query.bindValue(":criterion1_name", this->_criterion1_name);
query.bindValue(":criterion2_name", this->_criterion2_name);
query.exec();
if(this->_id == 0)
{
query.clear();
query.exec("SELECT id_tasks FROM Tasks ORDER BY id_tasks DESC");
if(query.next())
{
this->_id = query.value(0).toInt();
}
}
query.clear();
query.prepare("DELETE FROM Data WHERE id_tasks=:task_id");
query.bindValue(":task_id", this->_id);
query.exec();
foreach(QString key, this->_data.keys())
{
query.clear();
query.prepare("INSERT INTO Data ("
"id_tasks, "
"name_alternative, "
"criterion1, "
"criterion2, "
"id_efficiency, "
"chance_optimality, "
"chanceN, "
"softm, "
"ncrit1, "
"ncrit2"
") VALUES ("
":task_id, "
":name, "
":criterion1, "
":criterion2, "
":efficiency, "
":chance_optimality, "
":chanceN, "
":softm, "
":ncrit1, "
":ncrit2"
")");
query.bindValue(":task_id", this->_id);
query.bindValue(":name", key);
query.bindValue(":criterion1", this->data(key)->criterion1);
query.bindValue(":criterion2", this->data(key)->criterion2);
query.bindValue(":efficiency", this->data(key)->id_efficiency);
query.bindValue(":chanceN", this->data(key)->chanceN);
query.bindValue(":softm", this->data(key)->softm);
query.bindValue(":ncrit1", this->data(key)->ncrit1);
query.bindValue(":ncrit2", this->data(key)->ncrit2);
query.exec();
}
}
void Tasks::remove()
{
QSqlQuery query;
query.prepare("DELETE FROM Tasks WHERE id_tasks=:id");
query.bindValue(":id", this->_id);
query.exec();
query.clear();
query.prepare("DELETE FROM Data WHERE id_tasks=:id");
query.bindValue(":id", this->_id);
query.exec();
this->_id = 0;
}
bool criterion1Compare(const CriterionNormalize * a, const CriterionNormalize * b)
{
return a->first < b->first;
}
bool criterion2Compare(const CriterionNormalize * a, const CriterionNormalize * b)
{
return a->second < b->second;
}
QList<CriterionNormalize *> Tasks::calculate()
{
QList<CriterionNormalize *> criterionNormalize;
foreach(QString key, this->_data.keys())
{
CriterionNormalize * cn = new CriterionNormalize;
cn->name = key;
cn->first = this->data(key)->criterion1;
cn->second = this->data(key)->criterion2;
// может это лишнее
// cn->chanceN = this->data(key)->chanceN;
// cn->ncrit1 = this->data(key)->ncrit1;
// cn->ncrit2 = this->data(key)->ncrit2;
// cn->softm = this->data(key)->softm;
//Application::gI()->onHelp(QString::number(cn->softm));
criterionNormalize.append(cn);
}
double c1_min = (*std::min_element(criterionNormalize.begin(), criterionNormalize.end(), criterion1Compare))->first;
double c2_min = (*std::min_element(criterionNormalize.begin(), criterionNormalize.end(), criterion2Compare))->second;
double c1_max = (*std::max_element(criterionNormalize.begin(), criterionNormalize.end(), criterion1Compare))->first;
double c2_max = (*std::max_element(criterionNormalize.begin(), criterionNormalize.end(), criterion2Compare))->second;
#define SIZE 50
#define SAVAT 10005
#define MAN 10
int n=0,j=0,i=0,m=0,d=0,z=0,a=0,good=0, bad=0, equ=0, Pareto[SIZE],P=0,s=0,Z1=0,K;
double A[SIZE][MAN],X[SIZE][MAN],N[SIZE][MAN],
maxS=0,minS=0,maxEf=0,minEf=0,b=0,c=0,K1=0,
K2=0,Ef=0,S=0,Normirovan[SIZE][MAN],
indeks[SIZE][MAN],interval[SIZE][MAN],Optimal[SIZE],
V[SAVAT][MAN],maxV=0,qF[SIZE],
sF[SIZE],Ma[SIZE];
//очистка от мусора
memset(A, 0, sizeof(A));
memset(X, 0, sizeof(X));
memset(N, 0, sizeof(N));
memset(Pareto, 0, sizeof(Pareto));
memset(Normirovan, 0, sizeof(Normirovan));
memset(indeks, 0, sizeof(indeks));
memset(interval, 0, sizeof(interval));
memset(Optimal, 0, sizeof(Optimal));
memset(V, 0, sizeof(V));
memset(qF, 0, sizeof(qF));
memset(sF, 0, sizeof(sF));
memset(Ma, 0, sizeof(Ma));
// переводим в "привычный" массив
n=0;
foreach(CriterionNormalize * cn, criterionNormalize){
A[n][0]=n+1;
A[n][1]=cn->first;
A[n][2]=cn->second;
cn->order=n;
n++;
}
maxS=A[0][1]; minS=A[0][1];
maxEf=A[0][2]; minEf=A[0][2];
for (i = 0; i < n; i++) //поиск max,min
{
if (A[i][1]>maxS)
{
maxS=A[i][1];
}
if (A[i][1]<minS)
{
minS=A[i][1];
}
if (A[i][2]>maxEf)
{
maxEf=A[i][2];
}
if (A[i][2]<minEf)
{
minEf=A[i][2];
}
}
for (i = 0; i < n; i++)
{
if (this->_func1_id==2) {
N[i][0]=((A[i][1]-minS)/(maxS-minS));
}
else{
// N[i][0]=(1-((A[i][2]-minEf)/(maxEf-minEf)));
N[i][0]=(1-((A[i][1]-minS)/(maxS-minS)));
}
if (this->_func2_id==2) {
// N[i][1]=((A[i][1]-minS)/(maxS-minS));
N[i][1]=((A[i][2]-minEf)/(maxEf-minEf));
}
else{
N[i][1]=(1-((A[i][2]-minEf)/(maxEf-minEf)));
}
}
m=3;
//Поиск Парето-оптимальных вариантов
for (i = 0; i < n-1; i++)
{
for (j =i+1; j < n; j++)
{
good = 0; equ = 0; bad = 0;
for (d = 0; d < m-1; d++)
{
if(N[i][d]>N[j][d])
{
good = good + 1;
}
if (N[i][d] == N[j][d])
{
equ = equ + 1;
}
if(N[i][d]<N[j][d])
{
bad = bad + 1;
}
}
if (bad == 0)
{
if (good>0)
{
Pareto[i] = Pareto[i]+1;
}
}
if (good == 0)
{
if(bad>0)
{
Pareto[j] = Pareto[j]+1;
}
}
}
};
z=0;
for (i = 0; i < n; i++)//Записать только Оптимальные в другой массив
{
if (Pareto[i] == 0)
{
X[z][0]=A[i][0];
X[z][1]=A[i][1];
X[z][2]=A[i][2];
Normirovan[z][0]=N[i][0];
Normirovan[z][1]=N[i][1];
z++;
K=i;
}
}
if (1<z) //если больше одного продолжаем дальше
{
//сортировка по нормированной стоимости
for(i = z-1; i >= 0; i--)
{
for(j = 0; j < i; j++)
{
if (Normirovan[j][0] > Normirovan[j+1][0])
{
a=X[j][0];
S=X[j][1];
Ef=X[j][2];
b=Normirovan[j][0];
c=Normirovan[j][1];
X[j][0]=X[j+1][0];
X[j][1]=X[j+1][1];
X[j][2]=X[j+1][2];
Normirovan[j][0]=Normirovan[j+1][0];
Normirovan[j][1]=Normirovan[j+1][1];
X[j+1][0]=a;
X[j+1][1]=S;
X[j+1][2]=Ef;
Normirovan[j+1][0]=b;
Normirovan[j+1][1]=c;
}
}
}
for (i = 0; i < z; i++) //расчет индекса 1
{
indeks[i][0]=Normirovan[i+1][0]/Normirovan[i][1];
}
indeks[z-1][0]=0;
for (i = 0; i < z; i++) //расчет индекса 2
{
indeks[i][1]=1/indeks[i][0];
}
indeks[z-1][1]=0;
K1=0;
K2=0;
if(indeks[0][0]<1)
{
interval[0][0]=indeks[0][0];
Z1=0;K1 = K1 + interval[0][0];
for (i = 1; i < z; i++) //расчет интервала по индексу1 < 1
{
if(indeks[i][0]<1 and indeks[i][0]>0)
{
if(indeks[i-1][0]>indeks[i][0])
{
interval[i][0]=indeks[i-1][0]-indeks[i][0];
K1 = K1 + interval[i][0];
Z1=i;
}
else
{
interval[i][0]=indeks[i][0]-indeks[i-1][0];
K1 = K1 + interval[i][0];
Z1=i;
}
}
else
{
break;
}
}
}
interval[Z1+1][0]=1-K1;
Z1=z-1;
for (i = z-1; i >= 0; i--) //расчет интервала по индексу2 < 1
{
if(indeks[i][1]<1 and indeks[i+1][1]<1)
{
if(indeks[i][1]>indeks[i+1][1])
{
interval[i+1][1]=indeks[i][1]-indeks[i+1][1];
K2 = K2 + interval[i+1][1];
Z1=i;
}
else
{
interval[i+1][1]=indeks[i+1][1]-indeks[i][1];
K2 = K2 + interval[i+1][1];
Z1=i;
}
}
else
{
break;
}
}
interval[Z1][1]=1-K2;
}
else
{
interval[0][0]=1;
interval[0][1]=1;
N[K][0]=0;
N[K][1]=0;
}
for (i = 0; i < z; i++)
{
interval[i][2]=interval[i][0]+interval[i][1];
}
for (i = 0; i < z; i++) //расчет оптимальности
{
Optimal[i]=interval[i][2]*50;
}
V[0][0]=0;
V[0][1]=1;
P=1000;
for (i = 1; i <= P; i++)
{
V[i][0]=V[i-1][0]+0.001;
V[i][1]=V[i-1][1]-0.001;
}
V[P][1]=0;
for (i = 0; i <= P; i++)
{
maxV=0;
if (V[i][0]>V[i][1])
{
maxV=V[i][0];
}
else
{
maxV=V[i][1];
}
V[i][0]=V[i][0]/maxV;
V[i][1]=V[i][1]/maxV;
}
for (s = 0; s <= P; s++)
{
for (i = 0; i < n; i++)
{
qF[i]=0;
if((V[s][0]*N[i][0])>(V[s][1]*N[i][1]))
{
qF[i]=V[s][0]*N[i][0];
}
else
{
qF[i]=V[s][1]*N[i][1];
}
}
for (i = 0; i < n; i++)
{
sF[i]=sF[i]+qF[i];
}
}
for (i = 0; i < n; i++)
{
Ma[i]=100*(1-(sF[i]/P));
}
maxS=0;
for (i = 0; i < n; i++)
{
maxS=maxS+Ma[i];
}
for (i = 0; i < n; i++)
{
Ma[i]=((Ma[i]*100)/maxS);
}
n=0;
// а теперь все обратно
foreach(CriterionNormalize * cn, criterionNormalize){
cn->softm=Ma[n];
cn->ncrit1=N[n][0];
cn->ncrit2=N[n][1];
cn->chanceN=0;
for (i = 0; i < z; i++){
if (X[i][0]-1==cn->order){
cn->chanceN = Optimal[i];
}
}
n++;
float digit;
digit = ((int)(cn->softm*100 + 0.5))/100.0;
this->data(cn->name)->softm = digit;
digit = ((int)(cn->chanceN*100 + 0.5))/100.0;
this->data(cn->name)->chanceN = digit;
digit = ((int)(cn->ncrit1*100 + 0.5))/100.0;
this->data(cn->name)->ncrit1 = digit;
digit = ((int)(cn->ncrit2*100 + 0.5))/100.0;
this->data(cn->name)->ncrit2 = digit;
}
foreach(CriterionNormalize * cn, criterionNormalize)
{
cn->first = (cn->first - c1_min) / (c1_max - c1_min);
if(this->functionId(1) == 1)
{
cn->first = 1 - cn->first;
}
cn->second = (cn->second - c2_min) / (c2_max - c2_min);
if(this->functionId(2) == 1)
{
cn->second = 1 - cn->second;
}
}
return criterionNormalize;
}
ПРИЛОЖЕНИЕ Б
Руководство пользователя
Б.1 Назначение системы
Система предназначена для помощи принятия решений, на основе расчета шанса оптимальности эффективных альтернатив. Она применяется для автоматического расчета результатов, а также повторно использования данных сохраненных задач.
Система имеет разделение прав доступа на 2 группы пользователей:
- ЛПР
- Администратора БД
Каждый пользователь получает свои собственные экранные формы для выполнения своих задач в системе, содержащие все необходимые компоненты для ввода и обработки данных.
Б.2 Условия выполнения система
Для начала работы в система, необходимо выполнить авторизацию, после чего откроется окно с кнопками и функциями пользователя, который вошел в систему. Запуск двух и более копий системы на одном компьютере невозможен. Перед началом работы, база данных должна быть закрыта, если она использовалась в СУБД Microsoft Access.
Б.3 Требования к персоналу (пользователю)
Пользователь системы должен иметь представление о вводе данных в экранные формы. Все компоненты графического интерфейса являются стандартными для оконных систем Windows, знаний программирования или языка обращений к базам данных не требуется.
Пользователь-администратор, помимо перечисленного, еще должен понимать структуру записей базы данных, чтобы корректно ввести новые записи в отдельные таблицы -- в первую очередь, понятие первичного и уникального ключей таблицы.
Б.4 Выполнение системы
После успешной авторизации, пользователь получает свою экранную форму. Работа с экранными формами заключается в вызове нужных функций кнопками, и где это необходимо -- вводе данных в поля ввода или выбора значений из выпадающих списков.
Ниже перечислены действия, которые будет выполнять пользователь после входа в систему.
ЛПР:
- Создание новой задачи;
- Ввод данных задачи;
- Решение и просмотр результата решения задачи;
- Сохранение результата решения;
- Просмотр, удаление списка ранее решенных и сохраненных задач;
- Просмотр и редактирование результатов решенных и сохраненных задач;
Администратор БД:
- Добавление, удаление и редактирование записей в таблице
пользователи базы данных;
Б.5 Сообщения пользователю
Во время работы системы, оператор может получать следующие сообщения, сигнализирующие о его неверных действиях с данными, приведенные в таблице Б.1.
Таблица Б.1- Сообщения оператору
Ошибка |
Расшифровка |
Пример |
|
«Неправильная пара Логин/Пароль» |
Ошибка авторизации пользователя. |
||
«Не указанно название задачи» |
Для выполнения действия, необходимо ввести название задачи |
||
«Не указаны названия критериев» |
Для выполнения действия, необходимо ввести названия критериев |
||
«Не введено ни одной альтернативы» |
Для выполнения действия, необходимо ввести информацию альтернатив |
Б.6 Основные интерфейсы
После запуска системы на экране появится окно авторизации (рисунок Б.1).
Рисунок Б.1- Окно авторизации
Права доступа к программному комплексу разграничены на два вида пользователей. Для того чтобы войти в систему нужно авторизоваться как ЛПР или Администратор. Для того чтобы решить задачу двухкритериальной оптимизации, нужно пройти авторизацию, под правами ЛПР. Для этого администратор БД должен зарегистрировать пользователя с правами ЛПР.
При успешной авторизации администратора БД откроется окно «Справочник пользователей» (рисунок Б.2).
Рисунок Б.2 - Справочник пользователей
Администратору БД предоставлены четыре функции: редактировать данные пользователей, добавить пользователя, удалить пользователя, выйти из справочника. При нажатии на кнопку «Добавить» добавляется строка ввода данных нового пользователя (рисунок Б.3).
Рисунок Б.3 - Регистрация нового пользователя
При нажатии на кнопку «Выход» система закрывает окно «Справочник пользователя» и открывает окно «Авторизация». Администратор БД передает пользователю данные его логина и пароля.
При успешной авторизации ЛПР откроется главное окно ЛПР (рисунок Б.4).
Рисунок Б.4 - Главное окно ЛПР
ЛПР предоставлены четыре функции: просмотреть справку, просмотреть список решенных задач, создать новую задачу, выйти из системы перейдя на главное окно OC. При нажатии на кнопку «Новая задача» откроется окно «Новая задача» (рисунок Б.5).
Рисунок Б.5 - Ввод и редактирование данных задачи
В окне «Новая задача» ЛПР вводит имя задачи, имена двух критериев, название альтернатив и их числовые данные по критериям добавляет редактирует и удаляет строки ввода альтернатив также для каждого столбца критериев выбирает MAX или MIN, может просмотреть справку и вернутся на главное окно ЛПР. По окончанию ввода нажимает кнопку «Готово» система проверит заполнение полей, произведет вычисления и откроет окно «Результат решения» (рисунок Б.6).
Рисунок Б.6 - Результат решения
ЛПР предоставлены пять функции: сохранить задачу, просмотреть диаграмму, просмотреть график, закрыть окно результат решения перейдя на главное окно ЛПР, отменить решение возвратившись к окну новая задача. В окне ЛПР просматривает результат. При нажатии на кнопку «График» открывается окно «График» (рисунок Б.9). При нажатии на кнопку «Диаграмма Шанса оптимальности» открывается окно «Диаграмма Шанса оптимальности» (рисунок Б.7). При нажатии на кнопку «Диаграмма Мягкий рейтинг» открывается окно «Диаграмма Мягкий рейтинг» (рисунок Б.8).
Рисунок Б.7 - Диаграмма Шанса оптимальности
Рисунок Б.8 - Диаграмма Мягкий рейтинг
Рисунок Б.9 - График оптимальности вариантов при равной важности критериев Топливная эффективность» и «Макс цена в пасс варианте, млн. долл.»
При нажатии на кнопку «Сохранить» открывается окно «Сохранить» (рисунок Б.10). Система сохраняет данные задачи и результат решения в БД.
Рисунок Б.10 - Окно результата сохранения
При нажатии на кнопку «Закрыть» открывается окно «Главное окно ЛПР». При нажатии на кнопку «Решенные задачи» открывается окно «Решенные задачи» (рисунок Б.11).
Рисунок Б.11 - Список сохраненных задач
ЛПР предоставлены три функции: просмотреть результат задачи, удалить задачу, вернутся на главное окно ЛПР.
Размещено на Allbest.ru
Подобные документы
Человеко-машинные комплексы, специально предназначенные для принятия решений. Процесс принятия решений и его этапы. Методы поиска новых вариантов решений: дерево решений, морфологические таблицы, конференции идей. Принцип математической оценки тенденций.
курсовая работа [272,1 K], добавлен 30.07.2009Классификация систем поддержки принятия решений. Сравнительный анализ методик для оценки рисков розничного кредитования. Структура системы поддержки принятия решений, формирование начальной базы знаний. Проектирование базы данных информационной системы.
дипломная работа [1,9 M], добавлен 10.07.2017Исследование автоматизированных информационных технологий, применяемых в управлении организацией. Формирование системы поддержки принятия решений в рекламном агентстве, анализ и оценка ее практической эффективности, направления и цели оптимизации.
курсовая работа [90,4 K], добавлен 03.10.2013Построение дерева принятия решений, реализация данной системы в табличном процессоре. Построение математической модели: в режиме вычислений и показа формул до и после оптимизации. Окно поиска решения. Информационно-логическая модель, ее содержание.
курсовая работа [955,8 K], добавлен 10.10.2012Разработка и внедрение программного модуля поддержки принятия управленческих решений для информационной системы медицинского предприятия ООО "Центр эндохирургических технологий". Эффективность применения модуля, полученные с его помощью результаты.
дипломная работа [1,9 M], добавлен 11.04.2013Система поддержки принятия решений "Мыслитель" и метод, заложенный в её основу. Порядок работы в программе: новая задача, составление списка альтернатив, списка критериев их оценки, сравнение критериев по степени важности, попарное сравнение альтернатив.
отчет по практике [719,2 K], добавлен 08.03.2016Понятия оптимизации проектных решений. Нахождение максимума (минимума) линейной целевой функции. Схема алгоритма метода Саати для вычисления весов критериев. Создание приложения, позволяющего производить однокритериальную и многокритериальную оптимизацию.
курсовая работа [781,9 K], добавлен 23.02.2016Разработка программного обеспечения подсистемы имитаторов, входящей в состав комплекса средств обнаружения и противодействия беспилотным летательным аппаратам. Сравнительный анализ существующих аналогов. Требования к аппаратно-программному обеспечению.
дипломная работа [3,0 M], добавлен 16.01.2015Анализ существующих решений системы поддержки принятия решений для корпоративной сети. Многоагентная система. Разработка концептуальной модели. Структура базы знаний. Разработка модели многоагентной системы на базе сетей Петри. Методика тестирования.
дипломная работа [5,1 M], добавлен 19.01.2017Оптимизационная задача линейного программирования. Виды задач линейного программирования. Принятие решений на основе количественной информации об относительной важности критериев. Выбор средств разработки. Программный комплекс векторной оптимизации.
дипломная работа [1,3 M], добавлен 27.03.2013