Реализация алгоритма Парето на C#


Закончил работу над интересным заказом по решению вопроса оптимального выбора. С разрешения заказчика публикую этот материал, основная часть практической работы.

Задача:

Разработать программу на основе алгоритма нахождения множества Парето. Язык: С++, С#, Python (можно любой из перечисленных, но предпочтителен С++). Число критериев m=4:
  1. Производительность технологического процесса (ТП) – Тшт.к. (время штучно-калькуляционное время) (минут);
  2. Количество операций ТП – N;
  3. Количество задействованного оборудования (станков) – S;
  4. Количество задействованной технологической оснастки – O.
Все критерии подлежат минимизации.


Сначала напомню про семь шагов алгоритма Парето:

Шаг 1. Положить P(Y) =Y , i =1, j = 2 . Тем самым образуется так называемое текущее множество парето-оптимальных векторов, которое в начале работы алгоритма совпадает с множеством Y , а в конце − составит искомое множество парето-оптимальных векторов. Алгоритм устроен таким образом, что искомое множество парето-оптимальных векторов получается из Y последовательным удалением заведомо неоптимальных векторов.
Шаг 2. Проверить выполнение неравенства y(i) ≥ y( j) . Если оно оказалось истинным, то перейти к Шагу 3. В противном случае перейти к Шагу 5.
Шаг 3. Удалить из текущего множества векторов P(Y) вектор y( j), так как он не является парето-оптимальным. Затем перейти к Шагу 4.
Шаг 4. Проверить выполнение неравенства j < N . Если оно имеет место, то положить j = j +1 и вернуться к Шагу 2. В противном случае – перейти к Шагу 7.
Шаг 5. Проверить справедливость неравенства y( j) ≥ y(i) . В том случае, когда оно является истинным, перейти к Шагу 6. В противном случае – вернуться к Шагу 4.
Шаг 6. Удалить из текущего множества векторов P(Y) вектор y(i) и перейти к Шагу 7.
Шаг 7. Проверить выполнение неравенства i < N -1. В случае истинности этого неравенства следует последовательно положить i = i +1 , а затем j = i +1. После этого необходимо вернуться к Шагу 2. В противном случае(т.е. когда i ≥ N -1) вычисления закончить. К этому моменту множество парето-оптимальных векторов построено полностью.
Источник: В.Д. Ногин "Принятие решений при многих критериях. Учебно-методическое пособие".

Основная задача заключается именно в том, чтобы запрограммировать данный алгоритм. Вот листинг программы:

 //шаг 1
int i = 1;
int j = 2;
int N = Convert.ToInt32(numericUpDown1.Value); //количество вариантов технологических процессов
Boolean flag = true;//флаг завершения процесса отбора вариантов
...
do
            {
                //шаг 2
                if (sr(myArr[j], myArr[i]))
                {

                    //шаг 3
                    mass[i] = 0;

                    //шаг 4
                    if (j < N)
                    {
                        j = j + 1;
                    }

                    else
                    {
                        //шаг 7

                      
                    }
                }

                else
                {
                    //шаг 5 

                    if (sr(myArr[i], myArr[j]))
                    {
                        //шаг 6
                     

                        //шаг 7

                       
                    }
                    else
                        //шаг 4
                        if (j < N)
                        {
                            j = j + 1;
                        }

                        else
                        {
                            //шаг 7
                            
                        }
                }
            }

while (flag);

Я выбрал цикл do...while, так как у цикла всегда будет хотя бы один проход. Здесь все шаги расписаны, все как по алгоритму. Метод sr() в коде сравнивает значения массивов – его требуется писать индивидуально под каждую задачу, зависит от числа критериев и от максимизации (минимизации). Код неполный - шагов 6 и 7 нет!



На самом деле я считаю, что данная реализация – это не самый оптимальный способ решения данной задачи, хотя бы по количеству строк кода. Но это решение выбрано в связи с тем, что оно максимально приближено к алгоритму – как и требуется в задаче.

Итак, если вам требуется сделать практическую работу по программированию на C#, C++, Java, PHP, то вы смело можете обращаться ко мне. Пишите на почту, в скайп или обращайтесь сразу вконтакте.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, алгоритмы




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Непрерывная передача данных с EventSource
Ошибки подключения FileZilla
Алгоритм двоичного поиска