Качественные
оценки
|
Очень
плохо
|
Плохо
|
Удовлетворительно
|
Хорошо
|
Отлично
|
Количественные
оценки
|
0.0
- 0.2
|
0.2
- 0.36
|
0.36
- 0.63
|
0.63
- 0.8
|
0.8
- 1.0
|
Эксперт сравнивает критерии парами и выставляет
каждому из них оценку. В результате получается матрица оценок, в которой
содержатся оценки каждого критерия в сравнении с остальными.
Оценки «да» и «нет» так же переводятся в
количественную форму оценки: 1 и 0, соответственно.
Остальные количественные оценки приводятся к
безразмерной оценке путём деления количественной оценки на сумму всех
количественных оценок необходимого критерия.
Оценки эксперта дают веса критериев и влияют на
рассмотрение вариантов пары станков в дальнейшем.
Каждой альтернативе присваивается оценка,
состоящая из суммы полученных безразмерных оценок. Самой подходящей
альтернативой считается та альтернатива, которая набрала наибольшую оценку.
Применение принципа Эджворта-Парето позволяет из
множества всех возможных исключить заведомо неприемлемые решения, то есть те,
которые никогда не могут оказаться выбранными, если выбор осуществляется
достаточно «разумно». После такого исключения остается множество, которое
называют множеством Парето или областью компромиссов. Данная операция
осуществляется перед началом расчётов, сразу после ввода исходных данных.
.3 Графические схемы разработанного алгоритма
Рассмотрим одну из основных схем алгоритма
созданного программного обеспечения - схему метода Саати, представленную в
приложении В. Метод Саати предназначен для поиска весов критериев на основе
оценок экспертов.
На рисунке 2.1 изображён алгоритм вычисления
весов критерия.
Рисунок 2.1 - Схема алгоритма
вычисления весов критериев
Данная схема состоит из трёх
основных блоков: нахождение суммы оценок по каждому критерию, нахождение суммы
всех оценок, нахождение веса критерия. В результате мы получаем массив весов
критериев.
Затем необходимо найти общую сумму
значений сформированного после работы предыдущего алгоритма массива. Реализация
данных действий отражена в схеме алгоритма, представленной на рисунке 2.2.
Рисунок 2.2 - Заполнение массива
безразмерными оценками
После выполнения данного алгоритма
мы получаем числовой массив безразмерных оценок для каждого критерия каждой
альтернативной пары, необходимых для дальнейшего получения итоговой оценки
каждой альтернативной пары станков. Алгоритм вычисления итоговых оценок
представлен на рисунке 2.3.
Рисунок 2.3 - Алгоритм получения
итоговых оценок
После завершения работы представленных
алгоритмов заполняется таблица с возможными альтернативами и наилучшим
решением, исходя из оценок экспертов.
Наилучшее решение соответствует
альтернативе, получившей наивысшую оценку.
3. РАЗРАБОТАННОЕ ПРИЛОЖЕНИЕ И РЕЗУЛЬТАТЫ
ТЕСТОВЫХ ИСПЫТАНИЙ
.1 Интерфейс пользователя
Для работы с разработанной программой не нужно
иметь специальных навыков, достаточно лишь ознакомиться данной инструкцией.
Разработанное приложения позволяет проводить
оптимизацию, принимать правильное решение при выборе пары станков из множества
альтернатив. Для отображения информации о станках, а также для выполнения
основных функций по однокритериальной и многокритериальной оптимизации был
создан набор форм. Пользователь имеет возможность перейти к любому варианту
оптимизации путём нажатия кнопки в стартовом меню программы сразу после её
запуска.
Пример стартового меню изображён на рисунке 3.1.
Рисунок 3.1 - Стартовое меню программы
При выборе однокритериальной оптимизации
откроется окно с вводом исходных данных. Пример изображён на рисунке 3.2.
Рисунок 3.2 - Пример окна однокритериальной
оптимизации
После нажатия кнопки «Принять» исходные данные
принимаются и становится доступна кнопка «Посчитать». Результатом нажатия на
эту кнопку является оптимизация по параметру производительность. Пример окна
изображён на рисунке 3.3.
Рисунок 3.3 - Вид окна однокритериальной
оптимизации
При выборе многокритериальной оптимизации
открывается окно с вводом экспертных оценок и исходных данных. Так же в
открывшемся окне содержится информация о станках. Вид окна представлен на
рисунке 3.4.
Рисунок 3.4 - Вид окна ввода экспертных оценок и
исходных данных
Ввод оценок осуществляется при помощи
выпадающего списка. Данная операция представлена на рисунке 3.5.
Рисунок 3.5 - Ввод экспертных оценок
При неполном заполнении матрицы экспертных
оценок выдаётся соответствующее предупреждение. Приложение не продолжит работу,
пока все оценки не будут выставлены. Пример предупреждения приведён на рисунке
3.6.
Рисунок 3.6 - Пример предупреждения
После ввода экспертных оценок и исходных данных
и прохождения процедуры верификации введённых данных заполняется таблица
возможных альтернатив на вкладке Решение. Пример приведён на рисунке 3.7.
Рисунок 3.7 - Пример заполнения таблицы
возможных альтернатив
После нажатия кнопки «Решить» появляется
подходящая альтернатива в поле «Решение», а в таблице «Возможные альтернативы»
данная пара станков подсвечивается красным цветом. Пример изображён на рисунке
3.8.
Рисунок 3.8 - Пример полученного решения
Так же после нахождения оптимальной пары станков
появляется кнопка «Сформировать отчёт». После её нажатия в папке с программой
формируется файл report.txt
с подробной информацией об исходных данных и полученном решении поставленной
задачи. Пример файла-отчёта приведён на рисунке 3.9.
Рисунок 3.9 - Пример файла-отчёта о полученном
решении
3.2 Тестовые испытания
В поставленной задаче в качестве исходных данных
выступают технические характеристики двух типов станков по следующим шести
критериям: производительность, энергоэффективность, стоимость станка, сервисное
обслуживание, надёжность и удобство в использовании. По данным характеристикам
и происходит выбор двух станков разного типа, но так же по условию задачи
необходимо, чтобы станки соответствовали максимальным характеристикам по всем
критериям и не должны превышать следующих ограничений: стоимость пары станков
не должна превышать 1000 млн. рублей, максимальная потребляемая мощность не
должна превышать 50000 кВт-ч в месяц, количество изготавливаемых изделий в год
должно быть не менее 10000 штук в год, на изготовление изделия тратиться не
более 200 часов в месяц. На основе всех вышеописанных данных производится отбор
лучшей пары станков.
Для проверки правильности работы программы нужно
сравнить работу приложения при однокритериальной и многокритериальной
оптимизации. Причём, выбранному критерию в одномерной оптимизации должны быть
выставлены максимальные оценки в многокритериальной оптимизации. Если
результаты первых альтернатив совпадают, то можно утверждать, что приложение
работает верно. Проведение верификации приложения представлено ниже.
Для начала проведём однокритериальную
оптимизацию. По условию критерием оптимизации является производительность.
Приложение выдаст результат, который приведён на рисунке 3.10.
Рисунок 3.10 - Результат однокритериальной
оптимизации
Рисунок 3.11 - Результат многокритериальной
оптимизации
После выполнения оптимизаций необходимо сравнить
полученные альтернативы станков. Но так как при многокритериальной оптимизации
производительность пусть и основной критерий, но с учетом всех шести критериев
результаты однокритериальной и многокритериальной оптимизации могут не
совпадать, что мы и можем наблюдать в данном случае.
ЗАКЛЮЧЕНИЕ
В соответствии с заданием по курсовому проекту,
было спроектировано и реализовано приложение, позволяющее производить
однокритериальную и многокритериальную оптимизацию. Результаты работы данного
приложения были хорошо проанализированы и была проведена успешная верификация
полученных результатов, что даёт основания для использования данного приложения
на практике.
Разработанное приложение содержит простой и
интуитивно понятный пользовательский интерфейс.
Так же приложение позволяет, выводить не только
самый лучший результат, но и остальные альтернативы, удовлетворяющие
ограничениям, но имеющие более низкие показатели в интересующих критериях. Это
позволяет хотя бы немного учитывать человеческий фактор при оптимизации.
Теоретическая значимость данного курсового
проекта состоит в том, что были изучены методы многокритериальной оптимизации,
такие как метод анализа иерархий, метод Саати, метод выбора множества Парето.
Знание этих методов нужно не только для того, что бы писать приложения для
оптимизации проектных решений, знание этих методов заставляет смотреть на
принятие решений в нашей жизни более рационально, принимая во внимание все
возможные факторы. Данная курсовая работа значительно расширила обзор в области
принятия решения и показала, что даже в этой области может успешно применяться
автоматизация.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Горбунов, В.М. Теория
принятия решений. Учебное пособие / В.М. Горбунов. -
Томск: Национальный исследовательский томский политехнический университет,
2010. -
67 с.
. Матузко, Ю.О. Теория
принятия решений. Учебно-методическое пособие / Ю.О. Матузко. -
Запорожье: Запорожская государственная инженерная академия, 2009. -
61 с.
. Лесин, В.В. Основы методов
оптимизации / В.В. Лесин, Ю.П. Лисовец. - М.: Изд-во МАИ, 1995. - 344 с.
. Информационные технологии
оптимальных решений. Учебный курс для специальности «Государственное управление
и экономика». - Минск: Академия управления при Президенте
Республики Беларусь, 2003. - 241 с.
. Шикин, Е. В. Исследование
операций / Е. В. Шикин, Г. Е. Шикина.- М.: ТК Велби,
Изд-во Проспект, 2006. - 280 с.
. Саати, Т. Л. Принятие
решений. Метод анализа иерархий / Т. Саати. - М.: Радио и связь,
1993. -
278 с.
. Подиновский, В. В.
Парето-оптимальные решения многокритериальных задач. / В. В. Подиновский, В. Д.
Ногин.-
М.: Наука. Главная редакция, 2007. - 256 с.
ПРИЛОЖЕНИЕ
Листинг программы
Form1.cs
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.IO;OPR
{partial class Form1 : Form
{[,] proiz = new int[2, 5];[,] stoim
= new int[2, 5];[,] effect = new double[2, 5];limit = 10000;hours = 200;money =
1000;energy = 50000;Form1()
{();
}void Form1_Load(object sender,
EventArgs e)
{
#region Чтение из файлаtemp;f = new
StreamReader("input/stanki_proiz.txt");i = 0;j = 0;((temp =
f.ReadLine()) != null)
{[i, j] =
Convert.ToInt32(temp);++;(j == 5)
{++;= 0;
}(i == 2) break;
}temp2;f2 = new
StreamReader("input/stanki_stoim.txt");i2 = 0;j2 = 0;((temp2 =
f2.ReadLine()) != null)
{[i2, j2] =
Convert.ToInt32(temp2);++;(j2 == 5)
{++;= 0;
}(i2 == 2) break;
}temp3;f3 = new
StreamReader("input/stanki_effect.txt");i3 = 0;j3 = 0;((temp3 =
f3.ReadLine()) != null)
{[i3, j3] =
Convert.ToDouble(temp3);++;(j3 == 5)
{++;= 0;
}(i3 == 2) break;
}
#endregion.Text =
Convert.ToString(limit);.Text = Convert.ToString(hours);.Text =
Convert.ToString(money);.Text = Convert.ToString(energy);
}void button1_Click(object sender,
EventArgs e)
{= Convert.ToInt32(textBox1.Text);=
Convert.ToInt32(textBox2.Text);= Convert.ToInt32(textBox3.Text);=
Convert.ToInt32(textBox4.Text);.ReadOnly = true;.ReadOnly = true;.ReadOnly =
true;.ReadOnly = true;.Enabled = false;.Enabled = true;
}void button2_Click(object sender,
EventArgs e)
{.Enabled = false;hours2 = hours *
12;(int i = 0; i < 5; i++)(int j = 0; j < 5; j++)
{.Rows.Add();.Rows[dataGridView1.RowCount
- 1].Cells[0].Value = String.Format("ST1{0} + ST2{1}", (i + 1), (j +
1));(proiz[0, i] > proiz[1, j]) dataGridView1.Rows[dataGridView1.RowCount -
1].Cells[1].Value = hours2 * proiz[1,
j];dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[1].Value = hours2 *
proiz[0, i];.Rows[dataGridView1.RowCount - 1].Cells[2].Value = stoim[0, i] +
stoim[1, j];(proiz[0, i] > proiz[1, j])
dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[3].Value = hours *
proiz[1, j] * (effect[0, i] + effect[1,
j]);dataGridView1.Rows[dataGridView1.RowCount - 1].Cells[3].Value = hours *
proiz[0, i] * (effect[0, i] + effect[1, j]);
}(int i = 0; i <
dataGridView1.RowCount; i++)
{(Convert.ToDouble(dataGridView1.Rows[i].Cells[3].Value)
<= energy && Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value)
>= limit && Convert.ToDouble(dataGridView1.Rows[i].Cells[2].Value)
<= money)
{.Rows.Add();.Rows[dataGridView2.RowCount
- 1].Cells[0].Value =
dataGridView1.Rows[i].Cells[0].Value;.Rows[dataGridView2.RowCount -
1].Cells[1].Value =
dataGridView1.Rows[i].Cells[1].Value;.Rows[dataGridView2.RowCount -
1].Cells[2].Value =
dataGridView1.Rows[i].Cells[2].Value;.Rows[dataGridView2.RowCount -
1].Cells[3].Value = dataGridView1.Rows[i].Cells[3].Value;
}
}(dataGridView2.RowCount == 0)
label6.Visible = true;
{.Visible = true;.Visible = true;
}
}
}
}
Листинг программы
Form2.cs
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.IO;OPR
{partial class Form2 : Form
{Form2()
{();
}[,] marks1 = new double[6, 6];
//оценки экспертов[] k = new double[6]; // оценка для каждого притерия[,] ser =
new double[2, 5]; // массив сервиса в безразмерной величине[,] ud = new
double[2, 5]; // массив удобства в безразмерной величине[,] proiz = new int[2,
5]; //массив производительности[,] stoim = new int[2, 5]; // массив
стоимости[,] effect = new double[2, 5]; //массив эффективности[,] serv = new
string[2, 5]; // массив сервиса[,] nadej = new int[2, 5]; // массив
надёжности[,] udob = new string[2, 5]; // массив удобстваlimit; // необходимая
произвhours; // часов в месяцmoney; // денег на покупкуenergy; // кВт-ч в
месяц[,] mas = new double[40, 40]; // массив безразмерных оценокt = 0;
#region Marksvoid
comboBox1_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox1.Text);.Text = Convert.ToString(temp);
}void
comboBox11_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox11.Text);.Text = Convert.ToString(temp);
}void
comboBox2_TabIndexChanged(object sender, EventArgs e)
{temp = 1 / Convert.ToDouble(comboBox2.Text);.Text
= Convert.ToString(temp);
}void
comboBox12_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox12.Text);.Text = Convert.ToString(temp);
}void
comboBox5_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox5.Text);.Text = Convert.ToString(temp);
{temp = 1 /
Convert.ToDouble(comboBox13.Text);.Text = Convert.ToString(temp);
}void
comboBox3_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox3.Text);.Text = Convert.ToString(temp);
}void
comboBox16_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox16.Text);.Text = Convert.ToString(temp);
}void comboBox6_TabIndexChanged(object
sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox6.Text);.Text = Convert.ToString(temp);
}void
comboBox15_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox15.Text);.Text = Convert.ToString(temp);
}void
comboBox8_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox8.Text);.Text = Convert.ToString(temp);
}void
comboBox14_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox14.Text);.Text = Convert.ToString(temp);
}void
comboBox4_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox4.Text);.Text = Convert.ToString(temp);
}void
comboBox17_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox17.Text);.Text = Convert.ToString(temp);
}void
comboBox7_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox7.Text);.Text = Convert.ToString(temp);
}void
comboBox18_TabIndexChanged(object sender, EventArgs e)
{temp = 1 / Convert.ToDouble(comboBox18.Text);.Text
= Convert.ToString(temp);
}void
comboBox9_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox9.Text);.Text = Convert.ToString(temp);
}void
comboBox19_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox19.Text);.Text = Convert.ToString(temp);
}void
comboBox10_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox10.Text);.Text = Convert.ToString(temp);
}void
comboBox20_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox20.Text);.Text = Convert.ToString(temp);
}void
comboBox40_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox40.Text);.Text = Convert.ToString(temp);
}void comboBox30_TabIndexChanged(object
sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox30.Text);.Text = Convert.ToString(temp);
}void
comboBox29_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox29.Text);.Text = Convert.ToString(temp);
}void
comboBox39_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox39.Text);.Text = Convert.ToString(temp);
}void
comboBox38_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox38.Text);.Text = Convert.ToString(temp);
}void
comboBox25_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox25.Text);.Text = Convert.ToString(temp);
}void
comboBox24_TabIndexChanged(object sender, EventArgs e)
{temp = 1 / Convert.ToDouble(comboBox24.Text);.Text
= Convert.ToString(temp);
}void
comboBox37_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox37.Text);.Text = Convert.ToString(temp);
}void
comboBox31_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox31.Text);.Text = Convert.ToString(temp);
}void
comboBox21_TabIndexChanged(object sender, EventArgs e)
{temp = 1 /
Convert.ToDouble(comboBox21.Text);.Text = Convert.ToString(temp);
}
#endregion
void Form2_Load(object sender,
EventArgs e)
{
#region Чтение из файлаtemp;f = new
StreamReader("input/stanki_proiz.txt");i = 0;j = 0;((temp =
f.ReadLine()) != null)
{[i, j] =
Convert.ToInt32(temp);++;(j == 5)
{++;= 0;
}(i == 2) break;
}temp2;f2 = new StreamReader("input/stanki_stoim.txt");i2
= 0;j2 = 0;((temp2 = f2.ReadLine()) != null)
{[i2, j2] =
Convert.ToInt32(temp2);++;(j2 == 5)
{++;= 0;
}(i2 == 2) break;
}temp3;f3 = new
StreamReader("input/stanki_effect.txt");i3 = 0;j3 = 0;((temp3 =
f3.ReadLine()) != null)
{[i3, j3] =
Convert.ToDouble(temp3);++;(j3 == 5)
{++;= 0;
}(i3 == 2) break;
}temp4;f4 = new
StreamReader("input/stanki_serv.txt");i4 = 0;j4 = 0;((temp4 =
f4.ReadLine()) != null)
{[i4, j4] = temp4;++;(j4 == 5)
{++;= 0;
}(i4 == 2) break;
}temp5;f5 = new
StreamReader("input/stanki_nadej.txt");i5 = 0;j5 = 0;((temp5 =
f5.ReadLine()) != null)
{++;= 0;
}(i5 == 2) break;
}temp6;f6 = new
StreamReader("input/stanki_udob.txt");i6 = 0;j6 = 0;((temp6 =
f6.ReadLine()) != null)
{[i6, j6] = temp6;++;(j6 == 5)
{++;= 0;
}(i6 == 2) break;
}
#endregion
#region Альтернативные варианты(i =
0; i < 5; i++)
{.Rows.Add();.Rows[i].Cells[0].Value
= String.Format("ST1{0}", (i + 1));.Rows[i].Cells[1].Value =
proiz[0,i];.Rows[i].Cells[2].Value = stoim[0, i];.Rows[i].Cells[3].Value =
effect[0, i];.Rows[i].Cells[4].Value = serv[0, i];.Rows[i].Cells[5].Value =
nadej[0, i];.Rows[i].Cells[6].Value = udob[0, i];
}(i = 0; i < 5; i++)
{.Rows.Add();.Rows[i].Cells[0].Value
= String.Format("ST2{0}", (i + 1));.Rows[i].Cells[1].Value = proiz[1,
i];.Rows[i].Cells[2].Value = stoim[1, i];.Rows[i].Cells[3].Value = effect[1,
i];.Rows[i].Cells[4].Value = serv[1, i];.Rows[i].Cells[5].Value = nadej[1,
i];.Rows[i].Cells[6].Value = udob[1, i];
}(i = 0; i < 2; i++)(j = 0; j
< 5; j++)
{(serv[i,
j].CompareTo("Да") == 0) ser[i, j] = 1;(serv[i,
j].CompareTo("Нет") == 0) ser[i, j] = 0;
}(i = 0; i < 2; i++)(j = 0; j
< 5; j++)
{(udob[i,
j].CompareTo("плохо") == 0) ud[i, j] = 0;(udob[i,
j].CompareTo("хорошо") == 0) ud[i, j] = 0.33;(udob[i,
j].CompareTo("очень хорошо") == 0) ud[i, j] = 0.66;(udob[i,
j].CompareTo("отлично") == 0) ud[i, j] = 1;
}
#endregion
}upd()
{(int i = 0; i < 5; i++)(int j =
0; j < 5; j++)
{( ((hours * 12 * proiz[1, j]) >=
limit && (hours * 12 * proiz[0, i]) >= limit) && ((hours *
proiz[0, i] * effect[0, i]) <= energy && (hours * proiz[1, j] *
effect[1, j]) <= energy) && (stoim[0, i] + stoim[1, j]) < 1000 )
{.Rows.Add();.Rows[dataGridView3.RowCount
- 1].Cells[0].Value = String.Format("ST1{0} + ST2{1}", (i + 1), (j +
1)); //nazvan(proiz[0, i] > proiz[1, j])
dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[1].Value = proiz[1, j];
//----dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[1].Value = proiz[0,
i]; //proizv.Rows[dataGridView3.RowCount - 1].Cells[2].Value = stoim[0, i] +
stoim[1, j]; //stoim.Rows[dataGridView3.RowCount - 1].Cells[3].Value =
effect[0, i] + effect[1, j];.Rows[dataGridView3.RowCount - 1].Cells[4].Value =
(ser[0, i] + ser[1, j]) / 2;(nadej[0, i] > nadej[1, j]) dataGridView3.Rows[dataGridView3.RowCount
- 1].Cells[5].Value = nadej[1, j];
//----dataGridView3.Rows[dataGridView3.RowCount - 1].Cells[5].Value = nadej[0,
i];.Rows[dataGridView3.RowCount - 1].Cells[6].Value = (ud[0, i] + ud[1, j]) /
2;
}
}
} // заполнение таблицы подходями по
ограничениям альтернативамиvoid button1_Click(object sender, EventArgs e)
{(); // обращение к методу
заполнения таблицы
// проверка на заполненность
экспертных оценок(comboBox1.Text == "" || comboBox2.Text ==
"" || comboBox5.Text == "" || comboBox3.Text ==
"" || comboBox6.Text == "" || comboBox8.Text ==
"" || comboBox4.Text == "" || comboBox7.Text ==
"" || comboBox9.Text == "" || comboBox10.Text ==
"" || comboBox31.Text == "" || comboBox37.Text ==
"" || comboBox38.Text == "" || comboBox39.Text ==
"" || comboBox40.Text == "")
MessageBox.Show("Заполните все поля оценок!");
{= Convert.ToInt32(textBox1.Text);=
Convert.ToInt32(textBox2.Text);= Convert.ToInt32(textBox3.Text);=
Convert.ToInt32(textBox4.Text);.ReadOnly = true;.ReadOnly = true;.ReadOnly =
true;.ReadOnly = true;.Enabled = false;.Enabled = true;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;.Enabled = false;.Enabled = false;.Enabled =
false;.Enabled = false;[0, 0] = 1;[0, 1] =
Convert.ToDouble(comboBox11.Text);[0, 2] =
Convert.ToDouble(comboBox12.Text);[0, 3] =
Convert.ToDouble(comboBox16.Text);[0, 4] =
Convert.ToDouble(comboBox17.Text);[0, 5] = Convert.ToDouble(comboBox21.Text);[1,
0] = Convert.ToDouble(comboBox1.Text);[1, 1] = 1;[1, 2] =
Convert.ToDouble(comboBox13.Text);[1, 3] =
Convert.ToDouble(comboBox15.Text);[1, 4] =
Convert.ToDouble(comboBox18.Text);[1, 5] = Convert.ToDouble(comboBox24.Text);[2,
0] = Convert.ToDouble(comboBox2.Text);[2, 1] =
Convert.ToDouble(comboBox5.Text);[2, 2] = 1;[2, 3] =
Convert.ToDouble(comboBox14.Text);[2, 4] =
Convert.ToDouble(comboBox19.Text);[2, 5] =
Convert.ToDouble(comboBox25.Text);[3, 0] = Convert.ToDouble(comboBox3.Text);[3,
1] = Convert.ToDouble(comboBox6.Text);[3, 2] =
Convert.ToDouble(comboBox8.Text);[3, 3] = 1;[3, 4] =
Convert.ToDouble(comboBox20.Text);[3, 5] =
Convert.ToDouble(comboBox29.Text);[4, 0] = Convert.ToDouble(comboBox4.Text);[4,
1] = Convert.ToDouble(comboBox7.Text);[4, 2] =
Convert.ToDouble(comboBox9.Text);[4, 3] = Convert.ToDouble(comboBox10.Text);[4,
4] = 1;[4, 5] = Convert.ToDouble(comboBox30.Text);[5, 0] =
Convert.ToDouble(comboBox31.Text);[5, 1] =
Convert.ToDouble(comboBox37.Text);[5, 2] = Convert.ToDouble(comboBox38.Text);[5,
3] = Convert.ToDouble(comboBox39.Text);[5, 4] =
Convert.ToDouble(comboBox40.Text);[5, 5] = 1;
}
}void button2_Click(object sender,
EventArgs e) //Reshenie
{.Enabled = false;(int i = 0; i <
6; i++) // вычисление суммы оценок по каждому критерию(int j = 0; j < 6;
j++)[i] = k[i] + marks1[i, j];ksum = 0; // сумма всех оценок(int j = 0; j <
6; j++)= k[j] + ksum;(int i = 0; i < 6; i++) // вычисление веса критерия[i]
= k[i] / ksum;.Visible = true;.Visible = true;.Visible = true;.Visible =
true;.Visible = true;.Visible = true;.Text = Convert.ToString(k[0]);.Text =
Convert.ToString(k[1]);.Text = Convert.ToString(k[2]);.Text =
Convert.ToString(k[3]);.Text = Convert.ToString(k[4]);.Text =
Convert.ToString(k[5]);pro = 0;sto = 0;ene = 0;ser = 0;nad = 0;udo = 0;(int i =
0; i < dataGridView3.RowCount; i++) // нахождение суммарного значения по
каждому критерию
{= pro +
Convert.ToDouble(dataGridView3.Rows[i].Cells[1].Value);= sto +
Convert.ToDouble(dataGridView3.Rows[i].Cells[2].Value);= ene +
Convert.ToDouble(dataGridView3.Rows[i].Cells[3].Value);= ser +
Convert.ToDouble(dataGridView3.Rows[i].Cells[4].Value);= nad +
Convert.ToDouble(dataGridView3.Rows[i].Cells[5].Value);= udo +
Convert.ToDouble(dataGridView3.Rows[i].Cells[6].Value);
}(int i = 0; i <
dataGridView3.RowCount; i++) // заполнение массива безразмерных оценок
{[i, 0] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[1].Value) / pro * k[0];[i, 1] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[2].Value) / sto * k[1];[i, 2] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[3].Value) / ene * k[2];[i, 3] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[4].Value) / ser * k[3];[i, 4] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[5].Value) / nad * k[4];[i, 5] =
Convert.ToDouble(dataGridView3.Rows[i].Cells[6].Value) / udo * k[5];
}tem = 0;(int i = 0; i <
dataGridView3.RowCount; i++) // получение оценки для каждой альтернативы
{= mas[i, 0] + mas[i, 1] + mas[i, 2]
+ mas[i, 3] + mas[i, 4] + mas[i, 5];.Rows[i].Cells[7].Value = tem;
}= Convert.ToDouble(dataGridView3.Rows[0].Cells[7].Value);
// присваиваем временному значению первый элемент таблицы для поиска наилучшей
альтернативы(int i = 1; i < dataGridView3.RowCount; i++) // перебор таблицы
в поиске наибольшей оценки(tem < Convert.ToDouble(dataGridView3.Rows[i].Cells[7].Value))
{ tem = Convert.ToDouble(dataGridView3.Rows[i].Cells[7].Value); t = i; }
// когда найдена наибольшая оценка,
данная альтернатива подсвечивается красным[7, t].Style.BackColor =
Color.Red;[6, t].Style.BackColor = Color.Red;[5, t].Style.BackColor =
Color.Red;[4, t].Style.BackColor = Color.Red;[3, t].Style.BackColor =
Color.Red;[2, t].Style.BackColor = Color.Red;[1, t].Style.BackColor =
Color.Red;[0, t].Style.BackColor = Color.Red;.Text =
Convert.ToString(dataGridView3.Rows[t].Cells[0].Value);.Visible = true;.Visible
= true;.Visible = true;.Visible = true;
}void button3_Click(object sender,
EventArgs e) // формирование отчёта
{.Enabled = false;(StreamWriter sw =
new StreamWriter("report.txt", false, System.Text.Encoding.Default))
// создание и открытие файла для записи
{.WriteLine("Исходные
данные");.WriteLine("");.Write("Производительность в год:
");.WriteLine(limit);.Write("Часов в месяц:
");.WriteLine(hours);.Write("Ограничения по стоимости:
");.WriteLine(money);.Write("Потребляемая мощность в месяц:
");.WriteLine(energy);.WriteLine("");.WriteLine("В процессе
выпонения программы были учтены мнения эксперта о важности каждого из
критериев.");.WriteLine("На основе полученных результатов можем
сделать вывод, что наилучшая альтернатива:");.WriteLine(dataGridView3.Rows[t].Cells[0].Value);.Write("Производительность:
");.WriteLine(dataGridView3.Rows[t].Cells[1].Value);.Write("Стоимость:
");.WriteLine(dataGridView3.Rows[t].Cells[2].Value);.Write("Энергоэффективность:
");.WriteLine(dataGridView3.Rows[t].Cells[3].Value);.Write("Надёжность:
");.WriteLine(dataGridView3.Rows[t].Cells[5].Value);.Write("Оценка:
");.WriteLine(dataGridView3.Rows[t].Cells[7].Value);
}
}
}
}