关于将问题表述为线性程序的问题

时间:2018-12-08 13:37:13

标签: algorithm linear-programming

我遇到以下问题:

我们有180名学生。每个学生都必须选择6门课程之一才能获得学位。一门课程的学生不得超过30名。此外,学生必须指定三门具有不同偏好的课程:pij = [0, 100]
目标是通过以下方式找到学生对课程的分配:

  • 每个学生都被分配到一门课程。
  • 没有一门课程可以容纳30多名学生。
  • 最大限度地提高学生的偏好。

第一个问题是将问题表达为线性程序(LP)。我的表述如下:

最大化\sum_{i, j} x_{i, j} p_{i, j}

必须遵守:

  • x_{i, j} \in { 0, 1 }
  • \sum_{j = 0}^{5} x_{i, j} = 1, \forall i
  • \sum_{i = 0}^{179} x_{i, j} = 30, \forall j

我的说法正确吗?

问题的第二部分如下:

假设我们有一个黑匣子可以解决“最小成本流”问题(https://en.wikipedia.org/wiki/Minimum-cost_flow_problem)。如何使用这个黑匣子解决我们的分配问题?

谢谢

致谢。

1 个答案:

答案 0 :(得分:1)

您的 I nteger 线性规划(ILP)公式并不完全正确,在您的最后一个约束中,您写道所有类都具有完全相同的30名学生,但这是不正确的,一个班级的学生不能超过30名。

因此,公式应类似于:

最大化 ij x ij p ij
适用于:
j x ij = 1,∀i
i x ij ≤30,∀j

关于最大流,您可以将每个学生显示为网络中的一个节点,并且可以将每个班级显示为一个节点,例如对于四个学生和三个班级,图形如下所示:

example network with four students and three classes

这里 s 对学生 s i 的容量为 1 ,因为每个学生都可以在最多的一个选择,所以 c(s,s i )= 1 。一间教室的容量为30,这意味着对于每个 c j 类,它都认为 c(c i ,d)= 30 。此外,每个 s i c j 之间的容量也为1(尽管更大的容量不会使),所以 c(s i ,c j )= 1

在这里,我们在 s i c j 之间的边缘添加“ 成本等于 a(s i ,c j )=-p ij 鉴于收益较高,成本较低。其他边的成本为零,因此 a(s,s i )= a(c j ,d)= 0 。因此,在这里,我们将分配流量(基于每个学生的容纳人数,这样一间教室的总流量少于30),并最小化成本,因此将 -p ij的总和最小化 。给定一个流,使得从源 s 到每个学生 s i 的流为1,那么我们可以给每个学生一个选择,总成本将得到优化。