Алгоритм оптимизации для списка последовательных ресурсов

Учитывая список от 1 до 12, предполагая, что я использую каждое число каждые 10 минут, как мне увеличить количество минут между близкими числами.

Другими словами, увеличьте разницу между каждым значением в каждом месте списка.

Попытка максимизировать время между n & n + 1, но также n & n + 2 и n & n + 3

1 рядом с 2 - худшее. 1 рядом с 12 было бы лучше всего, однако это привело бы к тому, что в конце списка были бы более близкие числа.

For example,

  • 1 2 3 ... Не было бы оптимальным, потому что 1 и 2 находятся всего в 10 минутах друг от друга.
  • 1 12 2 11 ... Не было бы оптимальным, потому что 1 и 2 находятся всего в 20 минутах друг от друга.
  • 1 5 9 2 6 ... Было бы предпочтительнее, потому что числа находятся дальше друг от друга.
  • Существует ли оптимальная разница между каждым из них, которую можно было бы вычислить с учетом количества элементов в списке?


    person Professional Sounding Name    schedule 18.05.2011    source источник
    comment
    Возникает вопрос: как увеличить количество минут между каждым последовательным числом?   -  person jball    schedule 19.05.2011
    comment
    да. Спасибо, что разъяснили это.   -  person Professional Sounding Name    schedule 19.05.2011
    comment
    ... и вы пытаетесь максимизировать сумму количества минут между каждой парой последовательных чисел (даже если некоторые последовательные числа могут быть очень близкими), или вы пытаетесь максимизировать наименьший такой разрыв в последовательности (в других словами, стараясь сделать количество минут между каждой последовательной парой как можно более равномерным)?   -  person Aasmund Eldhuset    schedule 19.05.2011
    comment
    Извините, я не совсем понял и не знаю, как это правильно сформулировать, может, вы мне поможете. Это должно применяться не только к последовательным диапазонам, но и к попытке найти последовательность с наибольшим различием между всеми числами, поэтому 1, 3, 5 могут быть не оптимальными, потому что 1 и 3 все еще ближе друг к другу, где 1, 5, 9 , 2, 6, 10 ... было бы лучше.   -  person Professional Sounding Name    schedule 19.05.2011
    comment
    пытаясь максимизировать время между n и n + 1, но также между n и n + 2 и n и n + 3   -  person Professional Sounding Name    schedule 19.05.2011


    Ответы (2)


    Предполагая, что входные значения в наборе равномерно распределены, я бы рекомендовал использовать следующий подход для определения последовательности.

    Перебирайте упорядоченные значения, каждый раз перескакивая на X значений, где X определяется как общее количество значений / Phi. Представьте, что конец набора значений возвращается к началу.

    Итак, для набора значений от 1 до 12 у вас будет:

    X = 12 / Фи

    X = 12 / 1.618 = 7.4

    Округлите 7,4 до ближайшего целого числа, поэтому предположим, что X = 7.

    Тогда ваша последовательность будет 1, 8, 3, 10, 5, 12, 7, 2, 9, 4, 11, 6.

    Чтобы количественно оценить (или оценить), насколько "максимизирована" эта последовательность, вы должны взять сумму следующих вычислений для КАЖДОГО члена в наборе.

    Для КАЖДОГО элемента набора вычислите абсолютное значение разницы в «значении» между ним и каждым другим элементом, деленное на это «расстояние» до этого элемента. Например, для члена 8 в приведенной выше последовательности его оценка будет:

    8,1 = |8-1| / 1 = 8

    +

    8,3 = |8-3| / 1 = 5

    +

    8,10 = |8-10| / 2 = 1

    +

    8,5 = |8-5| / 3 = 1

    +

    8,12 = |8-12| / 4 = 1

    +

    ...

    Сделайте это для каждого члена набора и возьмите сумму, чтобы получить общий «балл». Чем выше оценка, тем более «развернутой» будет последовательность.

    person bdiloreto    schedule 19.05.2011
    comment
    +1 Кажется, это дает отличные результаты. Возможно, вы захотите подробнее рассказать, почему используется золотое сечение (en.wikipedia.org/wiki/Golden_ratio) - отличная стратегия для определения последовательного приращения. - person Simen S; 19.05.2011

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

    С 1-12 у нас есть 1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12. Между последовательными числами есть расстояние в час.

    Реализация (Ruby)

    def optimize_resources(n)
      answer = Array.new(n)
      for i in 1..n
        if i % 2 == 1
          answer[(i - 1) / 2] = i
        else
          answer[(n - 1) / 2 + i / 2] = i
        end
      end
      answer
    end
    
    person Peteris    schedule 18.05.2011
    comment
    Мне это тоже кажется правильным, хотя я не уверен, почему. +1 если сможешь это доказать. - person Aasmund Eldhuset; 19.05.2011
    comment
    Конечно, мы не можем сделать лучше, чем час для всего. Даже если мы ослабим задачу оптимизации расстояний между парами 1-2, 3-4, 5-6 и т. Д. Скажем, 1-2 - это 7 интервалов. Затем в середине есть 6 пустых слотов, но у нас осталось только 5 пар, поэтому фактически в слот войдут два числа из одной пары. Следовательно, мы получим расстояние не более пяти. - person Peteris; 19.05.2011
    comment
    Однако голосование «за» - это не совсем тот ответ, который я искал. Я хочу, чтобы между каждым числом было наибольшее расстояние, поэтому предпочтительнее 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12. - person Professional Sounding Name; 19.05.2011