Ruby 哪种算法以固定顺序排列一组具有不同数量的作业?

Ruby 哪种算法以固定顺序排列一组具有不同数量的作业?,ruby,math,scheduling,Ruby,Math,Scheduling,示例 考虑到需要在一个月的期间完成的不同任务类型: Type | Number per month -------------------------- A | 1 B | 5 C | 30 D | 15 E | 20 -------------------------- 71 问题: 如何生成类型的平面顺序(一维数组),以确保 71项工作在一个月内完成 这些类型的分布尽可能均匀(ABAB而不是AABB) 编辑: 评论

示例

考虑到需要在一个月的期间完成的不同任务类型

Type  |  Number per month
--------------------------
A     |  1
B     |  5
C     |  30
D     |  15
E     |  20
--------------------------
         71
问题:

如何生成类型的平面顺序(一维数组),以确保

  • 71项工作在一个月内完成
  • 这些类型的分布尽可能均匀(ABAB而不是AABB)
编辑:

评论中提出的一个想法是:

可能会将每个类型堆栈的大小减少一个数量 比使用1的绝对量要好。A:2,B:10结果 因为B是A的五倍大


符号:你有一个X= {x1,…xk},其中席在输出CI时间中需要出现。 像这样的东西应该可以做到: 设C为c1+c2..+ck(示例中为71)。 计算每个项目的步幅:si=C/ci。 计算每个项目的暂定位置,并列出(位置、项目): locs_i=(si,i),(2*si,i)。。。(c_i*si,i)


按字典顺序合并locs_i列表

假设您有一系列任务类型,例如:

types = [[:A,1],[:B,5],[:C,6],[:D,2],[:E,3]]
您可以先排序,然后使用较大的数字作为参考点来构建任务数组

例如:

types = [[:A,1],[:B,5],[:C,6],[:D,2],[:E,3]]
tasks=[]; i=0

asc = types.sort {|a,b| a[1] <=> b[1] }
max = asc[types.length-1][1]

(1..max).to_a.each do |i|
    types.each {|t| tasks << t[0] if t[1] >= i}
end

puts tasks.inspect

输入是什么?那个ascii表或者它可以是一个散列,例如?谢谢!然而,当一种类型比其他类型有更多的任务需要完成时,仍然存在一个问题:
类型=[:a,1],:B,2],:C,15],:D,2],:E,3],
返回
[:a,:B,:C,:D,:E,:B,:C,:D,:E,:C,:E,:C,:C,:C,,:C],
('C's在末尾累积)我不明白问题出在哪里。它们是由于15℃而累积起来的。您不想打印任务类型中指示的那么多任务吗?而不是
abcabcccccc
顺序
acbcccc
将是一个更平等的分布。我试图找到尽可能公平的分配,因为这是最重要的。也许将每个类型堆栈减少一个相对于其大小的数量比使用绝对数量1要好。例如,
A:2
B:10
导致“对于每个
A
取5
B
”,因为B比A大五倍。你怎么看?对不起,我真的不明白你说的平均分布是什么意思。无法改进我的答案。与其在一个地方有许多相同的类型,不如将它们分散在整个列表中。查看
ACBCCC
acbcc
之间的区别在哪里?后者更均匀地分布,而前者在一个地方有太多的C。
[:A, :B, :C, :D, :E, :B, :C, :D, :E, :B, :C, :E, :B, :C, :B, :C, :C]