Многокритериальная оптимизация
Автор работы: Пользователь скрыл имя, 19 Марта 2014 в 21:05, курсовая работа
Краткое описание
Необходимость принятия решений в какой-либо ситуации так же стара, как и само человечество и принимать решения, как отдельному человеку, так и различным группам людей, вплоть до всего человечества приходится практически во всех областях своей деятельности. Причем в некоторых областях (военных, медицинских, космических, в атомной энергетике, химической промышленности и др.) возникает потребность принятия достаточно сложных управленческих решений, ошибка в которых может повлечь за собой катастрофические последствия. В силу этого появилась необходимость выделить процесс принятия оптимальных решений в отдельную область науки, которая бы формализовала и систематизировала данный процесс.
Вложенные файлы: 1 файл
Пояснительная записка.docx
— 764.08 Кб (Скачать файл)double moshnost;//мощность
int count;//количество деталей выпускаемых в год
double cena; //стоимость
public ArrayList stanki1 = new ArrayList();//номера станков 1-го вида, соответствующих ограничениям
public ArrayList stanki2 = new ArrayList();//номера станков 2-го вида, соответствующих ограничениям
//конструктор класса
public
OdnokreterialnaiaOptimizacia(double[,] texnXarakter1, double[,] texnXarakter2,
int timeM, double moshnost, int count, double cena)
{
this.texnXarakter1 = texnXarakter1;
this.texnXarakter2 = texnXarakter2;
this.timeM = timeM;
this.moshnost = moshnost;
this.count = count;
this.cena = cena;
}
//полный перебор
public ArrayList PolniyPerebor(string kriteriy/*, ArrayList stanki1, ArrayList stanki2*/)
{
ArrayList bestStanki = new ArrayList();
double tempEnergoef;//текущая энеогоэффективность для двух станков
double tempStoimost;//текущая стоимость для двух станков
double tempProizvod1;//производительность станка
первого вида
double tempProizvod2;//производительность станка
второго вида
ArrayList bestProizv1 = new ArrayList();//производительность
лучших станков первого вида
ArrayList bestProizv2 = new ArrayList();//производительность
лучших станков второго вида
for (int j = 0; j < texnXarakter1.GetLength(1); j++)//просматриваем станки первого вида
for (int k = 0; k < texnXarakter2.GetLength(1); k++)//просматриваем станки второго вида
{
tempEnergoef = texnXarakter1[0, j] * timeM * texnXarakter1[2, j] + texnXarakter2[0, k] * timeM * texnXarakter2[2, k];
tempStoimost = texnXarakter1[1, j] + texnXarakter2[1, k];
tempProizvod1 = texnXarakter1[0, j] * timeM;
tempProizvod2 = texnXarakter2[0, k] * timeM;
if (tempEnergoef <= moshnost && tempStoimost <= cena &&
tempProizvod1 >= count / 12 && tempProizvod2 >= count / 12)
{
if (kriteriy == "энергоэффективность")
{
{
bestStanki.Add(tempEnergoef);
stanki1.Add(j + 1);
stanki2.Add(k + 1);
}
}
if (kriteriy == "стоимость")
{
bestStanki.Add(tempStoimost);
stanki1.Add(j + 1);
stanki2.Add(k + 1);
}
if (kriteriy == "производительность")
{
bestProizv1.Add(tempProizvod1);
bestProizv2.Add(tempProizvod2);
stanki1.Add(j + 1);
stanki2.Add(k + 1);
//Найдём минимальную производительность из каждой пары станков
if (Convert.ToDouble(bestProizv1[bestProizv1.Count - 1]) >= Convert.ToDouble(bestProizv2[bestProizv2.Count
- 1]))
bestStanki.Add(bestProizv2[bestProizv2.Count - 1]);
else bestStanki.Add(bestProizv1[bestProizv1.Count - 1]);
}
}
}
return bestStanki;
}
public int Min(ArrayList mas)//поиск минимума
{
double min = Convert.ToDouble(mas[0]);
int nomMin = 0;
for (int i = 1; i < mas.Count; i++)
if (Convert.ToDouble(mas[i]) < min)
{
min = Convert.ToDouble(mas[i]);
nomMin = i;
}
return nomMin;
}
public int Max(ArrayList mas)//поиск максимума
{
double max = Convert.ToDouble(mas[0]);
int nomMax = 0;
for (int i = 1; i < mas.Count; i++)
if (Convert.ToDouble(mas[i]) > max)
{
max = Convert.ToDouble(mas[i]);
nomMax = i;
}
return nomMax;
}
}
}
MonogokreterialnaiaOptimizacia.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace MonogokreterialnaiaOptimizacia
{
class MnogokreterialnaiaOptimizacia
{
double[,] x; //матрица оценок экспертов
public ArrayList altSt1 = new ArrayList();//альтернативы 1ый вид станков
public ArrayList altSt2 = new ArrayList();//альтернативы 2ой вид станков
public ArrayList st1 = new ArrayList();//выбранные станки 1-го вида в соответствии с ограничениями
public ArrayList st2 = new ArrayList();//выбранные станки 2-го вида в соответствии с ограничениями
int timeM;//количество часов в месяц на изготовления изделия
double moshnost;//мощность
int count;//количество деталей выпускаемых в год
double cena; //стоимость
//конструктор класса
public
MnogokreterialnaiaOptimizacia(double[,] x, ArrayList alternSt1, ArrayList
alternSt2, int timeM, double moshnost, int count, double cena)
{
this.x = x;
this.altSt1 = alternSt1;
this.altSt2 = alternSt2;
this.timeM = timeM;
this.moshnost = moshnost;
this.count = count;
this.cena = cena;
}
public void PreobrazovanieX()//преобразуем матрицу экспертных оценок
{
for (int i = 0; i < x.GetLength(0); i++)
for (int j = 0; j < x.GetLength(1); j++)
x[i, j] = x.GetLength(1) - x[i, j];
}
public double[] SumColumns()//находим сумму по столбцам
{
double[] sum = new double[x.GetLength(1)];
for (int j = 0; j < x.GetLength(1); j++)
for (int i = 0; i < x.GetLength(0); i++)
sum[j] = sum[j] + x[i, j];
return sum;
}
public double Sum(double[] mas)//сумма всех оценок
{
double sum = 0;
for (int i = 0; i < mas.Length; i++)
sum = sum + mas[i];
return sum;
}
public double[] Predpochtenie()//находим веса альтернатив
{
double[] mas = new double[x.GetLength(1)];
mas = SumColumns();
double sum = Sum(mas);
double[] vesa = new double[mas.Length];
for (int i = 0; i < mas.Length; i++)
vesa[i] = mas[i] / sum;
return vesa;
}
public void Pareto(double[,] ocenki1, double[,] ocenki2)//метод парето
{
int i1, ii1;//номера двух сравниваемых станков первого твида
int i2, ii2;//номера двух сравниваемых станков второго твида
for (int i = 0; i < altSt1.Count-1; i++)
for (int j = i + 1; j < altSt1.Count; j++)
{
//для станков 1-го вида
i1 = Convert.ToInt32(altSt1[i]);
i2 = Convert.ToInt32(altSt1[j]);
//для станков 2-го вида
ii1 = Convert.ToInt32(altSt2[i]);
ii2 = Convert.ToInt32(altSt2[j]);
//сравниваем станки по всем критериям
if (ocenki1[i1, 0] >= ocenki1[i2, 0] && ocenki1[i1, 1] <= ocenki1[i2, 1] && ocenki1[i1, 2] <= ocenki1[i2, 2] && ocenki1[i1, 3] >= ocenki1[i2, 3] &&
ocenki1[i1, 4] >= ocenki1[i2, 4] && ocenki2[ii1, 0] >= ocenki2[ii2, 0] && ocenki2[ii1, 1] <= ocenki2[ii2, 1] &&
ocenki2[ii1, 2] <= ocenki2[ii2, 2] && ocenki2[ii1, 3] >= ocenki2[ii2, 3] && ocenki2[ii1, 4] >= ocenki2[ii2, 4])
{//если вторая сравниваемая альтернатива станков хуже по всем параметрам
altSt1.RemoveAt(j);
altSt2.RemoveAt(j);
}
if (ocenki1[i1, 0] <= ocenki1[i2, 0] && ocenki1[i1, 1] >= ocenki1[i2, 1] && ocenki1[i1, 2] >= ocenki1[i2, 2] && ocenki1[i1, 3] <= ocenki1[i2, 3] &&
ocenki1[i1, 4] <= ocenki1[i2, 4] && ocenki2[ii1, 0] <= ocenki2[ii2, 0] && ocenki2[ii1, 1] >= ocenki2[ii2, 1] &&
ocenki2[ii1, 2] >= ocenki2[ii2, 2] && ocenki2[ii1, 3] <= ocenki2[ii2, 3] && ocenki2[ii1, 4] <= ocenki2[ii2, 4])
{//если первая сравниваемая альтернатива станков хуже по всем параметрам
altSt1.RemoveAt(i);
altSt2.RemoveAt(i);
i = i-1;
}