让和表示有限集,让
有谁知道我如何解决这个问题?
解释:我们将项目分配给存储桶,其中每个存储桶具有有限的容量 (所有项目具有相同的大小),并且在将项目分配给存储桶时有一个值(好处)。
示例:一所学校有几门课程;每个学生只能分配到一门课程;学生对课程有偏好。哪些学生应该分配到哪些课程以最大限度地提高幸福感(总和)?
让和表示有限集,让
有谁知道我如何解决这个问题?
解释:我们将项目分配给存储桶,其中每个存储桶具有有限的容量 (所有项目具有相同的大小),并且在将项目分配给存储桶时有一个值(好处)。
示例:一所学校有几门课程;每个学生只能分配到一门课程;学生对课程有偏好。哪些学生应该分配到哪些课程以最大限度地提高幸福感(总和)?
正如其他人所指出的,只要您的目标函数是线性的,您的问题就是混合整数线性规划的特例。(如果您的目标函数不是线性的,那么它将是一个混合整数非线性程序,我将在下面提出不同的建议。)
我的建议是使用像GAMS(小问题免费试用版)、AMPL(小问题免费试用版)、PuLP(Python,免费)、Coopr(Python,免费)、OSI(C++,免费)这样的软件包,或YALMIP(MATLAB,免费)而不是直接求解器接口,除非您非常清楚要为您的应用程序使用的求解器(并且您可能希望强制潜在用户使用)。
所有这些软件包都更侧重于对您的问题进行建模,并为多个免费和非免费混合整数编程求解器提供接口,这使您可以更自由地尝试选择求解器和高级参数,但代价是速度和记忆力。这种方法还为您提供了相当大的灵活性来尝试替代公式和更高级别的算法(例如 Bender 分解、Dantzig-Wolfe 分解等),求解器不会通过启发式方法为您尝试。(混合整数规划求解器倾向于更多地关注用于生成切割平面、生成额外有效约束和探索分支定界树的启发式算法。)
一旦确定了公式,并且对应用程序的速度和内存要求有所了解,您就可以决定在众多混合整数线性规划求解器中进行选择以解决您的问题。此外,这些求解器中有许多具有多种语言界面。同样,多种因素(便利性、熟悉度、性能要求、项目截止日期)会影响您对语言的选择。
特别值得注意的是COIN集合中的免费开源求解器( CBC、SYMPHONY、BCP等)、GLPK、SCIP和LPSOLVE,以及闭源专业软件包CPLEX和Gurobi。您还可以找到一个求解器,该求解器利用了您在上面编写的混合整数线性程序实例的结构。
专业软件包往往比开源求解器快得多,但专业软件包对于非学术人员来说也很昂贵。对于 CPLEX 和 Gurobi,如果您在学术机构,则可以免费获得全功能许可证;这些将使您能够解决非常大的问题实例。CPLEX 和 Gurobi 争夺“最快(混合整数)线性规划求解器”的称号,无论这意味着什么。根据问题结构,自由求解器还可以处理较大的实例;例如,我使用免费求解器来解决具有几千个二进制变量和几千个约束的问题。