Многокритериальная оптимизация
Курсовая работа, 19 Марта 2014, автор: пользователь скрыл имя
Краткое описание
Необходимость принятия решений в какой-либо ситуации так же стара, как и само человечество и принимать решения, как отдельному человеку, так и различным группам людей, вплоть до всего человечества приходится практически во всех областях своей деятельности. Причем в некоторых областях (военных, медицинских, космических, в атомной энергетике, химической промышленности и др.) возникает потребность принятия достаточно сложных управленческих решений, ошибка в которых может повлечь за собой катастрофические последствия. В силу этого появилась необходимость выделить процесс принятия оптимальных решений в отдельную область науки, которая бы формализовала и систематизировала данный процесс.
Вложенные файлы: 1 файл
Пояснительная записка.docx
— 764.08 Кб (Скачать файл){
//вычисляем количественный индикатор
важности альтернативы
sum.Add( vesa[0] * (ocenki1[0, Convert.ToInt32(altSt1[i])] + ocenki2[0, Convert.ToInt32(altSt2[i])]) + vesa[1] * (ocenki1[1, Convert.ToInt32(altSt1[i])] + ocenki2[1, Convert.ToInt32(altSt2[i])]) +
vesa[2] * (ocenki1[2, Convert.ToInt32(altSt1[i])] + ocenki2[2, Convert.ToInt32(altSt2[i])]) + vesa[3] * (ocenki1[3, Convert.ToInt32(altSt1[i])] + ocenki2[3, Convert.ToInt32(altSt2[i])]) +
vesa[4] * (ocenki1[4, Convert.ToInt32(altSt1[i])] + ocenki2[4, Convert.ToInt32(altSt2[i])]) + vesa[5] * (ocenki1[5, Convert.ToInt32(altSt1[i])] + ocenki2[5, Convert.ToInt32(altSt2[i])]));
st1.Add(Convert.ToInt32(altSt1[i]) + 1);
st2.Add(Convert.ToInt32(altSt2[i]) + 1);
}
}
return sum;
}
public int Max(ArrayList mas)//поиск максимума
{
int nMax = 0;
double max = Convert.ToDouble(mas[0]);
for (int i = 0; i < mas.Count; i++)
if (Convert.ToDouble(mas[i]) > max)
{
max = Convert.ToDouble(mas[i]);
nMax = i;
}
return nMax;
}
public bool SoglosovanieOcenok()
{
bool soglas = true;//оценки согласованы
//найдём сумму оценок каждого критерия
double[] s = new double[x.GetLength(1)];
double sum;
for (int j = 0; j < x.GetLength(1); j++)
{
sum = 0;
for (int i = 0; i < x.GetLength(0); i++)
sum = sum + x[i, j];
s[j] = sum;
}
//находим вспрмогательную величину
double alpha=1/2f*(x.GetLength(0)*(x.GetLength(1)+1));
double S=0;
for (int i = 0; i < s.Length; i++)
S = S + (s[i] - alpha) * (s[i] - alpha);
//находим коэффициент конкордации
double nu = 12 * S / (x.GetLength(0) * x.GetLength(0) * x.GetLength(1) * (x.GetLength(1) * x.GetLength(1) - 1));
if (nu >= 0.5) soglas = true;
else soglas = false;
return soglas;
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace MonogokreterialnaiaOptimizacia
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
double[,] texnXarakter1;//технические характеристики станков первого вида
double[,] texnXarakter2;//технические характеристики станков второго вида
ArrayList bestStanki = new ArrayList();//выбранные станки по энергоэффективности(полный перебор)
double[,] x; //матрица оценок экспертов
ArrayList alternativiSt1 = new ArrayList();//альтернативы 1ый вид станков
ArrayList alternativiSt2 = new ArrayList();//альтернативы 2ой вид станков
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.RowCount = 6; dataGridView1.ColumnCount = 5;
dataGridView2.RowCount = 6; dataGridView2.ColumnCount = 5;
//Формируем заголовки строк таблицы
dataGridView1.Rows[0].HeaderCell.Value = "Производительность,
изд./час";
dataGridView2.Rows[0].HeaderCell.Value = "Производительность,
изд./час";
dataGridView1.Rows[1].HeaderCell.Value = "Стоимость, млн.руб.";
dataGridView2.Rows[1].HeaderCell.Value = "Стоимость, млн.руб.";
dataGridView1.Rows[2].HeaderCell.Value = "Энергоэффективность,
кВт-ч/ изд.";
dataGridView2.Rows[2].HeaderCell.Value = "Энергоэффективность,
кВт-ч/ изд.";
dataGridView1.Rows[3].HeaderCell.Value = "Сервисное обслуживание";
dataGridView2.Rows[3].HeaderCell.Value = "Сервисное обслуживание";
dataGridView1.Rows[4].HeaderCell.Value = "Надежность,
ч";
dataGridView2.Rows[4].HeaderCell.Value = "Надежность,
ч";
dataGridView1.Rows[5].HeaderCell.Value = "Удобство в использовании";
dataGridView2.Rows[5].HeaderCell.Value = "Удобство в использовании";
for (int i = 0; i < dataGridView1.RowCount; i++)
{
dataGridView1.Rows[i].Height = 40;
dataGridView2.Rows[i].Height = 40;
}
dataGridView1.RowHeadersWidth = 185;
dataGridView2.RowHeadersWidth = 185;
//Формируем заголовки столбцов
таблицы
for (int j = 0; j < dataGridView1.ColumnCount; j++)
{
dataGridView1.Columns[j].HeaderText = "ST1" + (j + 1).ToString();
dataGridView2.Columns[j].HeaderText = "ST2" + (j + 1).ToString();
dataGridView1.Columns[j].Width = 60;
dataGridView2.Columns[j].Width = 60;
}
dataGridView2.Columns[0].Width = 75;
dataGridView1.Columns[3].Width = 75;
dataGridView1[0, 0].Value = 8; dataGridView1[1, 0].Value = 5; dataGridView1[2, 0].Value = 19; dataGridView1[3, 0].Value = 13; dataGridView1[4, 0].Value = 11;
dataGridView2[0, 0].Value = 16; dataGridView2[1, 0].Value = 17; dataGridView2[2, 0].Value = 12; dataGridView2[3, 0].Value = 15; dataGridView2[4, 0].Value = 10;
dataGridView1[0, 1].Value = 930.0; dataGridView1[1, 1].Value = 310.0; dataGridView1[2, 1].Value = 1320.0; dataGridView1[3, 1].Value = 450.0; dataGridView1[4, 1].Value = 957.0;
dataGridView2[0, 1].Value = 1400.0; dataGridView2[1, 1].Value = 1200.0; dataGridView2[2, 1].Value = 1100.0; dataGridView2[3, 1].Value = 700.0; dataGridView2[4, 1].Value = 550.0;
dataGridView1[0, 2].Value = 15.3; dataGridView1[1, 2].Value = 30.5; dataGridView1[2, 2].Value = 27.0; dataGridView1[3, 2].Value = 25.0; dataGridView1[4, 2].Value = 13.6;
dataGridView2[0, 2].Value = 22.0; dataGridView2[1, 2].Value = 14.0; dataGridView2[2, 2].Value = 33.0; dataGridView2[3, 2].Value = 20.0; dataGridView2[4, 2].Value = 21.3;
dataGridView1[0, 3].Value = "Да"; dataGridView1[1, 3].Value = "Нет"; dataGridView1[2, 3].Value = "Да"; dataGridView1[3, 3].Value = "Да"; dataGridView1[4, 3].Value = "Нет";
dataGridView2[0, 3].Value = "Да"; dataGridView2[1, 3].Value = "Да"; dataGridView2[2, 3].Value = "Да"; dataGridView2[3, 3].Value = "Нет"; dataGridView2[4, 3].Value = "Да";
dataGridView1[0, 4].Value = 100000; dataGridView1[1, 4].Value = 170000; dataGridView1[2, 4].Value = 50000; dataGridView1[3, 4].Value = 90000; dataGridView1[4, 4].Value = 110000;
dataGridView2[0, 4].Value = 130000; dataGridView2[1, 4].Value = 140000; dataGridView2[2, 4].Value = 120000; dataGridView2[3, 4].Value = 100000; dataGridView2[4, 4].Value = 130000;
dataGridView1[0, 5].Value = "Отлично"; dataGridView1[1, 5].Value = "Плохо"; dataGridView1[2, 5].Value = "Плохо"; dataGridView1[3, 5].Value = "Очень хорошо"; dataGridView1[4, 5].Value = "Хорошо";
dataGridView2[0, 5].Value = "Очень хорошо"; dataGridView2[1, 5].Value = "Хорошо"; dataGridView2[2, 5].Value = "Плохо"; dataGridView2[3, 5].Value = "Плохо"; dataGridView2[4, 5].Value = "Отлично";
texnXarakter1 = ReadFromTable(dataGridView1, 3);
texnXarakter2 = ReadFromTable(dataGridView2, 3);
}
public double[,] ReadFromTable(DataGridView dg)//запись данных из таблицы в матрицу
{
double[,] matr=new double[dg.RowCount,dg.ColumnCount];
for (int i = 0; i < matr.GetLength(0); i++)
for (int j = 0; j < matr.GetLength(1); j++)
matr[i, j] = Convert.ToDouble(dg[j, i].Value);
return matr;
}
public double[,] ReadFromTable(DataGridView dg,int n)//запись данных из таблицы в матрицу
{
double[,] matr = new double[n, dg.ColumnCount];
for (int i = 0; i < n; i++)
for (int j = 0; j < matr.GetLength(1); j++)
matr[i, j] = Convert.ToDouble(dg[j, i].Value);
return matr;
}
private void button1_Click_1(object sender, EventArgs e)//полный перебор
{
if (Proverka(dataGridView2) == true && Proverka(dataGridView1) == true && ProverkaOgranich() == true)//все данные введены
{
if (radioButton1.Checked || radioButton2.Checked || radioButton3.Checked)
{
bestStanki.Clear();
listBox1.Items.Clear();
int i = -1;//номер лучших альтернативы
int i2=-1; int i3=-1;
OdnokreterialnaiaOptimizacia od = new OdnokreterialnaiaOptimizacia(texnXarakter1,
texnXarakter2, Convert.ToInt32(textBox4.Text), Convert.ToDouble(textBox3.Text),
Convert.ToInt32(textBox2.Text), Convert.ToDouble(textBox1.Text));
if (radioButton1.Checked)
{
bestStanki = od.PolniyPerebor("энергоэффективность");
i = od.Min(bestStanki);
bestStanki[i] = int.MaxValue;
i2 = od.Min(bestStanki);
bestStanki[i2] = int.MaxValue;
i3 = od.Min(bestStanki);
}
if (radioButton2.Checked)
{
bestStanki = od.PolniyPerebor("стоимость");
i = od.Min(bestStanki);
bestStanki[i] = int.MaxValue;
i2 = od.Min(bestStanki);
bestStanki[i2] = int.MaxValue;
i3 = od.Min(bestStanki);
}
if (radioButton3.Checked)
{
bestStanki = od.PolniyPerebor("производительность");
i = od.Max(bestStanki);
bestStanki[i] = int.MinValue;
i2 = od.Max(bestStanki);
bestStanki[i2] = int.MinValue;
i3 = od.Max(bestStanki);
}
if (i != -1 && i2!=-1 && i3 !=-1)
{
listBox1.Items.Add("Лучшая альтернатива 1 - ST1" + od.stanki1[i].ToString() + " и ST2" + od.stanki2[i].ToString());
}