algorithm - 关于将问题表述为线性规划的问题
问题描述
我有以下问题:
我们有180名学生。每个学生都必须选择 6 门课程中的一门才能获得学位。任何课程的学生人数不得超过 30 人。此外,学生必须指定三门具有不同偏好的课程:。
目标是通过以下方式为学生分配课程:
- 每个学生都被分配到一门课程。
- 没有任何课程的学生人数超过 30 人。
- 最大化学生偏好的总和。
第一个问题是将问题表述为线性规划 (LP)。我的配方如下:
最大化,
受制于:
- .
- .
- .
我的配方正确吗?
问题的第二部分如下:
假设我们有一个解决最小成本流问题的黑匣子(https://en.wikipedia.org/wiki/Minimum-cost_flow_problem)。如何使用这个黑匣子来解决我们的赋值问题?
谢谢,
问候。
解决方案
您的整数线性规划 (ILP) 公式并不完全正确,在您的最后一个约束中,您写道所有班级正好有 30 名学生,但这是不正确的,一个班级不能有超过 30 名学生。
所以公式应该是这样的:
最大化∑ ij x ij p ij
服从:
∑ j x ij =1, ∀i
∑ i x ij ≤30, ∀j
至于最大流,您可以将每个学生表示为网络中的一个节点,将每个班级表示为一个节点,例如对于四个学生和三个班级,图表如下所示:
这里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,那么我们就可以给每个学生一个选择,总成本就会得到优化。
推荐阅读
- ios - 将 PNG 图像从 Firestore 设置为 UIImage.image --- Swift
- r - 在R闪亮中绘制填充颜色透明度
- python - pyqt5 在 QGraphicsScene 上使用按钮绘制线条
- r - 在r闪亮中为数据表中的元素创建超链接
- file-upload - Jmeter:二进制文件上传失败,出现 500 内部服务器错误
- python - Python - 将项目添加到字典列表的前面
- mysql - 有没有办法在 SQL 查询中将列分类为“始终为空”或“不包含空值”?
- python - 上传后如何在 Django 中显示图像?
- mongodb - 获取 MongoParseError:无效的消息大小:1347703880,允许的最大值:67108864
- selenium - 当我使用 Selenium Webdriver 测试 Salesforce Lightning 时,如何绕过登录页面?