寻找所有可能和独特的组合

时间:2014-04-05 12:49:19

标签: algorithm scala functional-programming

我想使用Scala解决简单的资源分配问题 我现在拥有的是能够执行此任务的任务和资源列表:

val t1 = List(1, 2)
val t2 = List(2, 3, 4)
val t3 = List(0)
val t4 = List(1, 4)

其中t只是任务而列表代表资源ID。让我们假设我可以将任务ID与资源ID结合起来:

val a1 = List((1, 1), (1, 2))
val a2 = List((2, 2), (2, 3), (2, 4))
val a3 = List((3, 0))
val a4 = List((4, 1), (4, 4))

其中a表示特定任务的分配。

所以下一步是收集所有作业并将它们平放在一个列表中:

val assignments = List((1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 0), (4, 1), (4, 4))

我想要的是所有可能的组合,其中包含每个任务ID不同的分配列表。

val result1 = List((1, 1), (2, 3), (3, 0), (4, 4))
val result2 = List((1, 2), (2, 2), (3, 0), (4, 1))
...

我该怎么做?

1 个答案:

答案 0 :(得分:2)

任务数量是否固定为4?如果是这样的话非常简单:

val t1 = List(1, 2)
val t2 = List(2, 3, 4)
val t3 = List(0)
val t4 = List(1, 4)

val as = for {
  a1 ← t1
  a2 ← t2
  a3 ← t3
  a4 ← t4
} yield List((1,a1), (2, a2), (3, a3), (4, a4))

as foreach println

输出是:

List((1,1), (2,2), (3,0), (4,1))
List((1,1), (2,2), (3,0), (4,4))
List((1,1), (2,3), (3,0), (4,1))
List((1,1), (2,3), (3,0), (4,4))
List((1,1), (2,4), (3,0), (4,1))
List((1,1), (2,4), (3,0), (4,4))
List((1,2), (2,2), (3,0), (4,1))
List((1,2), (2,2), (3,0), (4,4))
List((1,2), (2,3), (3,0), (4,1))
List((1,2), (2,3), (3,0), (4,4))
List((1,2), (2,4), (3,0), (4,1))
List((1,2), (2,4), (3,0), (4,4))