【问题标题】:Existing Algorithm for Scheduling Problems?现有的调度问题算法?
【发布时间】:2013-04-27 08:03:26
【问题描述】:

假设我想构建一个函数,可以在一周内正确安排三个公交车司机开车,但有以下限制:

  • 每位司机每周驾驶次数不得超过五次
  • 每天必须有两个司机开车
  • 他们每周休息一天(不会与其他司机的休息日冲突)

什么样的算法可以用来解决这样的问题?

我浏览了几个网站,发现了这些:

1) Backtracking algorithm (brute force)
2) Genetic algorithm
3) Constraint programming

坦率地说,这些对我来说都是“文化冲击”,因为我过去从未学习过任何类型的线性编程。我想知道两件事:

1) 哪种算法最适合上述情况?

2) 解决这个问题的最简单算法是什么?

3) 请建议我可以研究的任何其他算法来解决上述问题。

【问题讨论】:

  • 我对第三个约束有点困惑。每个司机开车不超过五天这一事实是否意味着他们每周至少休息两天?每天必须有两个司机这一事实意味着最多一个人可以在某一天休息。第三个约束在这里似乎是多余的。
  • 有时需要冗余约束以更快地减少可能的解决方案集。
  • 您想将问题解决到最优还是接近最优(启发式选择的解决方案)就足够了?

标签: java algorithm constraints linear-programming


【解决方案1】:

首先这是一个离散优化问题,所以线性规划可能不是一个好主意(因为它是为了连续优化)。您仍然可以使用线性规划来解决这个问题(它将变成一个整数或混合整数程序),但这是指数级的(如果您的输入大小很小,那么它是可以的)。

现在回到比较:

  1. 蛮力:最差。

  2. 遗传:不能保证最优。算法可能无法解决问题。

  3. 约束规划:在这种情况下绝对是最好的(在许多离散优化问题中)。在 IBM ILOG CPLEX 求解器中有一个超级高效的实现(但它不是免费的,它对学术界或测试是免费的)。

【讨论】:

  • 两个小时内都可以实现吗?
  • 实现一般情况很难,但针对您的特定问题,所有这些都可以在 2 小时内实现。
  • 在这种情况下,我不能同意约束规划 (CP) 比混合整数规划 (MIP) 更好的说法。你谈到的所有算法都是指数级的,包括 CP,而且 CP 实现通常比 MIP 效率低,尤其是 CPLEX 。如今,所有现实世界的调度问题都可以用 MIP 解决,即使是最复杂的问题(使用复杂的分解算法,但“核心”仍然是 MIP),恕我直言,MIP 显然是解决问题的方法。当然,从头开始实施(!)更难,您需要使用其中一种...
  • ...高效实施。但是如果问题的大小是合理的,像 GLPK 或 COIN-OR 这样的免费实现就可以了。此外,您可以使用建模语言(请参阅 GLPK 手册),因此您基本上只需将约束写入文本文件并在其上运行外部程序。现在,如果这是某种家庭作业,而您必须自己编写算法,事情就不同了。最后,在两个小时内实现一个高效的 CP 算法听起来非常乐观,充其量是(即使是针对特定问题)。
  • 是的,我同意我将 MIP 与 CP 的比较是不正确的。 CP确实是指数级的难。让我修改一下我的答案,如果您使用其中一个求解器,那么 MIP 或 CP 都可以,但是如果您想实现该算法,我认为 CP 将是一种更容易实现的算法。我最初的答案仍然适用于最初的 3 个选项,CP 比蛮力和遗传更好。
【解决方案2】:

1) 我同意蛮力是不好的。

2) 你的问题是一个整数问题。不过,它们可以通过线性规划来解决。

3) 您可以区分 2 种不同的方法:启发式方法和精确方法。 启发式在合理的计算时间内提供了很好的解决方案。当对计算时间有严格要求或者问题太难计算出最优解时,就会使用它们。遗传算法是一种启发式算法。

由于您的问题比较简单,您可能会采用精确的方法。

4) 精确解决这个问题的标准方法是将线性规划嵌入到分支定界搜索树中。有很多关于它的文献。该过程可以概括如下:

  1. 使用单纯形算法求解线性规划
  2. 找到一个用于分支的小数变量。 IE。 x=1.5
  3. 创建两个新节点并分别添加约束 x=2
  4. 进入一个节点(通过某种策略选择)
  5. 转到第 1 点

此外,在树中的每个节点上,在点 1 之后,算法会检查是否可以修剪节点。这意味着停止从该节点开始搜索“更深”,因为

a) 问题变得不可行,

b) 已经存在更好的解决方案,

c) 找到一个整数解。该解的这个客观值用于确定b点。

当所有节点都被修剪时,该过程结束。

幸运的是,正如 Nicolas 所说,有免费的实现可以做到这一点。您所要做的就是创建您的模型。在一些工具中编码它的目标和约束并让它解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多