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)
符号:你有一个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
取5B
”,因为B比A大五倍。你怎么看?对不起,我真的不明白你说的平均分布是什么意思。无法改进我的答案。与其在一个地方有许多相同的类型,不如将它们分散在整个列表中。查看ACBCCC
和acbcc
之间的区别在哪里?后者更均匀地分布,而前者在一个地方有太多的C。
[:A, :B, :C, :D, :E, :B, :C, :D, :E, :B, :C, :E, :B, :C, :B, :C, :C]