Многокритериальная оптимизация
Скачать 163.21 Kb.
|
report.txt с подробной информацией об исходных данных и полученном решении поставленной задачи. Пример файла-отчёта приведён на рисунке 3.9. Рисунок 3.9 - Пример файла-отчёта о полученном решении 3.2 Тестовые испытания В поставленной задаче в качестве исходных данных выступают технические характеристики двух типов станков по следующим шести критериям: производительность, энергоэффективность, стоимость станка, сервисное обслуживание, надёжность и удобство в использовании. По данным характеристикам и происходит выбор двух станков разного типа, но так же по условию задачи необходимо, чтобы станки соответствовали максимальным характеристикам по всем критериям и не должны превышать следующих ограничений: стоимость пары станков не должна превышать 1000 млн. рублей, максимальная потребляемая мощность не должна превышать 50000 кВт-ч в месяц, количество изготавливаемых изделий в год должно быть не менее 10000 штук в год, на изготовление изделия тратиться не более 200 часов в месяц. На основе всех вышеописанных данных производится отбор лучшей пары станков. Для проверки правильности работы программы нужно сравнить работу приложения при однокритериальной и многокритериальной оптимизации. Причём, выбранному критерию в одномерной оптимизации должны быть выставлены максимальные оценки в многокритериальной оптимизации. Если результаты первых альтернатив совпадают, то можно утверждать, что приложение работает верно. Проведение верификации приложения представлено ниже. Для начала проведём однокритериальную оптимизацию. По условию критерием оптимизации является производительность. Приложение выдаст результат, который приведён на рисунке 3.10. Рисунок 3.10 - Результат однокритериальной оптимизации Затем необходимо провести многокритериальную оптимизацию. После выполнения оптимизации приложение выдаст результат, который представлен на рисунке 3.11. Рисунок 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); }void comboBox13_TabIndexChanged(object sender, EventArgs e) {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) {[i5, j5] = Convert.ToInt32(temp5);++;(j5 == 5) {++;= 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]; |