Нахождение парето-оптимальных точек - C#

Узнай цену своей работы

Формулировка задачи:

Ребят такая проблема не могу придумать алгоритм решения. Постараюсь объяснить подробно что нужно имеются несколько заполненных массивов.
double A = new double[N];
double B = new double[N];
double C = new double[N];
double D = new double[N];
double E = new double[N];
double F = new double[N];
double G = new double[N];
double H = new double[N];
для решения нужен всего один метод который будет принимать можно даже двумерный массив или как кому удобнее будет. Вообщем чтобы было удобнее представить то N это определенное число строк если перевернуть выше заданные массивы. Для примера предположим что N мы задали 3 тогда получится что есть 8 массивов длинною 3, но для простоты мы перевернули и получилось что то вроде: j1[0] j1[1] j1[2] j1[3]...j1[8]; j2[0] j2[1] j2[2] j2[3]...j2[8]; j3[0] j3[1] j3[2] j3[3]...j3[8]; то есть если мы задали N =3 то строк 3 а столбцов всегда 8 и количество столбцов не именно. можно представить что эти массивы это координаты точек, но они не должны повторятся то есть если у нас N = 3 значит 3 массива а для координат нужна пара чисел, то есть j1[0] и j2[0] это пара чисел и координаты одной точки. и так нужно сделать для всего списка пар массивов то есть:
for(int i=0;i<8;i++)
{
array[i] = j1[i] + j2[i]
}
заметим что нельзя чтобы были координаты разных индексов тоесть j1[0] и j2[3] и так же нельзя чтобы пары массивов повторялилсь. то есть если есть j1 и j2 то нельзя чтобы так же еще раз считалось например j2 и j1. Дальше для каждую такую парру как было написано выше нужно сложить и наверное для удобства лучше сумму поместить в отдельный массив и в отдельном массиве уже проще найти наименьшую сумму этих координат. для примера если N=3 и тогда нам нужно всего 3 массива
for(int i=0;i<8;i++)
{
array1[i] = j1[i] + j2[i]
}
for(int i=0;i<8;i++)
{
array2[i] = j1[i] + j3[i]
}
for(int i=0;i<8;i++)
{
array3[i] = j2[i] + j3[i]
}
 
array.Min();
array.Min();
array.Min();
И этот метод должен вернуть мне эти минимальные значения например в двумерном массиве или в DataTable это не важно. Если N = 3 то таких пар всего 3, а если например N =5 то таких пар будет уже 5 и тут не прописать уже вручную все варианты. Так же сложность в том, что не должно быть повторений пар массивов и не считались сами с собой. Так же сложность в том чтобы объявить N число массивов(самое простое из сложностей). Для удобства в решении предлагаю представить вам что метод принимает двумерный массив из N строк и 8 столбцов Mass[n,8] вернуть нужно минимальные суммы и их названия строк в виде j1,j2..jn и так как считаются суммы одного индекса то этот индекс тоже должен присутствовать. Чтобы знать чьи координаты являются минимальными. Прошу помощи задание выглядит сложно не кто не может из моих знакомых помочь, а это нужно для диплома. Если будет проще понять то эти отношения по сути выводятся на график и Парето-Оптимальное то которое ближе всех к нулю(отрицательных значений быть не может). И такое таких парето оптимальных ровно столько сколько может быть разных пар массивов в примере всего 3 таких графика и естественно 3 значения ближайшие к 0 и будут решением

Решение задачи: «Нахождение парето-оптимальных точек»

textual
Листинг программы
private void Foo(DataTable dt)
{
    var hs = new HashSet<DataColumn>();
 
    // Перебираем все пары строк
    for (int i = 0; i < dt.Rows.Count - 1; i++)
    {
        for (int j = i + 1; j < dt.Rows.Count; j++)
        {
            // И запоминаем все колонки в которых меньшая сумма
            foreach (var column in Bar(dt, i, j))
                hs.Add(column);
        }
    }
 
    // Удаляем лишние колонки:
    for (int i = dt.Columns.Count - 1; i >= 0; i--)
    {
        if (!hs.Contains(dt.Columns[i]))
            dt.Columns.RemoveAt(i);
    }
}
 
IEnumerable<DataColumn> Bar(DataTable dt, int a, int b)
{
    // Найдем минимум сумм
    double minValue = 0;
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        double value = (double)dt.Rows[a][i] + (double)dt.Rows[b][i];
        if (i == 0 || minValue > value)
        {
            minValue = value;
        }
    }
 
    // Вернем все столбцы которые дают минимальную сумму
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        double value = (double)dt.Rows[a][i] + (double)dt.Rows[b][i];
        if (minValue == value) yield return dt.Columns[i];                    
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы