连续资源列表的优化算法

时间:2011-05-18 19:58:10

标签: algorithm mathematical-optimization

给出1到12的列表,假设我每10分钟使用一个数字,如何最大化接近数字之间的分钟数。

换句话说,最大化列表中每个点的每个值之间的差异。

尝试最大限度地延长n& n + 1,但也是n& n + 2,n& N + 3

1旁边的2是最差的。 12旁边的1将是最好的,但最终会导致更接近列表的数字。

例如,

  • 1 2 3 ...不是最佳的,因为1和2相距仅10分钟。
  • 1 12 2 11 ...不是最佳的,因为1和2相距仅20分钟。
  • 1 5 9 2 6 ...会更优选,因为数字更远。
  • 根据列表中的项目数,是否可以计算出每个Delta之间的最佳Delta?

    2 个答案:

    答案 0 :(得分:4)

    假设集合中的输入值均匀分布,我建议使用以下方法来定义序列。

    逐步执行有序值,每次跳过X个值,其中X被定义为值/ Phi的总数。 假设值集的末尾圈回到开头。

    因此,对于1到12的值集,您将拥有:

    X = 12 / Phi

    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

    +

    ...

    为集合中的每个成员执行此操作并获取总和以获得总体“分数”。 得分越高,序列越“最大化”。

    答案 1 :(得分:3)

    似乎对于任何正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