现有的调度问题算法?

时间:2013-05-03 01:05:36

标签: java algorithm constraints linear-programming

假设我想构建一个能够在一周内正确安排三个总线驱动程序的功能,并具有以下限制:

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

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

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

1) Backtracking algorithm (brute force)
2) Genetic algorithm
3) Constraint programming
坦率地说,这些对我来说都是“文化冲击”,因为我过去从未学过任何一种线性编程。我想知道两件事:

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

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

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

2 个答案:

答案 0 :(得分:3)

1)我同意蛮力不好。

2)你的问题是一个整数问题。它们可以通过线性编程来解决。

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

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

4)解决这个问题的标准方法是将一个线性程序嵌入分支&绑定搜索树。关于它的文献很多。该程序概述如下:

  1. 使用Simplex算法解决线性程序
  2. 找到分支的小数变量。即x = 1.5
  3. 创建两个新节点并分别添加约束x< = 1和x> = 2
  4. 进入一个节点(通过某种策略选择)
  5. 转到第1点
  6. 此外,在树中的每个节点上,在第1点之后,算法会检查是否可以修剪节点。这意味着要停止从此节点“更深入”搜索,因为

    a)问题变得不可行了,

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

    c)找到整数解。该解决方案的该目标值用于确定点b。

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

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

答案 1 :(得分:2)

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

现在回到比较中:

  1. 蛮力:最差。

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

  3. 约束编程:在这种情况下绝对是最好的(并且在很多离散的优化问题中)。在IBM ILOG CPLEX解算器中有一个超级高效的实现(但它不是免费的,它可以免费用于学术界或测试)。