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 - Список сохраненных задач
ЛПР предоставлены три функции: просмотреть результат задачи, удалить задачу, вернутся на главное окно ЛПР.