Многокритериальная оптимизация

Автор работы: Пользователь скрыл имя, 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;

                    }

 

                }

        }

       

        public ArrayList MAI(double[,] ocenki1, double[,] ocenki2, double[] vesa, double[,] texnXarakter1, double[,] texnXarakter2)//метод МАИ

        {

            ArrayList sum = new ArrayList();

            double tempEnergoef;

            double tempStoimost;

            double tempProizvod1;

            double tempProizvod2;

            for (int i = 0; i < altSt1.Count; i++)

            {

                tempEnergoef = texnXarakter1[0, Convert.ToInt32(altSt1[i])] * timeM * texnXarakter1[2, Convert.ToInt32(altSt1[i])] +

                           texnXarakter2[0, Convert.ToInt32(altSt2[i])] * timeM * texnXarakter2[2, Convert.ToInt32(altSt2[i])];

                tempStoimost = texnXarakter1[1, Convert.ToInt32(altSt1[i])] + texnXarakter2[1, Convert.ToInt32(altSt2[i])];

                tempProizvod1 = texnXarakter1[0, Convert.ToInt32(altSt1[i])] * timeM;

                tempProizvod2 = texnXarakter2[0, Convert.ToInt32(altSt2[i])] * timeM;

                //проверка на соответсвие ограничениям

                if (tempEnergoef <= moshnost && tempStoimost <= cena &&

                                    tempProizvod1 >= count / 12 && tempProizvod2 >= count / 12)

Информация о работе Многокритериальная оптимизация