【发布时间】:2013-06-05 10:31:41
【问题描述】:
需要将 A 级的 23 名学生、B 级的 24 名学生和 C 级的 30 名学生分配到三个班级。 这些类需要几乎完全相同的大小。 不同的级别可以混合到一个类中,但是如果可以避免它会更好。在任何情况下,一个班级的一个级别应该有 0 个学生,或者超过 6 个。
你能帮我解决这个组合优化问题吗?下面是一个示例输入和输出。如果您能告诉我如何解决一般问题,则可以加分!
输入:
pupils = { "A" : 23, "B" : 24, "C": 30 }
示例输出(不是很好!)
Class #1 : {'A': 9, 'B': 6, 'C': 10},
Class #2 : {'A': 10, 'B': 9, 'C': 7},
Class #3 : {'A': 11, 'B': 9, 'C': 6}
编辑:Here 是我非常骇人听闻的、完全无证的、半暴力破解的代码。这很丑陋,但它有效!我很想学习如何编写更优雅的解决方案。
【问题讨论】:
-
您说示例输出“不是很好”。它出什么问题了?为什么其他 25-26-26 拆分会更好?
-
@jwpat7 :正如描述中所解释的,这不是很好,因为三个班级都有三个级别,这对老师来说比较难,最好避免。不过,类应该具有相同大小的约束比这个要强。
-
你现在是怎么解决的?如,您是否使用优化求解器?如果是这样,您的限制和目标是什么?
-
@raoulcousins :不知道更好,我已经开始编写一个半暴力算法(我试图尽快消除不好的选项)。这可能会奏效,但我很想知道是否有更好或更优雅的选择。
-
好的,我会写一个快速优化模型来概括它。你使用什么编程语言?你是如何选择边界 = 6 的?如果您在 N 中的每个级别 i 中都有 N 个级别和 p_i 个学生,那么 = 6 的界限将推广到什么?
标签: algorithm dynamic-programming combinatorics mathematical-optimization linear-programming