- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有一群学生和几位教授。每个学生都需要与其中一位教授进行口试。为此,每个学生都提供一份(有序的)名单,其中包括他希望参加考试的三位教授。当然,每个教授只能进行有限的考试。我可以使用 Kuhn-Munkres 算法来计算将尽可能多的学生分配给他们第一个希望教授的作业。
现在假设每个学生都必须参加两次 考试,因此提供两个愿望 list 。我再次希望将尽可能多的学生分配给他们的第一个希望的教授,但受到限制,即学生不得参加同一位教授的两次考试。
是否有一些算法可以有效地计算最佳分配?也许是 Kuhn-Munkres 算法的推广?还是这个新问题已经是 NP-hard 问题了?可以尝试将什么难题归结为这个问题?
我应该强调,我正在寻找一个精确的解决方案。很容易想到一些启发式方法,例如考虑一种接一种的考试。
最佳答案
您可以使用整数编程将其准确建模为 Assignment Problem.
变量
有 s 个学生和 p 个教授。
决策变量
X_sp is 1 if student s takes an exam with professor p
0 otherwise
Let Limit_p be the number of exams that professor p can handle.
处理学生偏好
我们可以通过成本(目标)来处理每个学生的偏好
Let C_sp be the 'cost' of assigning student s to take an exam with professor p.
随着偏好的降低,我们会逐步提高成本。
C_sp = 1 if p is the *first* preference of s
C_sp = 2 if p is the *second* preference of s
C_sp = 3 if p is the *third* preference of s
...
C_sp = n if p is the *n th* preference of s
配方
案例 1:一次考试
Min (sum over s)(sum over p) C_sp X_sp
subject to:
(sum over p) X_sp = 1 for each student s # Every student must take an exam
(sum over s) X_sp <= Limit_p for each professor p # Every prof can only handle so many exams
X_sp = {0,1} # binary
案例 2:学生参加两次考试
Min (sum over s)(sum over p) C_sp X_sp
subject to:
(sum over p) X_sp = 2 for each student s # Every student must take an exam
(sum over s) X_sp <= Limit_p for each professor p # Every prof can only handle so many exams
X_sp = {0,1} # binary
照顾任何学生都不能参加同一位教授的两次考试
通常,我们必须引入指示变量 Y_sp
来表示学生是否参加了教授p 的考试。然而,在这种情况下,我们甚至不必这样做。 X_sp
是二进制的这一事实将确保没有学生最终参加同一个教授的 2 次考试。
如果学生偏好哪个他们想参加教授的考试,则需要向决策变量添加下标e
。 X_spe
您可以通过匈牙利方法或更简单的任何可用的 LP/IP 求解器实现来解决此问题。
Hungarian algorithm's复杂度为 O(n^3),并且由于我们没有引入任何边约束来破坏完整性属性,线性解将始终是积分的。
更新(一点理论)
为什么解是积分的?要理解为什么解保证是积分的,需要一点理论知识。
通常,当遇到 IP 时,首先想到的是尝试解决线性松弛(忘记整数值要求并尝试。)这将为最小化问题提供下界。通常有一些所谓的复杂约束,使得很难找到整数解。一种解决方法是通过将它们丢给目标函数来松弛它们,并解决更简单的问题(拉格朗日松弛问题。)
现在,如果拉格朗日量的解不会改变您是否具有完整性(就像分配问题的情况一样),那么您总是会得到整数解。
对于那些真正有兴趣了解积分和拉格朗日对偶的人,this reference is quite readable.第 3 节中的示例专门介绍了分配问题。
免费 MILP 求解器: This SO question is quite exhaustive for that.
希望对您有所帮助。
关于algorithm - 计算带有附加约束的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17488978/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!